搜尋

優化打怪

返回清單
切換到指定樓層
通知這文章過時或找檔案 發表主題

「優化」之打怪 AI (2013/7/30 更新)

[複製連結]
1
zxc876451 ( Lv.30 大天使 ) 發表於 2013-11-20 14:04:56 | 只看該作者 回覆獎勵 |降序瀏覽 |閱讀模式
開啟檔案 src\AI\Attack.pm

=====修改(1)=====
原程式碼
  1. } elsif (
  2.         $config{attackCheckLOS} && $args->{attackMethod}{distance} > 2
  3.         && (($config{attackCanSnipe} && !checkLineSnipable($realMyPos, $realMonsterPos))
  4.         || (!$config{attackCanSnipe} && $realMonsterDist <= $args->{attackMethod}{maxDistance} && !checkLineWalkable($realMyPos, $realMonsterPos, 1)))
  5. ) {
複製代碼
複製代碼
修改成
  1. } elsif (
  2.         $config{attackCheckLOS} && $realMonsterDist > 1
  3.         && (($config{attackCanSnipe} && !checkLineSnipable($realMyPos, $realMonsterPos))
  4.         || (!$config{attackCanSnipe} && $realMonsterDist <= $args->{attackMethod}{maxDistance} && !checkLineWalkable($realMyPos, $realMonsterPos, 0)))
  5. ) {
複製代碼
複製代碼
修改 02 ,05 行~
=====修改(1-1)===== PUN_DI 大大 && 11225s 大大提供
原程式碼
  1. my @stand = calcRectArea2($realMonsterPos->{x}, $realMonsterPos->{y},
  2.                           $args->{attackMethod}{distance},
複製代碼
複製代碼
修改成
  1. my @stand = calcRectArea2($realMonsterPos->{x}, $realMonsterPos->{y},
  2.                           round($args->{attackMethod}{maxDistance}),
複製代碼
複製代碼
將 {distance} 修改成 {maxDistance} 並 四捨五入計算

=====修改(2)=====
原程式碼
  1. if (
  2.     (($config{attackCanSnipe} && checkLineSnipable($spot, $realMonsterPos))
  3.         || checkLineWalkable($spot, $realMonsterPos))
  4.         && $field->isWalkable($spot->{x}, $spot->{y})
  5.         && ($realMyPos->{x} != $spot->{x} && $realMyPos->{y} != $spot->{y})
  6.         && (!$master || round(distance($spot, $masterPos)) <= $config{followDistanceMax})
  7. ) {
複製代碼
複製代碼
修改成
  1. if (
  2.     (($config{attackCanSnipe} && checkLineSnipable($spot, $realMonsterPos))
  3.         || checkLineWalkable($spot, $realMonsterPos, 0))
  4.         && $field->isWalkable($spot->{x}, $spot->{y})
  5.         && ($realMyPos->{x} != $spot->{x} && $realMyPos->{y} != $spot->{y})
  6.         && (!$master || round(distance($spot, $masterPos)) <= $config{followDistanceMax})
  7. ) {
複製代碼
複製代碼
修改 03 行增加 , 0

開啟檔案 src\Misc.pm

=====修改(3)=====
原程式碼
  1. use Time::HiRes qw(time usleep);
  2. use Translation;
複製代碼
複製代碼
修改成
  1. use Time::HiRes qw(time usleep);
  2. use Task::Route;
  3. use Translation;
複製代碼
複製代碼
=====修改(4)=====
原程式碼
  1. # Check whether character comes earlier or at the same time
  2. if ($timeCharWalks <= $timeMonsterWalks ) {
  3.         return \%charStep;
  4. }
複製代碼
複製代碼
修改成
  1. # Check whether character comes earlier or at the same time
  2. if ($timeCharWalks <= $timeMonsterWalks && $field->isWalkable($charStep{x}, $charStep{y}) ) {
  3.         return \%charStep;
  4. }
複製代碼
複製代碼
=====修改(5)=====
原程式碼
  1. # Check whether the distance is fine
  2. if (round(distance(\%charStep, \%monsterPosTo)) <= $attackMaxDistance) {
  3.         last;
  4. }
複製代碼
複製代碼
修改成
  1. # Check whether the distance is fine
  2. if (round(distance(\%charStep, \%monsterPosTo)) <= $attackMaxDistance && $field->isWalkable($charStep{x}, $charStep{y})) {
  3.         last;
  4. }
複製代碼
複製代碼
=====修改(6)=====
原程式碼
  1. if (
  2.         !($accountID eq $targetID ? $attackTarget->{dmgToYou} : $attackTarget->{dmgToPlayer}{$targetID})
  3.         && !($accountID eq $targetID ? $attackTarget->{dmgToYou} : $attackTarget->{dmgFromPlayer}{$targetID})
  4.         && distance($monster->{pos_to}, calcPosition($player)) <= $attackSeq->{attackMethod}{distance}
  5. ) {
複製代碼
複製代碼
修改成
  1. if (
  2.         !($accountID eq $targetID ? $attackTarget->{dmgToYou} : $attackTarget->{dmgToPlayer}{$targetID})
  3.         && !($accountID eq $targetID ? $attackTarget->{dmgFromYou} : $attackTarget->{dmgFromPlayer}{$targetID})
  4.         && distance($monster->{pos_to}, calcPosition($player)) <= $attackSeq->{attackMethod}{maxDistance}
  5. ) {
複製代碼
複製代碼
修改 03,04 行~

=====修改(7)=====
原程式碼
  1. my ($highestPri, $smallestDist, $bestTarget);
  2. # First of all we check monsters in LOS, then the rest of monsters
複製代碼


複製代碼
修改成
  1. my ($highestPri, $smallestDist, $bestTarget);
  2. my $MaxSteps = $config{attackMaxRouteDistance} || 40;
  3. # First of all we check monsters in LOS, then the rest of monsters
複製代碼
複製代碼
=====修改(8)=====
  1. if ($config{'attackCanSnipe'}) {
  2.         if (!checkLineSnipable($myPos, $pos)) {
  3.                 push(@noLOSMonsters, $_);
  4.                 next;
  5.         }
  6. } else {
  7.         if (!checkLineWalkable($myPos, $pos)) {
  8.                 push(@noLOSMonsters, $_);
  9.                 next;
  10.         }
  11. }
  12. my $name = lc $monster->{name};
  13. my $dist = round(distance($myPos, $pos));
複製代碼
複製代碼
修改成
  1. my $name = lc $monster->{name};
  2. my $dist = distance($myPos, $pos);

  3. if ($config{attackCheckRouteDistance} && $field) {
  4.         my @solution;
  5.         if ($dist >= 2 && (!$config{'attackCanSnipe'} || !checkLineSnipable($myPos, $pos)) ) {
  6.                 my $ret = Task::Route->getRoute( \@solution, $field, $myPos, $pos, 1 );
  7.                 unless ($ret) {
  8.                         $monster->{ignore} = 1;
  9.                         next;
  10.                 }
  11.                 my $Steps = scalar @solution;
  12.                 if ($Steps < $MaxSteps) {
  13.                         $dist = $Steps;
  14.                 } else {
  15.                         next;
  16.                 }
  17.         }
  18. } else {
  19.         if ($config{'attackCanSnipe'}) {
  20.                 if (!checkLineSnipable($myPos, $pos)) {
  21.                         push(@noLOSMonsters, $_);
  22.                         next;
  23.                 }
  24.         } else {
  25.                 if (!checkLineWalkable($myPos, $pos)) {
  26.                         push(@noLOSMonsters, $_);
  27.                         next;
  28.                 }
  29.         }
  30. }
複製代碼

複製代碼
開啟檔案 src\AI\CoreLogic.pm

=====修改(9)=====
原程式碼
  1. # List party monsters
  2. foreach (@monstersID) {
  3.         next if (!$_ || !checkMonsterCleanness($_));
  4.         my $monster = $monsters{$_};
複製代碼
複製代碼
修改成
  1. # List party monsters
  2. foreach (@monstersID) {
  3.         next if (!$_ || !checkMonsterCleanness($_));
  4.         my $monster = $monsters{$_};
  5.         next if $monster->{ignore};
複製代碼
複製代碼
=====修改(10)=====clover1524 大大提供
原程式碼
  1.        if ($LOSSubRoute && $attackTarget) {
  2.                 Log::message("New target was choosen\n");
  3.                 # Remove all unnecessary actions (attacks and movements but the main route)
  4.                 my $i = scalar(@ai_seq);
  5.                 my (@ai_seq_temp, @ai_seq_args_temp);
  6.                 for(my $c=0;$c<$i;$c++) {
  7.                         if (($ai_seq[$c] ne "route")
  8.                           && ($ai_seq[$c] ne "move")
  9.                           && ($ai_seq[$c] ne "attack")) {
  10.                                 push(@ai_seq_temp, $ai_seq[$c]);
  11.                                 push(@ai_seq_args_temp, $ai_seq_args[$c]);
  12.                         }
  13.                 }
  14.                 # Add the main route and rewrite the sequence
  15.                 push(@ai_seq_temp, $ai_seq[$i-1]);
  16.                 push(@ai_seq_args_temp, $ai_seq_args[$i-1]);
  17.                 @ai_seq = @ai_seq_temp;
  18.                 @ai_seq_args = @ai_seq_args_temp;
  19.                 # We need this timeout not to have attack started many times
  20.                 $timeout{'ai_attack_auto'}{'time'} = time;
  21.         }
  22. }
複製代碼
複製代碼
修改成
  1.         if ($LOSSubRoute && $attackTarget) {
  2.                 if ($attackTarget ne AI::args(AI::findAction("attack"))->{ID} ) {
  3.                         Log::message("New target was choosen\n");
  4.                         # Remove all unnecessary actions (attacks and movements but the main route)
  5.                         my $i = scalar(@ai_seq);
  6.                         my (@ai_seq_temp, @ai_seq_args_temp);
  7.                         for(my $c=0;$c<$i;$c++) {
  8.                                 if (($ai_seq[$c] ne "route")
  9.                                   && ($ai_seq[$c] ne "move")
  10.                                   && ($ai_seq[$c] ne "attack")) {
  11.                                         push(@ai_seq_temp, $ai_seq[$c]);
  12.                                         push(@ai_seq_args_temp, $ai_seq_args[$c]);
  13.                                 }
  14.                         }
  15.                         # Add the main route and rewrite the sequence
  16.                         push(@ai_seq_temp, $ai_seq[$i-1]);
  17.                         push(@ai_seq_args_temp, $ai_seq_args[$i-1]);
  18.                         @ai_seq = @ai_seq_temp;
  19.                         @ai_seq_args = @ai_seq_args_temp;
  20.                         # We need this timeout not to have attack started many times
  21.                         $timeout{'ai_attack_auto'}{'time'} = time;
  22.                 } else {
  23.                         undef $attackTarget;
  24.                 }
  25.         }
  26. }
複製代碼
複製代碼
=====注意!!以上要在 config.txt 設定=====
  1. attackCheckLOS 1
  2. # 0 = 不使用 ,1 = 使用
  3. # 是否判斷魔物與角色中間有無障礙物阻礙攻擊,自動閃避障礙物
  4. # 這可以避免因為障礙物阻隔打不到怪物,而原地發呆。

  5. attackChangeTarget 1
  6. # 是否使用智慧型變換攻擊目標
  7. # 0=不使用、1=使用,且出現 LOS 時,尋找更佳的目標來攻擊、2=使用。
  8. # 說明:
  9. # 鎖定某非主動怪物後,還沒開打,此時附近有高危險的主動怪靠近,
  10. # 這種情況下,kore 可以自動變換攻擊目標,
  11. # 捨棄原先鎖定的非主動怪,改成先打靠近中的高危險主動怪。
  12. # LOS 是指 attackCheckLOS 設為 1 時,正在自動閃避障礙物的情況,
  13. # 若此時附近剛好出現「沒被障礙物阻擋」的怪物,
  14. # 就不浪費時間 LOS 了,直接先打沒被阻擋的怪物。

  15. attackCheckRouteDistance 1
  16. # 0 = 不使用 ,1 = 使用
  17. # 偵測人物跟魔物之間的「步數」
  18. # 說明:人物跟魔物之間有障礙物時,繞過去需要的「步數」,
  19. #           若超過 attackMaxRouteDistance 設定值,會略過不打
  20. # 附加功能:魔物站在無法到達的地方會略過不打
  21. # 但因為要計算「步數」,CPU 負擔會加重,自行決定是否使用。

  22. attackMaxRouteDistance 30
  23. # 計算攻擊路徑的距離 這依地圖複雜性設定 或人物發呆
  24. # 如金字塔這種地圖建議調低一點來防止輔助發呆等問題
  25. # 狹窄、複雜地圖可設定15~20;一般地圖30;開闊的40
複製代碼

複製代碼


所有站內附件皆會附上安全掃描報告
請會員查看純淨度百分比後判斷使用



相關檔案須知:
取得檔案前,請先詳細閱讀文章內容
避免不必要錯誤與誤會發生。
也可多參考文章討論樓層內容
了解附件檔案相關討論資訊。







評分

參與人數 2GP +2 收起 理由
0922496753 + 1 神馬都是浮雲
0988422114 + 1 很給力!

檢視全部評分




大家正在看啥


收藏收藏 分享文章到FB上分享
回覆 使用道具 檢舉
複製專屬你的推廣連結:發至FB與各論壇宣傳:累積點數換GP商品 & 藍鑽
每五點閱率就可以兌換藍鑽積分或遊戲點卡 夢遊推廣文章換GP商品

你需要登入後才可以回覆 登入 | 加入會員

本版積分規則

Copyright (C) 2010-2020 夢遊電玩論壇

廣告合作:請直接聯繫我們,並附上您預刊登位置的預算。  

快速回覆 返回頂端 返回清單