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

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

Controlling Players and Characters(38)

Coming up is a huge collection of functions you use to retrieve and set the specific
information about a character (related to the artificial intelligence functionality or
actions):

    cCharIcs* get_char_ics(long id)
    {
        sCharacter* character;

        
if((character = get_char(id)) == NULL)
            
return NULL;

        
return character->char_ics;
    }

    
void set_char_lock(long id, bool is_lock)
    {
        sCharacter* character;

        
if((character = get_char(id)) != NULL)
            character->is_lock = is_lock;
    }

    
void set_char_lock_timer(long id, long action_timer)
    {
        sCharacter* character;

        
if((character = get_char(id)) != NULL)            
            character->action_timer = action_timer;
    }

    
void set_char_type(long id, long type)
    {
        sCharacter* character;

        
if((character = get_char(id)) != NULL)
            character->type = type;
    }

    
long get_char_type(long id)
    {
        sCharacter* character;

        
if((character = get_char(id)) == NULL)
            
return 0;

        
return character->type;
    }

    
void set_char_ai(long id, long ai)
    {
        sCharacter* character;

        
if((character = get_char(id)) != NULL)
            character->ai = ai;
    }

    
long get_char_ai(long id)
    {
        sCharacter* character;

        
if((character = get_char(id)) == NULL)
            
return 0;

        
return character->ai;
    }

    
void set_char_distance(long id, float dist)
    {
        
// set evade/follow distance

        sCharacter* character;

        
if((character = get_char(id)) != NULL)
            character->distance = dist;
    }

    
float get_char_distance(long id)
    {
        
// get evade/follow distance

        sCharacter* character;

        
if((character = get_char(id)) == NULL)
            
return 0.0f;

        
return character->distance;
    }

    
void set_char_route(long id, long num_points, const sRoutePoint* route)
    {
        sCharacter* character;
        
if((character = get_char(id)) == NULL)
            
return;

        
// free old route
        delete[] character->route;
        character->route = NULL;

        
// set new route
        if((character->num_points = num_points) != 0)
        {
            character->route = 
new sRoutePoint[num_points];
            memcpy(character->route, route, num_points * 
sizeof(sRoutePoint));

            character->cur_point = 0;
        }
    }

    
void set_char_script(long id, const char* script_filename)
    {
        sCharacter* character;
        
        
if((character = get_char(id)) != NULL)
            strcpy(character->script_filename, script_filename);
    }

    
char* get_char_script(long id)
    {
        sCharacter* character;
        
if((character = get_char(id)) == NULL)
            
return NULL;

        
return character->script_filename;
    }

    
void set_update_enable(long id, bool update_enable)
    {
        sCharacter* character;

        
if((character = get_char(id)) != NULL)
            character->update_enable = update_enable;
    }

    
bool get_update_enable(long id)
    {
        sCharacter* character;

        
if((character = get_char(id)) == NULL)
            
return false;

        
return character->update_enable;
    }

    
void move_char(long id, float pos_x, float pos_y, float pos_z)
    {
        sCharacter* character;

        
if((character = get_char(id)) != NULL)
        {
            character->pos_x = pos_x;
            character->pos_y = pos_y;
            character->pos_z = pos_z;
        }
    }

    
void get_char_position(long id, float* pos_x, float* pos_y, float* pos_z)
    {
        sCharacter* character;

        
if((character = get_char(id)) != NULL)
        {
            
if(pos_x)   *pos_x = character->pos_x;
            
if(pos_y)   *pos_y = character->pos_y;
            
if(pos_z)   *pos_z = character->pos_z;
        }
    }

    
void set_char_bound(long id,
                        
float min_x, float min_y, float min_z,
                        
float max_x, float max_y, float max_z)
    {
        sCharacter* character;

        
if((character = get_char(id)) != NULL)
        {
            character->min_x = min(min_x, max_x);
            character->min_y = min(min_y, max_y);
            character->min_z = min(min_z, max_z);
            character->max_x = max(min_x, max_x);
            character->max_y = max(min_y, max_y);
            character->max_z = max(min_z, max_z);
        }
    }

    
