亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chars.cpp

?? 3D游戲引擎 Programming Role-Playing Games with DirectX, 2nd Edition by Jim Adams
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
  }

  return TRUE;
}

BOOL cCharacterController::Attack(sCharacter *Attacker,       \
                                  sCharacter *Victim)
{
  // Error checking
  if(Attacker == NULL || Victim == NULL)
    return FALSE;

  // Don't attack dead or hurt people
  if(Victim->Action == CHAR_DIE || Victim->Action == CHAR_HURT)
    return FALSE;

  // Set attacker and victim
  Victim->Attacker = Attacker;
  Attacker->Victim = Victim;

  // Return if hit missed
  if((rand() % 1000) > GetToHit(Attacker)) {
    SetMessage(Victim, "Missed!", 500);
    return FALSE;
  }

  // Return if hit dodged
  if((rand() % 1000) <= GetAgility(Victim)) {
    SetMessage(Victim, "Dodged!", 500);
    return FALSE;
  }

  // If character is asleep, randomly wake them up (50% chance)
  if(Victim->Ailments & AILMENT_SLEEP) {
    if((rand() % 100) < 50)
      Victim->Ailments &= ~AILMENT_SLEEP;
  }

  // Attack landed, apply damage
  Damage(Victim, TRUE, GetAttack(Attacker), -1, -1);

  return TRUE;
}

BOOL cCharacterController::Damage(sCharacter *Victim,         \
                                  BOOL PhysicalAttack,        \
                                  long Amount,                \
                                  long DmgClass,              \
                                  long CureClass)
{
  char Text[128];
  float Resist;
  float Range;
  long  DmgAmount;

  // Error checking
  if(Victim == NULL)
    return FALSE;

  // Can't attack if already dead or being hurt (or not enabled)
  if(Victim->Enabled == FALSE ||                              \
     Victim->Action==CHAR_DIE ||                              \
     Victim->Action==CHAR_HURT)
    return FALSE;

  // Adjust for defense if physical attack
  if(PhysicalAttack == TRUE) {
 
    // Random value for less/more damage (-+20%)
    Range     = (float)((rand() % 20) + 90) / 100.0f;
    DmgAmount = (long)((float)Amount * Range);

   // Subtract for defense of victim (allow -20% difference)
    Range     = (float)((rand() % 20) + 80) / 100.0f;
    DmgAmount -= (long)((float)GetDefense(Victim) * Range);
  } else {
    // Adjust for magical attack
    Resist = 1.0f - ((float)GetResistance(Victim) / 100.0f);
    DmgAmount = (long)((float)Amount * Resist);
  }

  // Bounds check value
  if(DmgAmount < 0)
    DmgAmount = 0;

  // Check for double damage
  if(Victim->Def.Class == DmgClass)
    DmgAmount *= 2;

  // Check for cure damage
  if(Victim->Def.Class == CureClass)
    DmgAmount = -(labs(DmgAmount)/2);

  // If no physical damage is dealt then randomly deal 
  // 10-20% of damage from the original amount.
  if(!DmgAmount && PhysicalAttack == TRUE) {
    Range     = (float)((rand() % 10) + 10) / 100.0f;
    DmgAmount = (long)((float)Amount * Range);
  }

  // Subtract damage amount
  Victim->HealthPoints -= DmgAmount;

  // Set hurt status and display message
  if(DmgAmount >= 0) {
    sprintf(Text, "-%lu HP", DmgAmount);
    SetMessage(Victim, Text, 500, D3DCOLOR_RGBA(255,64,0,255));

    // Only set hurt if any damage (and idle or moving)
    if(DmgAmount) {
      if(Victim->Action==CHAR_MOVE || Victim->Action==CHAR_IDLE)
        SetAction(Victim, CHAR_HURT);
    }
  } 

  // Display cure amount
  if(DmgAmount < 0) {
    sprintf(Text, "+%lu HP", -DmgAmount);
    SetMessage(Victim, Text, 500, D3DCOLOR_RGBA(0,64,255,255));
  }

  return TRUE;
}

