3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 6260|回复: 29
打印 上一主题 下一主题

[原创] [更新下载]人族高AI时虫神出Error补丁+想自己写AI的进来看看

[复制链接]

0

主题

53

帖子

160

积分

中级玩家

Rank: 3Rank: 3

贡献度
15
金元
996
积分
160
精华
0
注册时间
2010-2-23
跳转到指定楼层
主题
发表于 2010-2-28 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先放上 人族高AI时虫和神出Error补丁,虫神再不会纱布了。 直接Copy到StarCraft II BetaTriggerLibs里面  现在在高AI人族的时候虫和神不会不造东西了。

http://www.rayfile.com/files/4d98be57-2430-11df-a726-0015c55db73d/
error是因为没有调用虫和神的AI文件。
   

现在想自己写AI的来看看:
   暴雪现在是用的Galaxy脚本语言,和C语言很类似。用MPQ把StarCraft II BetaModsLiberty.SC2ModBase.SC2Data 解开以后,会出现和AI有关的几个Galaxy脚本
   MeleeNotHardAI.galaxy MeleeAI.galaxy Protoss0.galaxy Protoss.galaxy Zerg.galaxy Zerg0.galaxy Terran.galaxy Terran0.galaxy TacticalAI.galaxy
   其中, MeleeNotHardAI.galaxy MeleeAI.galaxy应该是战争的整体策略,Protoss.galaxy Terran.galaxy Zerg.galaxy则是每个种族的策略,后面带0的表示难度0下的该种族策略。现在就来看看Terran0.galaxy的部分

//==================================================================================================
//  Terran Melee AI
//==================================================================================================

include "TriggerLibs/Terran0"

//--------------------------------------------------------------------------------------------------
//  Counter-Attack Units                   这个应该是兵种相克表,告诉AI什么应该用什么对付
//--------------------------------------------------------------------------------------------------
static void InitCounters (int player) {
//xxx lots of old data -- needs to be totally redone
    // versus Protoss
    AICounterUnit(player, c_PB_PhotonCannon,         0.50, c_TU_SiegeTank);
    AICounterUnit(player, c_PU_Zealot,              1.00, c_TU_Hellion);
    AICounterUnit(player, c_PU_Stalker,             1.00, c_TU_Marauder);
    AICounterUnit(player, c_PU_Immortal,            2.00, c_TU_Marauder);
    AICounterUnit(player, c_PU_Disruptor,           1.00, c_TU_Ghost);
    AICounterUnit(player, c_PU_HighTemplar,         1.00, c_TU_Ghost);
    AICounterUnit(player, c_PU_DarkTemplar,         1.00, c_TU_Hellion);
    AICounterUnit(player, c_PU_Archon,              0.33, c_TU_Hellion);
    AICounterUnit(player, c_PU_Colossus,            1.00, c_TU_Thor);
    AICounterUnit(player, c_PU_VoidRay,             0.50, c_TU_Battlecruiser);
    AICounterUnit(player, c_PU_Phoenix,             0.50, c_TU_BattlecruiserMissile);
    AICounterUnit(player, c_PU_Carrier,             0.75, c_TU_BattlecruiserYamato);

    // versus Terran
    AICounterUnit(player, c_TB_Bunker,              0.33, c_TU_SiegeTank);
    AICounterUnit(player, c_TU_Marine,              0.50, c_TU_Hellion);
    AICounterUnit(player, c_TU_Reaper,              0.70, c_TU_Hellion);
    AICounterUnit(player, c_TU_Marauder,            0.50, c_TU_SiegeTank);
    AICounterUnit(player, c_TU_Ghost,               2.00, c_TU_Hellion);
    AICounterUnit(player, c_TU_Hellion,             0.25, c_TU_Thor);
    AICounterUnit(player, c_TU_SiegeTank_Alias,     0.50, c_TU_Thor);
    AICounterUnit(player, c_TU_Thor,                3.00, c_TU_Marauder);
    AICounterUnit(player, c_TU_Viking_Alias,        1.00, c_TU_Viking);
    AICounterUnit(player, c_TU_Banshee,             1.00, c_TU_Viking);
    AICounterUnit(player, c_TU_BattlecruiserClass,  1.00, c_TU_BattlecruiserYamato);

    // versus Zerg
    AICounterUnit(player, c_ZB_SpineCrawler,        0.33, c_TU_SiegeTank);
    AICounterUnit(player, c_ZU_Zergling,            0.25, c_TU_Hellion);
    AICounterUnit(player, c_ZU_Roach,               0.80, c_TU_Marauder);
    AICounterUnit(player, c_ZU_Hydralisk,           0.50, c_TU_Ghost);
    AICounterUnit(player, c_ZU_Lurker,              1.00, c_TU_Marauder);
    AICounterUnit(player, c_ZU_Infestor,            0.50, c_TU_Ghost);
    AICounterUnit(player, c_ZU_Ultralisk,           1.00, c_TU_Thor);
    AICounterUnit(player, c_ZU_Mutalisk,            0.80, c_TU_Viking);
    AICounterUnit(player, c_ZU_Corruptor,           0.50, c_TU_Battlecruiser);
    AICounterUnit(player, c_ZU_BroodLord,           0.50, c_TU_Viking);
}