void get_char_bound(long id,
                        
float* min_x, float* min_y, float* min_z,
                        
float* max_x, float* max_y, float* max_z)
    {
        sCharacter* character;

        
if((character = get_char(id)) != NULL)
        {
            
if(min_x)   *min_x = character->min_x;
            
if(min_y)   *min_y = character->min_y;
            
if(min_z)   *min_z = character->min_z;
            
if(max_x)   *max_x = character->max_x;
            
if(max_y)   *max_y = character->max_y;
            
if(max_z)   *max_z = character->max_z;
        }
    }

    
void set_target_char(long id, long target_id)
    {
        sCharacter* character;
        
if((character = get_char(id)) == NULL)
            
return;

        
if(target_id == -1)
            character->target_char = NULL;
        
else
        {
            sCharacter* target_char;

            
for(target_char = m_root_char; target_char != NULL; target_char = target_char->next)
            {
                
if(target_char->id == target_id)
                {
                    character->target_char = target_char;
                    
break;
                }
            }

            
// clear target if not found in list
            if(target_char == NULL)
                character->target_char = NULL;
        }
    }

    
void set_char_action(sCharacter* character, long action, long action_timer)
    {
        
if(character == NULL)
            
return;

        
// make sure attack, spell, and item supporting charge.
        if(action == CHAR_ATTACK || action == CHAR_SPELL || action == CHAR_ITEM)
        {
            
if(character->charge < 100.0f)
                
return;
        }

        character->action = action;
        play_action_sound(character);

        
long mesh_index = character->char_def.mesh_index;

        
// set action timer
        if(action_timer == -1)
            character->action_timer = 1;
        
else
        {
            
ulong anim_length = m_mesh_anim[mesh_index].anim.get_time_length(m_char_anim[action].name);
            character->action_timer = action_timer + anim_length * 30;
        }
    }

Skipping the details on the preceding functions, you now encounter the function
used to set up the data that displays a message over a character:


    void set_char_msg(sCharacter* character, const char* msg, long msg_timer, D3DCOLOR msg_color)
    {
        
// set text messages to float up from character

        strcpy(character->msg, msg);

        character->msg_timer = msg_timer;
        character->msg_color = msg_color;
    }

set_char_msg allows you to temporarily overlay a string of text for Timer milliseconds, drawing
the text in the color specified. You set a character message to inform the player of
an event, such as how many health points were reduced because of an attack.

Coming next is the function that processes the damage taken from an attack,
whether it’s physical or magical (as denoted by the
is_physical_attack flag, set to true for
physical attacks or false for magical):

void cCharController::damage(sCharacter* victim,
                             
bool is_physical_attack, long attack_amount,
                             
long damage_class, long cure_class)
{
    
// can not attack if already dead or being hurt or not update enabled
    if(victim == NULL || !victim->update_enable || victim->action == CHAR_DIE || victim->action == CHAR_HURT)
        
return;

    
float   range;
    
long    damage_amount;
    
    
if(is_physical_attack)  // adjust for defense if physical attack
    {
        
// random value for less/more damage (-+10%)
        range = (rand()%20 + 90.0f) / 100.0f;
        damage_amount = attack_amount * range;

        
// subtract for defencse to victim (allow -20% difference)
        range = (rand()%20 + 80.0f) / 100.0f;
        damage_amount -= (get_defense(victim) * range);
    }
    
else    // adjust for magical attack            
        damage_amount = attack_amount * (1.0f - get_resistance(victim)/100.0f);    

    
if(damage_amount < 0)   // bounds check
        damage_amount = 0;

    
// check for double damage
    if(victim->char_def.class_index == damage_class)
        damage_amount *= 2;

    
// check for cure damage
    if(victim->char_def.class_index == cure_class)
        damage_amount = -labs(damage_amount) / 2;

    
// if no physical damage is dealt then randomly deal 10-20% of damage from the original amount.
    if(damage_amount == 0 && is_physical_attack)
    {
        range = (rand()%10 + 10) / 100.0f;
        damage_amount = attack_amount * range;
    }
    
    victim->health_points -= damage_amount;

    
char text[128];

    
if(damage_amount > 0)       // set hurt status and display message
    {
        sprintf(text, "-%lu HP", damage_amount);
        set_char_msg(victim, text, 500, D3DCOLOR_RGBA(255, 64, 0, 255));

        
// only set hurt if idle or moving
        if(victim->action == CHAR_MOVE || victim->action == CHAR_IDLE)
            set_char_action(victim, CHAR_HURT, 0);
    }
    
else if(damage_amount < 0)  // display cure amount
    {
        sprintf(text, "+%lu HP", -damage_amount);
        set_char_msg(victim, text, 500, D3DCOLOR_RGBA(0, 64, 255, 255));
    }    
}