BOOL cCharacterController::Death(sCharacter *Attacker,        \
                                 sCharacter *Victim)
{
  char Text[128];

  // If a PC or NPC dies, then don't remove from list
  if(Victim->Type == CHAR_PC) {
    // Mark character as disabled so no updates
    Victim->Enabled = FALSE;

    // Call outside death function for PC's
    if(Victim->Type == CHAR_PC)
      PCDeath(Victim);
    else
      NPCDeath(Victim);
  } else {
    // Give attacker the victim's experience
    if(Attacker != NULL) {
      if(Experience(Attacker, Victim->Def.Experience) == TRUE) {
        sprintf(Text, "+%lu exp.", Victim->Def.Experience);
        SetMessage(Attacker, Text, 500);
      }
    }

    // Drop character's money
    if(m_MIL != NULL && Victim->Def.Money)
      DropMoney(Victim->XPos, Victim->YPos, Victim->ZPos,     \
                Victim->Def.Money);

    // Randomly drop an item (as specified in definition)
    if((rand() % 100) < Victim->Def.DropChance)
      DropItem(Victim->XPos, Victim->YPos, Victim->ZPos,      \
               Victim->Def.DropItem);

    // Decrease mesh count and release if no more
    m_Meshes[Victim->Def.MeshNum].Count--;
    if(!m_Meshes[Victim->Def.MeshNum].Count) {
      m_Meshes[Victim->Def.MeshNum].Mesh.Free();
      m_Meshes[Victim->Def.MeshNum].Animation.Free();
    }

    // Remove dead character from list
    if(Victim->Prev != NULL)
      Victim->Prev->Next = Victim->Next;
    else
      m_CharacterParent = Victim->Next;

    if(Victim->Next != NULL)
      Victim->Next->Prev = Victim->Prev;

    if(Victim->Prev == NULL && Victim->Next == NULL)
      m_CharacterParent = NULL;

    Victim->Prev = Victim->Next = NULL;
    delete Victim;
  }

  return TRUE;
}

BOOL cCharacterController::Spell(sCharacter *Caster,          \
                                 sSpellTracker *SpellTracker, \
                                 sSpell *Spells)
{
  float XDiff, YDiff, ZDiff, Dist, YDist, XZDist;
  float MinX, MaxX, MinY, MaxY, MinZ, MaxZ;
  float SpellRadius, XZRadius, YRadius;
  sSpell *SpellPtr;
  sCharacter *CharPtr, *ClosestChar;
  float Closest;
  BOOL Allow;

  // Error checking
  if(Caster == NULL || SpellTracker == NULL || Spells == NULL)
    return TRUE;

  // Get pointer to spell
  SpellPtr = &Spells[SpellTracker->SpellNum];

  // Reduce magic
  Caster->ManaPoints -= SpellPtr->Cost;
  if(Caster->ManaPoints < 0)
    Caster->ManaPoints = 0;

  // Can't cast if silenced
  if(Caster->Ailments & AILMENT_SILENCED) {
    SetMessage(Caster, "Silenced!", 500);
    return FALSE;
  }

  // Get radius of spell
  SpellRadius = SpellPtr->Range * SpellPtr->Range;

  // Handle self-targeting spells instantly
  if(SpellPtr->Target == TARGET_SELF) {
    SpellEffect(Caster, Caster, SpellPtr);
    return TRUE;
  }

  // Reset closest character pointer
  ClosestChar = NULL;
  Closest = 0.0f;

  // Scan through all characters and look for hits
  if((CharPtr = m_CharacterParent) == NULL)
    return FALSE;
  while(CharPtr != NULL) {

    // Only bother with characters of allowed types
    // as well as not targeting self. Also, allow 
    // a RAISE_DEAD PC spell to affect any character.
    Allow = FALSE;
    if(CharPtr!=Caster && SpellTracker->Type==CharPtr->Type)
      Allow = TRUE;
    if(CharPtr->Type==CHAR_PC && SpellPtr->Effect==RAISE_DEAD)
      Allow = TRUE;

    // Find target(s) if allowed
    if(Allow == TRUE) {

      // Get distance from target to character
      XDiff = (float)fabs(CharPtr->XPos - SpellTracker->TargetX);
      YDiff = (float)fabs(CharPtr->YPos - SpellTracker->TargetY);
      ZDiff = (float)fabs(CharPtr->ZPos - SpellTracker->TargetZ);

      // Get X/Z and Y distances
      XZDist = (XDiff * XDiff + ZDiff * ZDiff) - SpellRadius;
      YDist  = (YDiff * YDiff) - SpellRadius;

      // Get target X/Z and Y radius
      CharPtr->Object.GetBounds(&MinX,&MinY,&MinZ,
                                &MaxX,&MaxY,&MaxZ,NULL);
      XZRadius = max(MaxX-MinX, MaxZ-MinZ) * 0.5f;
      YRadius = (MaxY-MinY) * 0.5f;

      // Check if character in range
      if(XZDist - (XZRadius * XZRadius) <= 0.0f && 
          YDist - (YRadius  * YRadius)  <= 0.0f) {
       
        // Determine what to do if in range
        if(SpellPtr->Target == TARGET_SINGLE) {
          // Record closest character in range
          Dist = XDiff * XDiff + YDiff * YDiff + ZDiff * ZDiff;
          if(ClosestChar == NULL) {
            ClosestChar = CharPtr;
            Closest = Dist;
          } else {
            if(Dist < Closest) {
              ClosestChar = CharPtr;
              Closest = Dist;
            }
          }
        } else {
          // Spell hit target if area target
          SpellEffect(Caster, CharPtr, SpellPtr);
        }
      }
    }

    // Go to next character
    CharPtr = CharPtr->Next;
  }

  // Process spell on closest character if needed
  if(SpellPtr->Target==TARGET_SINGLE && ClosestChar!=NULL)
    SpellEffect(Caster, ClosestChar, SpellPtr);

  return TRUE;
}