//--------------------------------------------------------------------------------------------------
//  TerranSubStateName
//--------------------------------------------------------------------------------------------------
string TerranSubStateName (int state) {
    // TODO Call the individual difficulties to return a real substate name
    return "-" + IntToString(state) + "-";
}

//--------------------------------------------------------------------------------------------------
//  DebugCallbackTerr
//--------------------------------------------------------------------------------------------------
void DebugCallbackTerr (int player) {
    DebugAI("=====TERRAN=====n");
    DebugMelee(player);
    DebugAI("e_mainState = "        + MainStateName(AIState(player, e_mainState))           +
            ", e_mainSubState = "   + TerranSubStateName(AIState(player, e_mainSubState))   +
            ", e_attackState = "    + AttackStateName(AIState(player, e_attackState))
    );
}

//--------------------------------------------------------------------------------------------------
//  AINewUnitTerr   关于一些AI中错误的应对
//--------------------------------------------------------------------------------------------------
void AINewUnitTerr (int player, unit u) {
    wave w;
    string type = UnitGetType(u);

    // ignored units
    //
    if (UnitTypeTestAttribute(type, c_unitAttributeStructure)) {
        return;
    }
    if (UnitTypeTestFlag(type, c_unitFlagWorker)) {
        return;
    }
   
    if (type == c_TU_Medivac) {
        // TODO after normal scouting claims the ones it wants give the rest to the
        //      attack wave instead of the extra scout group
        AIAddToExtraScoutGroup(player, u);
        return;
    }

    // detector
    //
    if (type == c_TU_Raven) {
        AINewDetector(player, u, false);
        return;
    }

    // clear obstacle units
    //
    if (AIWaveNeedClearObsUnits(player)) {
        if (type == c_TU_Marine || type == c_TU_Reaper || type == c_TU_Marauder) {
            AIMergeUnit(player, u, AIWaveGet(player, c_waveClearObs));
            return;
        }
    }

    // diversion units
    if (AIGetFlag(player, e_flagsDiversion)) {
        if (type == c_TU_Reaper) {
            AIMergeUnit(player, u, AIWaveGet(player, c_waveDivert1));
            return;
        }
        if (type == c_TU_Banshee) {
            AIMergeUnit(player, u, AIWaveGet(player, c_waveDivert2));
            return;
        }
    }

    // main wave units
    //
    AINewUnitDefault(player, u);
}

//--------------------------------------------------------------------------------------------------
//  AIGetScoutTerr
//--------------------------------------------------------------------------------------------------
unit AIGetScoutTerr (int player, int index, unit prev) {
    unit medivac;
   
    if (!AIGetFlag(player, e_flagsScouting)) {
        return c_nullUnit;
    }
    if (UnitGetType(prev) == c_TU_Medivac) {
        return prev;
    }
    medivac = AIGrabUnit(player, c_TU_Medivac, c_prioScout, null);
    if (medivac) {
        return medivac;
    }
    if (prev) {
        return prev;
    }
    if (AIGetFlag(player, e_flagsLateScout)) {
        return c_nullUnit;
    }
    return AIGrabUnit(player, c_TU_SCV, c_prioScout, null);
}