Damage takes a pointer to the character taking damage, the type of damage (physical
or magical), the amount of damage to apply, and the double damage and cure
classes of the attack. You adjust the damage amount based on the defense and resistance
abilities of the victim.

posted on 2007-12-04 19:19 lovedday 閱讀(280) 評(píng)論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(lèi)(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>
            亚洲成在线观看| 亚洲资源av| 亚洲日本黄色| 亚洲午夜在线观看| 亚洲五月六月| 噜噜噜在线观看免费视频日韩| 久久久久在线观看| 国内伊人久久久久久网站视频| 亚洲永久免费精品| 久久成人精品电影| 国产精品日日摸夜夜摸av| 一本色道久久88综合亚洲精品ⅰ| 精品动漫av| 久久久久国色av免费看影院| 老司机精品视频网站| 在线观看欧美激情| 欧美不卡视频一区| 亚洲精品在线电影| 亚洲欧美日韩成人| 国产精品嫩草影院一区二区| 一区二区三区不卡视频在线观看 | 激情国产一区| 裸体女人亚洲精品一区| 亚洲国产精品ⅴa在线观看| 亚洲国产精品va| 老司机久久99久久精品播放免费| 欧美激情在线有限公司| 日韩手机在线导航| 国产精品久久久久天堂| 性欧美在线看片a免费观看| 美女在线一区二区| 一二三区精品福利视频| 国产精品视频久久| 久久久综合激的五月天| 亚洲毛片av在线| 久久er精品视频| 国产一区二区| 久久国产精品99精品国产| 欧美国产激情| 亚洲欧美精品在线| 好吊日精品视频| 欧美精品激情blacked18| 亚洲在线播放电影| 乱码第一页成人| 亚洲社区在线观看| 精品成人一区| 国产精品久久久久久av福利软件| 亚洲天堂av在线免费| 欧美一级久久久| 亚洲精品欧美日韩| 国产欧美一区二区白浆黑人| 免费中文日韩| 亚洲欧美一区二区三区久久| 亚洲第一网站| 久久久久久夜| 亚洲一区一卡| 亚洲美女性视频| 黑人巨大精品欧美一区二区小视频| 欧美风情在线| 午夜精品久久久久久久蜜桃app | 亚洲天堂av电影| 亚洲国产精品电影| 久久久精品久久久久| 亚洲午夜久久久久久尤物| 国产亚洲精品一区二区| 欧美精品一区二区久久婷婷| 亚洲视频免费在线| 亚洲国产高清一区| 欧美a一区二区| 久久国产日韩| 亚洲天堂免费观看| 亚洲精品国产精品国自产在线| 国产欧美日韩在线播放| 欧美日韩人人澡狠狠躁视频| 亚洲欧美三级伦理| 欧美激情一区二区三区在线视频观看| 欧美中文在线免费| 亚洲一区二区三区高清不卡| 亚洲精品在线视频观看| 亚洲电影毛片| 狠狠色综合色区| 国产专区精品视频| 国产欧美69| 国产精品久久久久9999吃药| 欧美寡妇偷汉性猛交| 亚洲欧美成人一区二区三区| 国产精品99久久久久久人| 亚洲日本免费电影| 亚洲欧洲日韩在线| 亚洲人成在线播放| 亚洲国产欧美久久| 亚洲人成在线观看网站高清| 最新国产精品拍自在线播放| 欧美黄在线观看| 欧美 日韩 国产一区二区在线视频| 久久综合伊人77777尤物| 久久久久久久一区| 美女脱光内衣内裤视频久久网站| 久久久久国产精品麻豆ai换脸 | 性色av一区二区三区在线观看| 亚洲一二三区在线观看| 亚洲免费不卡| 亚洲大片在线| 亚洲激情影视| 日韩午夜高潮| 亚洲你懂的在线视频| 欧美亚洲综合久久| 久久裸体艺术| 欧美高清视频一区二区| 亚洲黄页一区| 一本色道久久综合亚洲精品不卡| 亚洲美女视频在线观看| 亚洲一区二区在| 久久精品91| 欧美成人免费观看| 欧美日韩综合精品| 国产一区二区日韩| 亚洲日本中文字幕| 亚洲一级特黄| 久久成人久久爱| 欧美a级一区二区| 一本色道久久综合亚洲精品不| 亚洲欧美日韩国产精品| 久热精品在线| 久久免费偷拍视频| 欧美日韩免费观看中文| 国产日韩欧美一区二区| 亚洲精品老司机| 亚洲欧美日韩国产综合| 欧美+亚洲+精品+三区| 亚洲精品一区在线| 亚洲视频免费在线观看| 久久五月天婷婷| 欧美三级在线视频| 亚洲第一综合天堂另类专| 亚洲午夜伦理| 久久综合狠狠综合久久综青草| 免费欧美日韩国产三级电影| 亚洲啪啪91| 欧美在线视频免费播放| 欧美精品午夜| 红桃视频亚洲| 午夜精品国产更新| 亚洲第一在线视频| 欧美在线首页| 国产精品v欧美精品v日韩| 狠狠色噜噜狠狠狠狠色吗综合| 欧美黄色成人网| 激情欧美一区二区三区在线观看 | 久久久国产一区二区| 亚洲一区二区三区视频播放| 欧美日韩中文在线观看| 一本久道综合久久精品| 亚洲国产日韩一区二区| 欧美成人伊人久久综合网| 亚洲国产精品一区二区三区| 久久精品一级爱片| 性欧美1819sex性高清| 国产一区91| 久久女同精品一区二区| 欧美在线中文字幕| 一区免费观看| 欧美国产激情二区三区| 欧美高清视频一区| 亚洲精品一区久久久久久 | 99riav久久精品riav| 欧美精品成人一区二区在线观看 | 久久久www成人免费毛片麻豆| 国内精品视频一区| 久久久一区二区三区| 久久aⅴ国产紧身牛仔裤| 精品成人免费| 欧美黄色一区| 欧美日韩天天操| 西西人体一区二区| 久久精品123| 91久久国产精品91久久性色| 亚洲高清视频在线| 欧美调教vk| 欧美一区二区三区视频在线| 先锋影音一区二区三区| 在线欧美日韩国产| 最新国产乱人伦偷精品免费网站| 欧美视频中文字幕| 久久国产精品99国产精| 狂野欧美激情性xxxx| 一本色道久久88综合日韩精品| 国产精品99久久久久久有的能看 | 亚洲欧美日韩综合aⅴ视频| 欧美亚洲综合网| 亚洲国产精品va| 一本久道综合久久精品| 国产一区二区三区免费不卡| 免费看亚洲片| 欧美日韩一区二区三区视频 | 久久久一区二区三区| 一本色道久久综合一区| 午夜精品一区二区三区在线| 亚洲电影免费观看高清完整版在线| 亚洲精品久久久久中文字幕欢迎你 |