BOOL cCharacterController::SpellEffect(sCharacter *Caster,    \
                                       sCharacter *Target,    \
                                       sSpell *Spell)
{
  BOOL CanHit;
  long Chance;
  char Text[64];

  // Error checking
  if(Target == NULL || Spell == NULL)
    return FALSE;

  // Calculate chance of hitting
  if(Caster != NULL) {
    // A spell always lands if target=caster
    if(Caster == Target)
      Chance = 100;
    else
      Chance = (long)(((float)GetMental(Caster) / 100.0f +    \
                           1.0f) * (float)Spell->Chance);
  } else {
    Chance = Spell->Chance;
  }

  // Alter chance by target's resistance
  if(Caster != Target)
    Chance = (long)((1.0f - (float)GetResistance(Target) /    \
                        100.0f) * (float)Chance);

  // See if spell failed
  if(Chance != 100 && (rand() % 100) >= Chance) {
    SetMessage(Target, "Failed!", 500);
    return FALSE;
  }

  // Flag character to allow effect
  CanHit = TRUE;
  if(Target->Action==CHAR_HURT || Target->Action==CHAR_DIE)
    CanHit = FALSE;

  // Store attacker and victim
  if((Target->Attacker = Caster) != NULL)
    Caster->Victim = Target;
    
  // Process spell effect
  switch(Spell->Effect) {
    case ALTER_HEALTH:     // Alter health
      if(CanHit == FALSE)
        break;

      // Apply damage if value < 0
      if(Spell->Value[0] < 0.0f)
        Damage(Target,FALSE,-(long)Spell->Value[0],           \
               Spell->DmgClass, Spell->CureClass);

      // Cure damage if value > 0
      if(Spell->Value[0] > 0.0f) {
        Target->HealthPoints += (long)Spell->Value[0];
        if(Target->HealthPoints > Target->Def.HealthPoints)
          Target->HealthPoints = Target->Def.HealthPoints;
        
        // Display amount healed
        sprintf(Text, "+%lu HP", (long)Spell->Value[0]);
        SetMessage(Target,Text,500,D3DCOLOR_RGBA(0,64,255,255));
      }

      break;

    case ALTER_MANA:       // Alter mana
      if(CanHit == FALSE)
        break;

      // Alter mana value
      Target->ManaPoints += (long)Spell->Value[0];
      if(Target->ManaPoints < 0)
        Target->ManaPoints = 0;
      if(Target->ManaPoints > Target->Def.ManaPoints)
        Target->ManaPoints = Target->Def.ManaPoints;

      // Display remove mana message
      if(Spell->Value[0] < 0.0f) {
        sprintf(Text, "%ld MP", (long)Spell->Value[0]);
        SetMessage(Target,Text,500,D3DCOLOR_RGBA(0,128,64,255));
      }

      // Display add mana message
      if(Spell->Value[0] > 0.0f) {
        sprintf(Text, "+%lu MP", (long)Spell->Value[0]);
        SetMessage(Target,Text,500,D3DCOLOR_RGBA(0,255,0,255));
      }

      break;

    case CURE_AILMENT:      // Clear ailment flag
      if(CanHit == FALSE)
        break;

      // Apply ailment and display message
      Target->Ailments |= ~(long)Spell->Value[0];
      SetMessage(Target, "Cure", 500);

      break;

    case CAUSE_AILMENT:     // Set ailment flag
      if(CanHit == FALSE)
        break;

      // Cure ailment and display message
      Target->Ailments |= (long)Spell->Value[0];
      SetMessage(Target, "Ailment", 500);

      break;

    case RAISE_DEAD:       // Raise from dead
      if(Target->Action == CHAR_DIE) {
        Target->HealthPoints = 1;
        Target->ManaPoints   = 0;
        Target->Action       = CHAR_IDLE;
        Target->Locked       = FALSE;
        Target->ActionTimer  = 0;
        Target->Ailments      = 0;
        Target->Enabled      = TRUE;
      }
      break;

    case INSTANT_KILL:     // Kill character
      if(CanHit == FALSE)
        break;

      // Set die action
      SetAction(Target, CHAR_DIE);
      break;

    case DISPEL_MAGIC:     // Remove all ailments
      if(CanHit == FALSE)
        break;

      // Clear all ailments
      Target->Ailments = 0;
      break;

    case TELEPORT:         // Teleport PC/NP

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕av一区二区三区免费看 | 在线影院国内精品| 精品一区免费av| 成人av网站在线观看免费| 欧美视频三区在线播放| 久久婷婷一区二区三区| 亚洲国产精品嫩草影院| 国产伦理精品不卡| 日韩一区二区麻豆国产| 亚洲欧美激情在线| 亚洲与欧洲av电影| 99精品1区2区| 欧美激情在线一区二区三区| 久久99热99| 欧美高清一级片在线| 亚洲自拍偷拍麻豆| 91久久精品日日躁夜夜躁欧美| 99热精品一区二区| 国产日产欧产精品推荐色 | 欧美在线一区二区| 国产精品三级久久久久三级| 国产在线精品一区二区夜色| 国产电影一区在线| 在线亚洲人成电影网站色www| 欧美日韩一区二区不卡| 亚洲精品欧美激情| 色噜噜久久综合| 亚洲精选免费视频| 欧美亚一区二区| 一区二区三区产品免费精品久久75| 午夜视频在线观看一区| 色狠狠一区二区三区香蕉| 椎名由奈av一区二区三区| 99精品欧美一区二区三区综合在线| 在线观看国产一区二区| 亚洲精品免费在线观看| 色一情一乱一乱一91av| 91精品国产综合久久婷婷香蕉| xf在线a精品一区二区视频网站| 国产精品成人免费| 97久久超碰国产精品| 国产精品福利一区二区| 色播五月激情综合网| 久久综合色8888| 亚洲综合免费观看高清完整版在线| 久久精品国产在热久久| 99免费精品在线| 一区二区三区四区激情| 欧美人与性动xxxx| 久久国产人妖系列| 久久久.com| 91精品福利视频| 日本不卡在线视频| 国产色爱av资源综合区| 色综合色狠狠综合色| 久久精品人人做| 99r国产精品| 国产欧美综合在线观看第十页| 日韩av一区二| 2020国产精品| 六月丁香婷婷久久| 欧美精品黑人性xxxx| 国产一区二区网址| 亚洲视频1区2区| 欧美一级艳片视频免费观看| 成人一区二区三区| 亚洲成人动漫精品| 国产拍揄自揄精品视频麻豆| 欧美性xxxxxx少妇| 国产91精品一区二区| 亚洲午夜精品一区二区三区他趣| 99精品视频一区二区| 日韩电影在线免费看| 欧美日韩国产中文| 亚洲一区二区三区四区的| 精品久久人人做人人爰| 色综合久久天天| 韩国欧美一区二区| 亚洲已满18点击进入久久| 久久亚洲精品小早川怜子| 在线视频一区二区免费| 国产成人精品aa毛片| 天堂va蜜桃一区二区三区漫画版| 欧美日韩免费一区二区三区视频| 亚洲免费观看在线视频| 色婷婷久久综合| 一区二区三区产品免费精品久久75| 色婷婷精品久久二区二区蜜臀av| 亚洲欧美另类久久久精品2019| 99re热这里只有精品免费视频| 亚洲欧洲精品成人久久奇米网| eeuss鲁片一区二区三区在线看| 国产精品高潮呻吟| 色综合天天综合网天天狠天天 | 欧美tk—视频vk| 国产综合色在线| 亚洲电影在线免费观看| 中文字幕一区二区在线播放| 精品国产青草久久久久福利| 国产盗摄女厕一区二区三区| 日产国产高清一区二区三区| 一区二区三区欧美视频| 国产精品乱人伦中文| 91国产视频在线观看| 不卡的av电影| 国产乱妇无码大片在线观看| 国产精品久久久久一区二区三区共| 91亚洲资源网| 波多野结衣91| 成人av电影在线播放| 成人网页在线观看| 欧美亚洲国产bt| 在线观看欧美黄色| 欧美日韩五月天| 欧美日韩国产高清一区二区三区 | 亚洲宅男天堂在线观看无病毒| 91精品在线观看入口| 欧美日韩一区二区三区免费看| 久久精品噜噜噜成人88aⅴ| 蜜桃av一区二区在线观看| 日本欧美一区二区三区乱码| 欧美国产视频在线| 国产精品网站在线观看| 一色桃子久久精品亚洲| 欧美精品视频www在线观看 | 偷偷要91色婷婷| 欧美国产成人精品| 777久久久精品| 成人国产免费视频| 色哟哟在线观看一区二区三区| 国模冰冰炮一区二区| 国产精品一级二级三级| 高清国产午夜精品久久久久久| 奇米四色…亚洲| 韩国欧美国产1区| 高清国产午夜精品久久久久久| 免费在线观看一区| 国内精品伊人久久久久av一坑| 亚洲电影中文字幕在线观看| 国产精品久久久久久久久久久免费看| 欧美日本高清视频在线观看| 日韩美女一区二区三区| 中文字幕欧美日韩一区| 一区二区三区欧美在线观看| 全国精品久久少妇| 不卡在线视频中文字幕| 欧美色成人综合| 337p日本欧洲亚洲大胆精品| 亚洲精品视频一区二区| 麻豆视频一区二区| 免费在线看成人av| av亚洲精华国产精华| 欧美精品三级在线观看| 国产精品私房写真福利视频| 亚洲成人免费av| 成人性生交大片免费看视频在线| 激情综合亚洲精品| 色哟哟一区二区三区| 久久婷婷色综合| 日本一区二区免费在线观看视频| 精品99久久久久久| 精品国产乱码久久久久久影片| 日韩视频123| 亚洲日本青草视频在线怡红院| 中文字幕欧美激情一区| 国产精品视频线看| 日韩和欧美的一区| 91捆绑美女网站| 26uuu久久天堂性欧美| 日本一区二区高清| 日本欧美在线看| 欧美性淫爽ww久久久久无| 欧美高清在线视频| 国模套图日韩精品一区二区| 欧美理论在线播放| 亚洲综合一区在线| 不卡一区中文字幕| 久久久精品蜜桃| 日韩av不卡一区二区| 久久99精品国产.久久久久久| 紧缚奴在线一区二区三区| 欧美喷潮久久久xxxxx| 亚洲黄色性网站| 日本美女视频一区二区| 国产一区二区在线影院| 欧美日韩三级在线| 亚洲高清免费视频| 久久se精品一区精品二区| 欧美日本高清视频在线观看| 一区二区三区高清不卡| 麻豆成人91精品二区三区| 欧美日韩国产一二三| 亚洲激情图片小说视频| 色偷偷久久人人79超碰人人澡| 7777精品伊人久久久大香线蕉经典版下载| 91精品国产欧美一区二区成人| 亚洲精品一区二区三区福利 | 日韩三级电影网址| 中文成人综合网| 成人午夜视频免费看|