//--------------------------------------------------------------------------------------------------
//  AIEarlyDefScoutTerr
//--------------------------------------------------------------------------------------------------
unit AIEarlyDefScoutTerr (int player, unit prev) {
    unit obs;
   
    if (!AIGetFlag(player, e_flagsEarlyDefScout)) {
        return c_nullUnit;
    }
    if (UnitGetType(prev) == c_TU_Medivac) {
        return prev;
    }
    obs = AIGrabUnit(player, c_TU_Medivac, c_prioScout, null);
    if (obs) {
        return obs;
    }
    if (UnitGetType(prev) == c_TU_Marine) {
        return prev;
    }
    obs = AIGrabUnit(player, c_TU_Marine, c_prioScout, null);
    if (obs) {
        return obs;
    }
    if (prev) {
        return prev;
    }
    return AIGrabUnit(player, c_TU_SCV, c_prioScout, null);
}


//--------------------------------------------------------------------------------------------------
//  AIWaveThinkTerr
//--------------------------------------------------------------------------------------------------
void AIWaveThinkTerr (int player, wave w, int type) {
    AIWaveThinkDefault(player, w, type);
}

//--------------------------------------------------------------------------------------------------
//  Terran Init 人族初始化
//--------------------------------------------------------------------------------------------------
static void TerranInit (int player) {
    int state;

    InitCounters(player);
    AISetNumScouts(player, 1);
    AISetFlag(player, e_flagsScouting, false);
    AISetFlag(player, e_flagsEarlyDefScout, false);
    AITechCountFixupEither(player, c_TB_CommandCenter, c_TB_OrbitalCommand, c_TB_PlanetaryFortress);

    if (AIGetGroundStartLocs(PlayerStartLocation(player)) > 0) {
        state = AIDiffEnum(player, e_mainState_OpenGnd0);
    }
    else {
        state = AIDiffEnum(player, e_mainState_OpenAir0);
    }
    AISetMainState(player, state, e_mainSubState_Unset);
}

//--------------------------------------------------------------------------------------------------
//  AIMeleeTerr
//--------------------------------------------------------------------------------------------------
void AIMeleeTerr (int player) {
    int mainState = AIState(player, e_mainState);

    if (mainState == e_mainState_Init)              { TerranInit(player);     }

    else if (mainState == e_mainState_OpenGnd0)     { TerranOpenGnd0(player); }
    //else if (mainState == e_mainState_OpenGnd1)     { TerranOpenGnd1(player); }
    //else if (mainState == e_mainState_OpenGnd2)     { TerranOpenGnd2(player); }
    //else if (mainState == e_mainState_OpenGnd3)     { TerranOpenGnd3(player); }
    //else if (mainState == e_mainState_OpenGnd4)     { TerranOpenGnd4(player); }
    //else if (mainState == e_mainState_OpenGnd5)     { TerranOpenGnd5(player); }

    else if (mainState == e_mainState_OpenAir0)     { TerranOpenAir0(player); }
    //else if (mainState == e_mainState_OpenAir1)     { TerranOpenAir1(player); }
    //else if (mainState == e_mainState_OpenAir2)     { TerranOpenAir2(player); }
    //else if (mainState == e_mainState_OpenAir3)     { TerranOpenAir3(player); }
    //else if (mainState == e_mainState_OpenAir4)     { TerranOpenAir4(player); }
    //else if (mainState == e_mainState_OpenAir5)     { TerranOpenAir5(player); }

    else if (mainState == e_mainState_Mid0)         { TerranMid0(player);     }
    //else if (mainState == e_mainState_Mid1)         { TerranMid1(player);     }
    //else if (mainState == e_mainState_Mid2)         { TerranMid2(player);     }
    //else if (mainState == e_mainState_Mid3)         { TerranMid3(player);     }
    //else if (mainState == e_mainState_Mid4)         { TerranMid4(player);     }
    //else if (mainState == e_mainState_Mid5)         { TerranMid5(player);     }

    else if (mainState == e_mainState_Late0)        { TerranLate0(player);    }
    //else if (mainState == e_mainState_Late1)        { TerranLate1(player);    }
    //else if (mainState == e_mainState_Late2)        { TerranLate2(player);    }
    //else if (mainState == e_mainState_Late3)        { TerranLate3(player);    }
    //else if (mainState == e_mainState_Late4)        { TerranLate4(player);    }
    //else if (mainState == e_mainState_Late5)        { TerranLate5(player);    }

    else if (mainState == e_mainState_Off)          { EndMeleeScript(player); }
    else if (mainState == e_mainState_Disabled)     {                         }
   
    else { ErrorMeleeScript(player, "Invalid mainState"); } //这个就是大家看到的错误信息
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-4-4 17:20 , Processed in 0.645644 second(s), 18 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表