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

天行健 君子當(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) 評論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

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

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美顶级艳妇交换群宴| 欧美一区二区视频网站| 在线观看欧美| 亚洲欧美日韩天堂| 亚洲免费观看高清在线观看| 久久aⅴ国产欧美74aaa| 亚洲欧美日韩精品久久| 欧美日韩国产色综合一二三四| 久久婷婷色综合| 国产精品欧美久久| 99视频有精品| 在线综合欧美| 欧美日韩国产成人在线91| 欧美激情一区在线观看| 在线成人性视频| 久久精品水蜜桃av综合天堂| 欧美自拍丝袜亚洲| 国产欧美日韩精品一区| 亚洲影院免费| 久久精品国产77777蜜臀| 国产精品久久久久久福利一牛影视| 亚洲人成亚洲人成在线观看图片 | 午夜日韩av| 亚洲男人av电影| 国产精品久久久久影院色老大 | 欧美综合第一页| 国产精品一区二区视频| 亚洲一区精品在线| 久久精品av麻豆的观看方式| 国产精品影视天天线| 亚洲欧美www| 久久精品在线免费观看| 一区二区视频免费完整版观看| 久久激情久久| 女女同性精品视频| 91久久精品久久国产性色也91| 麻豆成人在线播放| 亚洲经典自拍| 亚洲综合视频网| 国产亚洲欧美日韩日本| 久久精品伊人| 91久久亚洲| 性欧美1819sex性高清| 国产一区二区三区日韩欧美| 久久蜜臀精品av| 亚洲国产另类精品专区| 亚洲永久精品国产| 国产一区二区你懂的| 久久伊人亚洲| 99亚洲视频| 久久久久久亚洲精品不卡4k岛国| 在线精品福利| 欧美日韩一区二区高清| 亚洲在线观看免费视频| 欧美成人精品在线| 欧美一区三区二区在线观看| 国产一区二区中文| 免费一级欧美片在线播放| 91久久精品日日躁夜夜躁国产| 在线一区二区视频| 国内精品久久久久影院 日本资源| 久久精品中文字幕一区二区三区| 欧美激情一区二区三区在线| 亚洲欧美成人在线| 亚洲观看高清完整版在线观看| 欧美欧美午夜aⅴ在线观看| 先锋影音国产精品| 亚洲精品欧洲| 另类春色校园亚洲| 亚洲一区二区欧美日韩| 亚洲丁香婷深爱综合| 国产精品美女午夜av| 久久亚洲图片| 午夜精品国产更新| 亚洲免费观看| 亚洲福利电影| 久久精品夜夜夜夜久久| 亚洲亚洲精品三区日韩精品在线视频| 国产一区二区电影在线观看| 欧美四级电影网站| 免费在线成人av| 久久激情视频久久| 亚洲影视中文字幕| 99亚洲一区二区| 亚洲国产一二三| 蜜乳av另类精品一区二区| 性欧美xxxx大乳国产app| 一区二区三区精品视频在线观看| 在线成人h网| 黑人巨大精品欧美一区二区| 国产精品久久二区| 欧美日韩亚洲一区二区三区四区| 牛牛国产精品| 卡一卡二国产精品| 久久免费一区| 久久精品首页| 久久久www成人免费无遮挡大片 | 欧美另类一区二区三区| 免费不卡视频| 欧美aa在线视频| 久久综合久久久| 久久香蕉国产线看观看av| 久久黄色网页| 久久久久久久成人| 久久精品夜色噜噜亚洲a∨| 欧美一级片在线播放| 亚欧成人精品| 久久riav二区三区| 久久久女女女女999久久| 久久久久久夜精品精品免费| 欧美在线观看网址综合| 香蕉亚洲视频| 久久久久综合| 另类激情亚洲| 欧美精品一区二区视频| 欧美日韩精品欧美日韩精品| 欧美日韩www| 欧美视频专区一二在线观看| 国产精品久久久久秋霞鲁丝| 国产精品久久久久久久浪潮网站| 国产精品日韩欧美| 国产一区二区高清不卡| 一区在线播放| 亚洲三级免费观看| 99av国产精品欲麻豆| 亚洲手机在线| 亚洲欧美国产日韩中文字幕| 欧美一区2区三区4区公司二百| 欧美在线一区二区三区| 开心色5月久久精品| 亚洲高清资源综合久久精品| 亚洲精品一区久久久久久| 亚洲无限av看| 久久国产精品亚洲va麻豆| 蜜桃av噜噜一区二区三区| 欧美日韩系列| 黄色精品在线看| 亚洲欧洲一区二区天堂久久 | 99国产精品99久久久久久粉嫩| 亚洲最新在线| 欧美在线精品免播放器视频| 老司机67194精品线观看| 欧美日韩国产成人高清视频| 国产美女在线精品免费观看| **欧美日韩vr在线| 亚洲图片欧洲图片av| 久久综合伊人77777麻豆| 亚洲日韩欧美一区二区在线| 午夜久久久久久| 欧美另类高清视频在线| 国产麻豆9l精品三级站| 亚洲裸体视频| 久久亚洲欧美| 一区二区不卡在线视频 午夜欧美不卡'| 性欧美办公室18xxxxhd| 欧美国产日韩一区二区在线观看| 国产女主播一区| 亚洲欧洲日本专区| 久久精品观看| 9色精品在线| 美女主播一区| 国产丝袜一区二区| 亚洲视频在线免费观看| 欧美华人在线视频| 欧美亚洲一级片| 欧美日韩视频在线第一区| 亚洲国产成人久久综合| 欧美一级视频一区二区| 99国产欧美久久久精品| 免费国产一区二区| 黑人中文字幕一区二区三区| 亚洲欧美变态国产另类| 日韩写真视频在线观看| 欧美电影电视剧在线观看| 一区在线视频| 久久精品一区| 午夜视频一区| 国产欧美亚洲精品| 午夜视黄欧洲亚洲| 99re6热只有精品免费观看| 欧美国产一区二区在线观看| 在线观看久久av| 美国成人直播| 久久精品首页| 在线电影国产精品| 久久久久久久综合狠狠综合| 先锋影音一区二区三区| 国产精品一区二区久久久| 亚洲欧美国产一区二区三区| 99精品国产在热久久下载| 欧美日韩国产三级| 亚洲视频你懂的| 一区二区三区精品久久久| 欧美日韩久久不卡| 中文欧美日韩| 亚洲午夜黄色| 国产婷婷成人久久av免费高清| 久久精品99国产精品日本 | 99热精品在线观看| 欧美午夜精品久久久久久久|