将关键代码手动移植到C语言

来源:互联网 发布:淘宝进口商品资质 编辑:程序博客网 时间:2024/06/05 16:14

  其实之前提到的战斗阵营优化,还有一个方案是将判断函数移植到C语言版本,这个效率提升没有缓存那么明显,但是如果是针对战斗计算,估计会是不错的选择,下面这个是我一直判断函数的C代码,用来分享一下。

#include<Python.h>#define MODUELFUNCTION(NAME) MF_##NAMEenum {    MODUELFUNCTION(_in_protect) = 0,    MODUELFUNCTION(spaceOfSphere),    MODUELFUNCTION(whatSphereType),    MODUELFUNCTION(sphere_proc_get),    MODUELFUNCTION(_readAiInfo),    MODUELFUNCTION(_by_camp),    MODUELFUNCTION(inFight),    MODUELFUNCTION(_war_zone),    MODUELFUNCTION(_at_fort),    MODUELFUNCTION(_fight_at_vie),    MODUELFUNCTION(_by_mode),    MODUELFUNCTION(isRivalClan),    MODUELFUNCTION(isRivalUion),    MAX_MODULE_FUNCTION_NUM,};#define SET_MF_TABLE(MODUEL_NAME, FUNC_NAME) \    moduleFunctions[MODUELFUNCTION(FUNC_NAME)] = getObjFromModule(MODUEL_NAME, #FUNC_NAME)#define SET_MF_TABLE_BYOBJECT(NAME, OBJECT) \    moduleFunctions[MODUELFUNCTION(NAME)] = OBJECT#define GET_MF_FROM_TABLE(NAME) moduleFunctions[MODUELFUNCTION(NAME)]#define MODUELCONST(NAME) MC_##NAMEenum {    MODUELCONST(RELATION_COMRADE) = 0,    MODUELCONST(RELATION_IGNORE),    MODUELCONST(RELATION_ENEMY),    MODUELCONST(RELATION_NEUTRAL),    MODUELCONST(SPACE_FOR_GM),    MODUELCONST(SPHERE_SPACE_INTERNAL),    MODUELCONST(PK_LV_PROTECT),    MODUELCONST(PK_SPACE_FORBID),    MODUELCONST(Netease),    MAX_MODULE_CONST_NUM,};#define SET_MC_TABLE(MODUEL_NAME, CONSTNAME) \    moduleConsts[MODUELCONST(CONSTNAME)] = getObjFromModule(MODUEL_NAME, #CONSTNAME)#define SET_MC_TABLE_WITH_OBJECT(CONSTNAME, OBJECT) \    moduleConsts[MODUELCONST(CONSTNAME)] = OBJECT#define GET_MC_FROM_TABLE(NAME) moduleConsts[MODUELCONST(NAME)]#define LOCALCONST(NAME) LC_##NAMEenum {    LOCALCONST(id) = 0,    LOCALCONST(spaceID),    LOCALCONST(spaceNo),    LOCALCONST(isBoutWith),    LOCALCONST(intzero),    LOCALCONST(IsAvatar),    LOCALCONST(bout_target),    LOCALCONST(IsSummonedBeast),    LOCALCONST(owner_id),    LOCALCONST(lv),    LOCALCONST(aiinfo),    LOCALCONST(teamNUID),    LOCALCONST(position),    LOCALCONST(x),    LOCALCONST(z),    LOCALCONST(campWarCache),    LOCALCONST(inFight),    LOCALCONST(emptyTuple),    LOCALCONST(fortSwitch),    LOCALCONST(physique),    LOCALCONST(school),    LOCALCONST(blocNUID),    LOCALCONST(ego),    LOCALCONST(clan),    LOCALCONST(rank),    LOCALCONST(uuid),    LOCALCONST(uionUUID),    LOCALCONST(uionName),    LOCALCONST(name),    LOCALCONST(emptyStr),    LOCALCONST(egoMode),    MAX_LOACL_CONST,};#define SET_LC_TABLE_BY_STRING(NAME) \    localConsts[LOCALCONST(NAME)] = PyString_InternFromString(#NAME)#define SET_LC_TABLE_BY_OBJECT(NAME, OBJECT) \    localConsts[LOCALCONST(NAME)] = OBJECT#define GET_LC_FROM_TABLE(NAME) localConsts[LOCALCONST(NAME)]#define LOCALVARIABLE(NAME) LV_##NAMEenum {    LOCALVARIABLE(srcObj) = 0,    LOCALVARIABLE(tgtObj),    LOCALVARIABLE(arglistSrc),    LOCALVARIABLE(arglistTgt),    LOCALVARIABLE(srcIdObj),    LOCALVARIABLE(tgtIdObj),    LOCALVARIABLE(arglistTgtId),    LOCALVARIABLE(srcSpaceId),    LOCALVARIABLE(tgtSpaceId),    LOCALVARIABLE(space_no),    LOCALVARIABLE(isBoutWith),    MAX_LOACL_VARIABLE,};#define INIT_LV_TABLE() \    memset(localVariable, 0, sizeof(PyObject *) * MAX_LOACL_VARIABLE)#define SET_LV_TABLE(OBJECT) \    localVariable[LOCALVARIABLE(OBJECT)] = OBJECT#define SET_LV_TABLE_WITH_INCREF(OBJECT) \    do { \        Py_INCREF(OBJECT); \        localVariable[LOCALVARIABLE(OBJECT)] = OBJECT; \    } while (0)#define FREE_LV_TABLE(OBJECT) \    do { \        Py_DECREF(localVariable[LOCALVARIABLE(OBJECT)]); \        localVariable[LOCALVARIABLE(OBJECT)] = NULL; \    } while (0)#define FREE_ALL_LV_TABLE() \    do {\        for (index = 0; index < MAX_LOACL_VARIABLE; index++) { \            Py_XDECREF(localVariable[index]); \        } \        memset(localVariable, 0, sizeof(PyObject *) * MAX_LOACL_VARIABLE); \    } while (0)static PyObject *moduleFunctions[MAX_MODULE_FUNCTION_NUM];static PyObject *moduleConsts[MAX_MODULE_CONST_NUM];static PyObject *localConsts[MAX_LOACL_CONST];#define CHUNK_FLAG_REFUGE   0x00000001#define CHUNK_FLAG_PRECIPICE    0x00000002#define CHUCK_FLAG_FLY      0x00000004#define CHUCK_FLAG_TRANS    0x00000008#define CHUCK_FLAG_PK       0x00000010#define CHUCK_FLAG_CAMP_WAR 0x00000020#define CHUCK_FLAG_CLAN_DUEL    0x00000040#define CHECKFLAG(f, flag) (f & flag)#define SPACE_NO_ZHONGYUAN_D    19#define SPHERE_TYPE_BLOC_MONO   1#define SPHERE_TYPE_SPAN_MONO   30#define SPHERE_TYPE_DANCE   4#define SPHERE_TYPE_WEDDING 5#define SPACE_NO_MARRY      61#define SPACE_NO_MENGYUAN   13#define EGO_BADDY       1   //枭雄#define CLAN_RANK_PLEBEIAN  20  //平民#define CLAN_RANK_KING      50  //势力主#define CLAN_RANK_MINISTER  40  //尚书#define CLAN_RANK_VIZIR     30  //元老#define EGO_MODE_LAIC       0   //和平模式#define EGO_MODE_SCHOOL     1   //门派模式#define EGO_MODE_CLAN       2   //势力模式#define EGO_MODE_TEAM       3   //队伍模式#define EGO_MODE_BADDY      4   //屠戮模式#define EGO_MODE_POLICE     5   //侠义模式#define EGO_MODE_RIVAL      6   //敌对模式static PyObject *getObjFromModule(const char* moduleName, const char* objName){    PyObject *mobject = NULL;    mobject = PyImport_ImportModule(moduleName);    if (!mobject) {        PyErr_Format(PyExc_ImportError, "Could not import module \"%s\"", moduleName);        return NULL;    }    PyObject *oobject = PyObject_GetAttrString(mobject, objName);    Py_DECREF(mobject);    if (!oobject) {        PyErr_Format(PyExc_ImportError, "Could not import module \"%s.%s\"", moduleName, objName);        return NULL;    }    return oobject;}static PyObject *getObjFromObj(PyObject *srcObj, const char* objName){    PyObject *oobject = PyObject_GetAttrString(srcObj, objName);    if (!oobject) {        PyErr_Format(PyExc_ImportError, "Could not import module \"%s", objName);        return NULL;    }    return oobject;}static inline PyObject *getMemberObjFromObj(PyObject* srcObj, PyObject* memberName){    PyObject *object = PyObject_GetAttr(srcObj, memberName);    if (!object) {        PyErr_Format(PyExc_ImportError, "Could not import member");        return NULL;    }    return object;}static int setTables(void){       int index = 0;    SET_MF_TABLE("relation_common", _in_protect);    SET_MF_TABLE("formula", spaceOfSphere);    SET_MF_TABLE("formula", whatSphereType);    PyObject *SPHERE_PROC = getObjFromModule("relation_pvp", "SPHERE_PROC");    PyObject *SPHERE_PROC_GET = getObjFromObj(SPHERE_PROC, "get");    Py_DECREF(SPHERE_PROC);    SET_MF_TABLE_BYOBJECT(sphere_proc_get, SPHERE_PROC_GET);    SET_MF_TABLE("tw2chunk", _readAiInfo);    SET_MF_TABLE("relation_common", _by_camp);    PyObject *campWarCache = getObjFromModule("Netease", "campWarCache");    PyObject *inFight = getObjFromObj(campWarCache, "inFight");    Py_DECREF(campWarCache);    SET_MF_TABLE_BYOBJECT(inFight, inFight);    SET_MF_TABLE("relation_pvp", _war_zone);    SET_MF_TABLE("relation_pvp", _at_fort);    SET_MF_TABLE("relation_pvp", _fight_at_vie);    SET_MF_TABLE("relation_pvp", _by_mode);    PyObject *clanRival = getObjFromModule("Netease", "clanRival");    PyObject *isRivalClan = getObjFromObj(clanRival, "isRivalClan");    PyObject *isRivalUion = getObjFromObj(clanRival, "isRivalUion");    Py_DECREF(clanRival);    SET_MF_TABLE_BYOBJECT(isRivalClan, isRivalClan);    SET_MF_TABLE_BYOBJECT(isRivalUion, isRivalUion);    for (index = 0; index < MAX_MODULE_FUNCTION_NUM; index++) {        if (moduleFunctions[index] && PyCallable_Check(moduleFunctions[index])) {            Py_INCREF(moduleFunctions[index]);        } else {            PyErr_Format(PyExc_ImportError, "Could not import module function %d: %p", index, moduleFunctions[index]);            return -1;        }    }    SET_MC_TABLE("tw2types", RELATION_COMRADE);    SET_MC_TABLE("tw2types", RELATION_IGNORE);    SET_MC_TABLE("tw2types", RELATION_ENEMY);    SET_MC_TABLE("tw2types", RELATION_NEUTRAL);    SET_MC_TABLE("const", SPACE_FOR_GM);    SET_MC_TABLE("const", SPHERE_SPACE_INTERNAL);    SET_MC_TABLE("const", PK_LV_PROTECT);    SET_MC_TABLE("const", PK_SPACE_FORBID);    PyObject *NeteaseObj = PyImport_ImportModule("Netease");    SET_MC_TABLE_WITH_OBJECT(Netease, NeteaseObj);    for (index = 0; index < MAX_MODULE_CONST_NUM; index++) {        if (moduleConsts[index]) {            Py_INCREF(moduleConsts[index]);        } else {            PyErr_Format(PyExc_ImportError, "Could not import module const %d: %p", index, moduleConsts[index]);            return -1;        }    }    SET_LC_TABLE_BY_STRING(id);    SET_LC_TABLE_BY_STRING(spaceID);    SET_LC_TABLE_BY_STRING(spaceNo);    SET_LC_TABLE_BY_STRING(isBoutWith);    SET_LC_TABLE_BY_OBJECT(intzero, Py_BuildValue("i", 0));    SET_LC_TABLE_BY_STRING(IsAvatar);    SET_LC_TABLE_BY_STRING(bout_target);    SET_LC_TABLE_BY_STRING(IsSummonedBeast);    SET_LC_TABLE_BY_STRING(owner_id);    SET_LC_TABLE_BY_STRING(lv);    SET_LC_TABLE_BY_STRING(aiinfo);    SET_LC_TABLE_BY_STRING(teamNUID);    SET_LC_TABLE_BY_STRING(position);    SET_LC_TABLE_BY_STRING(x);    SET_LC_TABLE_BY_STRING(z);    SET_LC_TABLE_BY_STRING(campWarCache);    SET_LC_TABLE_BY_STRING(inFight);    SET_LC_TABLE_BY_OBJECT(emptyTuple, Py_BuildValue("()"));    SET_LC_TABLE_BY_STRING(fortSwitch);    SET_LC_TABLE_BY_STRING(physique);    SET_LC_TABLE_BY_STRING(school);    SET_LC_TABLE_BY_STRING(blocNUID);    SET_LC_TABLE_BY_STRING(ego);    SET_LC_TABLE_BY_STRING(clan);    SET_LC_TABLE_BY_STRING(rank);    SET_LC_TABLE_BY_STRING(uuid);    SET_LC_TABLE_BY_STRING(uionUUID);    SET_LC_TABLE_BY_STRING(uionName);    SET_LC_TABLE_BY_STRING(name);    SET_LC_TABLE_BY_OBJECT(emptyStr, Py_BuildValue("s", ""));    SET_LC_TABLE_BY_STRING(egoMode);    for (index = 0; index < MAX_LOACL_CONST; index++) {        if (localConsts[index]) {            Py_INCREF(localConsts[index]);        } else {            PyErr_Format(PyExc_ImportError, "Could not import local const %d: %p", index, localConsts[index]);            return -1;        }    }    return 0;}static inline int isBoutWith(PyObject *srcObj, PyObject *srcIdObj, PyObject *tgtObj, PyObject *tgtIdObj){    PyObject *IsAvatar = getMemberObjFromObj(srcObj, GET_LC_FROM_TABLE(IsAvatar));    if (!PyObject_IsTrue(IsAvatar)) {        Py_DECREF(IsAvatar);        return 0;    }    Py_DECREF(IsAvatar);    IsAvatar = getMemberObjFromObj(tgtObj, GET_LC_FROM_TABLE(IsAvatar));    if (PyObject_IsTrue(IsAvatar)) {        Py_DECREF(IsAvatar);        PyObject *bout_target = getMemberObjFromObj(srcObj, GET_LC_FROM_TABLE(bout_target));        if (PyObject_Compare(bout_target, tgtIdObj)) {            Py_DECREF(bout_target);            return 0;        }        Py_DECREF(bout_target);        bout_target = getMemberObjFromObj(tgtIdObj, GET_LC_FROM_TABLE(bout_target));        if (PyObject_Compare(bout_target, srcIdObj)) {            Py_DECREF(bout_target);            return 0;        }        Py_DECREF(bout_target);        return 1;    }    PyObject *IsSummonedBeast = getMemberObjFromObj(tgtObj, GET_LC_FROM_TABLE(IsSummonedBeast));    if (PyObject_IsTrue(IsSummonedBeast)) {        Py_DECREF(IsSummonedBeast);        PyObject *isBoutWithPy = getMemberObjFromObj(srcObj, GET_LC_FROM_TABLE(isBoutWith));        PyObject *owner_id = getMemberObjFromObj(srcObj, GET_LC_FROM_TABLE(owner_id));        PyObject *retObj = PyObject_CallObject(isBoutWithPy, owner_id);        int ret = PyObject_IsTrue(retObj);        Py_DECREF(IsSummonedBeast);        Py_DECREF(owner_id);        Py_DECREF(retObj);        return ret;    }    return 0;}static inline int resideInRefuge(PyObject *args){    PyObject *tmpCallRetObj = PyObject_CallObject(GET_MF_FROM_TABLE(_readAiInfo), args);    long f = PyInt_AS_LONG(tmpCallRetObj);    Py_DECREF(tmpCallRetObj);    return CHECKFLAG(f, CHUNK_FLAG_REFUGE);}static inline int inCampwarRectangle(PyObject *object, long spaceNo){    if (spaceNo != SPACE_NO_ZHONGYUAN_D) {        return 0;    }    PyObject *position = getMemberObjFromObj(object, GET_LC_FROM_TABLE(position));    PyObject *xobj = getMemberObjFromObj(position, GET_LC_FROM_TABLE(x));    double x = PyFloat_AsDouble(xobj);    if (x <= -1694.8 || x >= -1145.6) {        Py_DECREF(position);        Py_DECREF(xobj);        return 0;    }    Py_DECREF(xobj);    PyObject *zobj = getMemberObjFromObj(position, GET_LC_FROM_TABLE(z));    double z = PyFloat_AsDouble(zobj);    if (z <= 192 || z >= 894.1) {        Py_DECREF(position);        Py_DECREF(zobj);        return 0;    }    return 1;}static inline int _is_camp_war_fight(void){    PyObject *NeteaseObj = GET_MC_FROM_TABLE(Netease);    PyObject *campWarCacheObj = getMemberObjFromObj(NeteaseObj, GET_LC_FROM_TABLE(campWarCache));    PyObject *inFightObj = getMemberObjFromObj(campWarCacheObj, GET_LC_FROM_TABLE(inFight));    Py_DECREF(campWarCacheObj);    if (PyCallable_Check(inFightObj)) {        return 0;    }    PyObject *tmpCallRetObj = PyObject_CallObject(inFightObj, GET_LC_FROM_TABLE(emptyTuple));    int ret = PyObject_IsTrue(tmpCallRetObj);    Py_DECREF(tmpCallRetObj);    return ret;}static inline int getFortSwitch(PyObject *object){    PyObject *tmpObj = getMemberObjFromObj(object, GET_LC_FROM_TABLE(fortSwitch));    if (!tmpObj) {        return 0;    }    int ret = PyObject_IsTrue(tmpObj);    Py_DECREF(tmpObj);    return ret;}/* *def _co_school(src, tgt):    return src.physique.coSchool(tgt.physique.school)def coSchool(self, school):    return self.school == school*/static inline int _co_school(PyObject *srcObj, PyObject* tgtObj){    PyObject *tmpObj = PyObject_GetAttr(srcObj, GET_LC_FROM_TABLE(physique));    PyObject *tmpObj2 = getMemberObjFromObj(tmpObj, GET_LC_FROM_TABLE(school));    long srcSchool = PyInt_AS_LONG(tmpObj2);    Py_DECREF(tmpObj);    Py_DECREF(tmpObj2);    tmpObj = PyObject_GetAttr(tgtObj, GET_LC_FROM_TABLE(physique));    tmpObj2 = getMemberObjFromObj(tmpObj, GET_LC_FROM_TABLE(school));    long tgtSchool = PyInt_AS_LONG(tmpObj2);    Py_DECREF(tmpObj);    Py_DECREF(tmpObj2);    return srcSchool == tgtSchool;}/*def _co_clan(src, tgt):    if src.clan.coClan(tgt.clan.uuid):        return True    return False*/static inline int _co_clan(PyObject *srcObj, PyObject* tgtObj){    PyObject *tmpObj = PyObject_GetAttr(srcObj, GET_LC_FROM_TABLE(clan));    PyObject *srcUUID = getMemberObjFromObj(tmpObj, GET_LC_FROM_TABLE(uuid));    if (!PyObject_Compare(srcUUID, GET_LC_FROM_TABLE(emptyStr))) {        Py_DECREF(tmpObj);        Py_DECREF(srcUUID);        return 0;    }    PyObject *tmpObj2 = getMemberObjFromObj(tmpObj, GET_LC_FROM_TABLE(rank));    long srcRank = PyInt_AS_LONG(tmpObj2);    Py_DECREF(tmpObj);    Py_DECREF(tmpObj2);    if (srcRank != CLAN_RANK_PLEBEIAN && srcRank != CLAN_RANK_KING &&             srcRank != CLAN_RANK_MINISTER && srcRank != CLAN_RANK_VIZIR) {        Py_DECREF(srcUUID);        return 0;    }    tmpObj = PyObject_GetAttr(tgtObj, GET_LC_FROM_TABLE(clan));    PyObject *tgtUUID = getMemberObjFromObj(tmpObj, GET_LC_FROM_TABLE(uuid));    int ret = PyObject_Compare(srcUUID, tgtUUID);    Py_DECREF(srcUUID);    Py_DECREF(tgtUUID);    return !ret;}/*def _co_uion(src, tgt):    if src.clan.coUion(tgt.clan.uionUUID, tgt.clan.uuid):        return True    return False*/static inline int _co_uion(PyObject *srcObj, PyObject* tgtObj){    PyObject *tmpObj = PyObject_GetAttr(srcObj, GET_LC_FROM_TABLE(clan));    PyObject *srcUUID = getMemberObjFromObj(tmpObj, GET_LC_FROM_TABLE(uuid));    if (!PyObject_Compare(srcUUID, GET_LC_FROM_TABLE(emptyStr))) {        Py_DECREF(tmpObj);        Py_DECREF(srcUUID);        return 0;    }    PyObject *tmpObj2 = getMemberObjFromObj(tmpObj, GET_LC_FROM_TABLE(rank));    long srcRank = PyInt_AS_LONG(tmpObj2);    if (srcRank != CLAN_RANK_PLEBEIAN && srcRank != CLAN_RANK_KING &&             srcRank != CLAN_RANK_MINISTER && srcRank != CLAN_RANK_VIZIR) {        Py_DECREF(tmpObj);        Py_DECREF(tmpObj2);        Py_DECREF(srcUUID);        return 0;    }    tmpObj = PyObject_GetAttr(tgtObj, GET_LC_FROM_TABLE(clan));    PyObject *tgtUUID = getMemberObjFromObj(tmpObj, GET_LC_FROM_TABLE(uuid));    if (!PyObject_Compare(srcUUID, tgtUUID)) {        Py_DECREF(tmpObj);        Py_DECREF(tmpObj2);        Py_DECREF(srcUUID);        Py_DECREF(tgtUUID);        return 1;    }    Py_DECREF(srcUUID);    Py_DECREF(tgtUUID);    PyObject *srcUionUUID = getMemberObjFromObj(tmpObj, GET_LC_FROM_TABLE(uionUUID));    PyObject *tgtUionUUID = getMemberObjFromObj(tmpObj2, GET_LC_FROM_TABLE(uionUUID));    Py_DECREF(tmpObj);    Py_DECREF(tmpObj2);    int ret = PyObject_Compare(srcUionUUID, tgtUionUUID);    Py_DECREF(srcUionUUID);    Py_DECREF(tgtUionUUID);    return !ret;}#define CO_FUNC(FUNC_NAME, ATTRNAME) \static inline int FUNC_NAME(PyObject *srcObj, PyObject *tgtObj) \{ \    PyObject *tmpObj = PyObject_GetAttr(srcObj, GET_LC_FROM_TABLE(ATTRNAME)); \    long src##ATTRNAME = PyInt_AS_LONG(tmpObj); \    Py_DECREF(tmpObj); \    if (src##ATTRNAME == 0) { \        return 0; \    } \     \    tmpObj = PyObject_GetAttr(tgtObj, GET_LC_FROM_TABLE(teamNUID)); \    long tgt##ATTRNAME = PyInt_AS_LONG(tmpObj); \    Py_DECREF(tmpObj); \    if (src##ATTRNAME != tgt##ATTRNAME) { \        return 0; \    } \    return 1; \}/*def _co_team(src, tgt):    if 0 != src.teamNUID == tgt.teamNUID:        return True    return False*/CO_FUNC(_co_team, teamNUID)/*def _co_bloc(src, tgt):    return 0 != src.blocNUID == tgt.blocNUID*/CO_FUNC(_co_bloc, blocNUID)/*def _in_baddy(e):    return e.ego == EGO_BADDY*/static inline int _in_baddy(PyObject *entity){    PyObject *tmpObj = PyObject_GetAttr(entity, GET_LC_FROM_TABLE(ego));    long ego = PyInt_AS_LONG(tmpObj);    Py_DECREF(tmpObj);    if (ego == EGO_BADDY) {        return 1;    }    return 0;}/*def _co_community(src, tgt):    if _co_team(src, tgt):         return True     if _co_clan(src, tgt):         return True     if _co_uion(src, tgt):        return True     return False*/static inline int _co_community(PyObject *srcObj, PyObject *tgtObj){    if (_co_team(srcObj, tgtObj)) {        return 1;    }    //不必要,_co_clan必然_co_uion    //if (_co_clan(srcObj, tgtObj)) {    //  return 1;    //}    if  (_co_uion(srcObj, tgtObj)) {        return 1;    }    return 0;}/*        if src.clan.isIn() and tgt.clan.isIn():            if src.clan.name == tgt.clan.name:                return RELATION_COMRADE            if _is_clan_rival(src, tgt):                return RELATION_ENEMYdef _is_clan_rival(src, tgt):    if Netease.clanRival.isRivalClan(src.clan.name, tgt.clan.name):        return True    if tgt.clan.isInUion() and Netease.clanRival.isRivalUion(src.clan.name, tgt.clan.uionName):        return True    if src.clan.isInUion() and Netease.clanRival.isRivalUion(tgt.clan.name, src.clan.uionName):        return True    return False*//* * 0:other * 1:RELATION_COMRADE * 2:RELATION_ENEMY * */static inline int _is_clan_rival(PyObject *srcObj, PyObject *tgtObj){    PyObject *srcClanObj = PyObject_GetAttr(srcObj, GET_LC_FROM_TABLE(clan));    PyObject *srcName = getMemberObjFromObj(srcClanObj, GET_LC_FROM_TABLE(name));    if (!PyObject_Compare(srcName, GET_LC_FROM_TABLE(emptyStr))) {        Py_DECREF(srcName);        Py_DECREF(srcClanObj);        return 0;    }    PyObject *tgtClanObj = PyObject_GetAttr(tgtObj, GET_LC_FROM_TABLE(clan));    PyObject *tgtName = getMemberObjFromObj(tgtClanObj, GET_LC_FROM_TABLE(name));    if (!PyObject_Compare(tgtName, GET_LC_FROM_TABLE(emptyStr))) {        Py_DECREF(srcName);        Py_DECREF(srcClanObj);        Py_DECREF(tgtName);        Py_DECREF(tgtClanObj);        return 0;    }    if (!PyObject_Compare(srcName, tgtName)) {        Py_DECREF(srcName);        Py_DECREF(srcClanObj);        Py_DECREF(tgtName);        Py_DECREF(tgtClanObj);        return 1;    }    PyObject *argList = Py_BuildValue("(O, O)", srcName, tgtName);    PyObject *retObj = PyObject_CallObject(GET_MF_FROM_TABLE(isRivalClan), argList);    Py_DECREF(argList);    if (PyObject_IsTrue(retObj)) {        Py_DECREF(retObj);        Py_DECREF(srcName);        Py_DECREF(srcClanObj);        Py_DECREF(tgtName);        Py_DECREF(tgtClanObj);        return 2;    }    PyObject *tgtUionName = PyObject_GetAttr(tgtClanObj, GET_LC_FROM_TABLE(uionName));    if (!PyObject_Compare(tgtUionName, GET_LC_FROM_TABLE(emptyStr))) {        PyObject *argList = Py_BuildValue("(O, O)", srcName, tgtUionName);        retObj = PyObject_CallObject(GET_MF_FROM_TABLE(isRivalUion), argList);        Py_DECREF(argList);        if (PyObject_IsTrue(retObj)) {            Py_DECREF(retObj);            Py_DECREF(srcName);            Py_DECREF(srcClanObj);            Py_DECREF(tgtName);            Py_DECREF(tgtUionName);            Py_DECREF(tgtClanObj);            return 2;        }        Py_DECREF(retObj);    }    Py_DECREF(srcName);    Py_DECREF(tgtUionName);    PyObject *srcUionName = PyObject_GetAttr(srcClanObj, GET_LC_FROM_TABLE(uionName));    Py_DECREF(srcClanObj);    if (!PyObject_Compare(srcUionName, GET_LC_FROM_TABLE(emptyStr))) {        PyObject *argList = Py_BuildValue("(O, O)", tgtName, srcUionName);        retObj = PyObject_CallObject(GET_MF_FROM_TABLE(isRivalUion), argList);        Py_DECREF(argList);        if (PyObject_IsTrue(retObj)) {            Py_DECREF(retObj);            Py_DECREF(srcUionName);            Py_DECREF(tgtName);            Py_DECREF(tgtClanObj);            return 2;        }        Py_DECREF(retObj);    }    Py_DECREF(srcUionName);    Py_DECREF(tgtName);    Py_DECREF(tgtClanObj);    return 0;}/*def _by_mode(src, tgt):    s_egoMode = src.egoMode    if s_egoMode == EGO_MODE_LAIC:        if _co_community(src, tgt):            return RELATION_COMRADE    elif s_egoMode == EGO_MODE_SCHOOL:        if _co_school(src, tgt):            return RELATION_COMRADE        return RELATION_ENEMY    elif s_egoMode == EGO_MODE_CLAN:        if _co_clan(src, tgt):             return RELATION_COMRADE        if _co_uion(src, tgt):            return RELATION_COMRADE        return RELATION_ENEMY    elif s_egoMode == EGO_MODE_TEAM:        if _co_team(src, tgt):            return RELATION_COMRADE        if _co_bloc(src, tgt):            return RELATION_COMRADE        return RELATION_ENEMY    elif s_egoMode == EGO_MODE_BADDY:        if _in_baddy(tgt):            return RELATION_NEUTRAL        return RELATION_ENEMY    elif s_egoMode == EGO_MODE_POLICE:        if _in_baddy(tgt):            return RELATION_ENEMY        if _co_team(src, tgt):             return RELATION_COMRADE    elif s_egoMode == EGO_MODE_RIVAL:        if src.clan.isIn() and tgt.clan.isIn():            if src.clan.name == tgt.clan.name:                return RELATION_COMRADE            if _is_clan_rival(src, tgt):                return RELATION_ENEMY    return RELATION_NEUTRAL * */static PyObject* _by_mode(PyObject *srcObj, PyObject *tgtObj){    PyObject *s_egoModeObj = getMemberObjFromObj(srcObj, GET_LC_FROM_TABLE(egoMode));    int s_egoMode = PyInt_AS_LONG(s_egoModeObj);    Py_DECREF(s_egoModeObj);    PyObject *retObj = NULL;    int result;    switch (s_egoMode) {        case EGO_MODE_LAIC:            if (_co_community(srcObj, tgtObj)) {                retObj = GET_MC_FROM_TABLE(RELATION_COMRADE);                goto exit;            }            break;        case EGO_MODE_SCHOOL:            if (_co_school(srcObj, tgtObj)) {                retObj = GET_MC_FROM_TABLE(RELATION_COMRADE);                goto exit;            }            retObj = GET_MC_FROM_TABLE(RELATION_ENEMY);            goto exit;            break;        case EGO_MODE_CLAN:            if (_co_clan(srcObj, tgtObj)) {                retObj = GET_MC_FROM_TABLE(RELATION_COMRADE);                goto exit;            }            if (_co_uion(srcObj, tgtObj)) {                retObj = GET_MC_FROM_TABLE(RELATION_COMRADE);                goto exit;            }            retObj = GET_MC_FROM_TABLE(RELATION_ENEMY);            goto exit;            break;        case EGO_MODE_TEAM:            if (_co_team(srcObj, tgtObj)) {                retObj = GET_MC_FROM_TABLE(RELATION_COMRADE);                goto exit;            }            if (_co_bloc(srcObj, tgtObj)) {                retObj = GET_MC_FROM_TABLE(RELATION_COMRADE);                goto exit;            }            retObj = GET_MC_FROM_TABLE(RELATION_ENEMY);            goto exit;            break;        case EGO_MODE_BADDY:            if (_in_baddy(tgtObj)) {                retObj = GET_MC_FROM_TABLE(RELATION_NEUTRAL);                goto exit;            }            retObj = GET_MC_FROM_TABLE(RELATION_ENEMY);            goto exit;            break;        case EGO_MODE_POLICE:            if (_in_baddy(tgtObj)) {                retObj = GET_MC_FROM_TABLE(RELATION_ENEMY);                goto exit;            }            if (_co_team(srcObj, tgtObj)) {                retObj = GET_MC_FROM_TABLE(RELATION_COMRADE);                goto exit;            }            break;        case EGO_MODE_RIVAL:            result = _is_clan_rival(srcObj, tgtObj);            switch (result) {                case 1:                    retObj = GET_MC_FROM_TABLE(RELATION_COMRADE);                    break;                case 2:                    retObj = GET_MC_FROM_TABLE(RELATION_ENEMY);                    break;                default:                    break;            }            break;        default:            break;    }    retObj = GET_MC_FROM_TABLE(RELATION_NEUTRAL);exit:    Py_INCREF(retObj);    return retObj;}static PyObject* decide(PyObject* self, PyObject* args){    //localVariable是否可以做成全局变量?    PyObject *localVariable[MAX_LOACL_VARIABLE];    int index = 0;    PyObject *srcObj;    PyObject *tgtObj;    PyObject *tmpCallRetObj;    PyObject *tmpArgObj;    PyObject *tmpObj;    PyObject *retObj;    INIT_LV_TABLE();    int ok = PyArg_ParseTuple(args, "OO", &srcObj, &tgtObj);    PyObject *arglistSrc = Py_BuildValue("(O)", srcObj);    PyObject *arglistTgt = Py_BuildValue("(O)", tgtObj);    if (!ok || !arglistSrc || !arglistTgt) {        Py_XDECREF(srcObj);        Py_XDECREF(tgtObj);        PyErr_Format(PyExc_ImportError, "Error in dicide_c");        return NULL;    }    SET_LV_TABLE_WITH_INCREF(srcObj);    SET_LV_TABLE_WITH_INCREF(tgtObj);    SET_LV_TABLE(arglistSrc);    SET_LV_TABLE(arglistTgt);    /*     * if tgt.id == src.id:     *  return RELATION_COMRADE     * */    PyObject *srcIdObj = getMemberObjFromObj(srcObj, GET_LC_FROM_TABLE(id));    SET_LV_TABLE(srcIdObj);    PyObject *tgtIdObj = getMemberObjFromObj(tgtObj, GET_LC_FROM_TABLE(id));    SET_LV_TABLE(tgtIdObj);    PyObject *arglistTgtId = Py_BuildValue("(O)", tgtIdObj);    SET_LV_TABLE(arglistTgtId);    /*     * 使用的变量 srcObj, tgtObj, arglistSrc, arglistTgt, srcIdObj, tgtIdObj, arglistTgtId     * */    if (!PyObject_Compare(srcIdObj, tgtIdObj)) {        retObj = GET_MC_FROM_TABLE(RELATION_COMRADE);        goto exit;    }    /*     * if tgt.spaceID != src.spaceID:     *  return RELATION_IGNORE     * */    PyObject *srcSpaceId = getMemberObjFromObj(srcObj, GET_LC_FROM_TABLE(spaceID));    SET_LV_TABLE(srcSpaceId);    PyObject *tgtSpaceId = getMemberObjFromObj(tgtObj, GET_LC_FROM_TABLE(spaceID));    SET_LV_TABLE(tgtSpaceId);    /*     * 使用的变量 srcObj, tgtObj, arglistSrc, arglistTgt, srcIdObj, tgtIdObj, arglistTgtId, srcSpaceId,     *      tgtSpaceId     * */    if (PyObject_Compare(srcSpaceId, tgtSpaceId)) {        retObj = GET_MC_FROM_TABLE(RELATION_IGNORE);        goto exit;    }    /*     * space_no = src.spaceNo     * if space_no in const.SPACE_FOR_GM:     *  return RELATION_IGNORE     * */    PyObject *space_no = getMemberObjFromObj(srcObj, GET_LC_FROM_TABLE(spaceNo));    SET_LV_TABLE(space_no);    /*     * 使用的变量 srcObj, tgtObj, arglistSrc, arglistTgt, srcIdObj, tgtIdObj, arglistTgtId, srcSpaceId,     *      tgtSpaceId, space_no     * */    if (PySequence_Contains(GET_MC_FROM_TABLE(SPACE_FOR_GM), space_no)) {        retObj = GET_MC_FROM_TABLE(RELATION_IGNORE);        goto exit;    }    /*     * if relation_common._in_protect(tgt):     *  return RELATION_IGNORE     * */    tmpCallRetObj = PyObject_CallObject(GET_MF_FROM_TABLE(_in_protect), arglistTgt);    /*     * 使用的变量 srcObj, tgtObj, arglistSrc, arglistTgt, srcIdObj, tgtIdObj, arglistTgtId, srcSpaceId,     *      tgtSpaceId, space_no     * */    if (PyObject_IsTrue(tmpCallRetObj)) {        retObj = GET_MC_FROM_TABLE(RELATION_IGNORE);        goto exit;    }    Py_DECREF(tmpCallRetObj);    /*     * Note:可以进一步优化     * if src.isBoutWith(tgt.id):     *  return RELATION_ENEMY     * */    /*     * 使用的变量 srcObj, tgtObj, arglistSrc, arglistTgt, srcIdObj, tgtIdObj, arglistTgtId, srcSpaceId,     *      tgtSpaceId, space_no     * */    if (isBoutWith(srcObj, srcIdObj, tgtObj, tgtIdObj)) {        retObj = GET_MC_FROM_TABLE(RELATION_ENEMY);        goto exit;    }    /*     * if space_no >= const.SPHERE_SPACE_INTERNAL:     *  sphere_no = formula.spaceOfSphere(space_no)     *  sphere_type = formula.whatSphereType(sphere_no)     *     *  func = SPHERE_PROC.get(sphere_type)     *  if func:     *      return func(src, tgt)     * else:     *  sphere_no = 0     *  sphere_type = 0     *     * */    /*     * 使用的变量 srcObj, tgtObj, arglistSrc, arglistTgt, srcIdObj, tgtIdObj, arglistTgtId, srcSpaceId,     *      tgtSpaceId, space_no     * */    long sphere_no;    long sphere_type;    if (PyObject_Compare(space_no, GET_MC_FROM_TABLE(SPHERE_SPACE_INTERNAL)) >= 0) {        tmpArgObj = Py_BuildValue("(O)", space_no);        PyObject *sphere_no_obj = PyObject_CallObject(GET_MF_FROM_TABLE(spaceOfSphere), tmpArgObj);        Py_DECREF(tmpArgObj);        sphere_no = PyInt_AS_LONG(sphere_no_obj);        PyObject *sphere_type_obj = PyObject_CallObject(GET_MF_FROM_TABLE(whatSphereType), Py_BuildValue("(O)", sphere_no));        sphere_type = PyInt_AS_LONG(sphere_type_obj);        tmpArgObj = Py_BuildValue("(O)", sphere_type_obj);        PyObject *func = PyObject_CallObject(GET_MF_FROM_TABLE(sphere_proc_get), tmpArgObj);        Py_DECREF(sphere_no_obj);        Py_DECREF(sphere_type_obj);        Py_DECREF(tmpArgObj);        if (PyCallable_Check(func)) {            retObj = PyObject_CallObject(func, args);            Py_DECREF(func);            FREE_ALL_LV_TABLE();            return PyObject_CallObject(func, args);        }        Py_DECREF(func);    } else {        sphere_no = 0;        sphere_type = 0;    }    /*     * src_newbie = (src.lv < const.PK_LV_PROTECT)     * tgt_newbie = (tgt.lv < const.PK_LV_PROTECT)     * if src_newbie:     *  if tgt_newbie:     *      return RELATION_COMRADE     *  else:     *      return RELATION_NEUTRAL     * else:     *  if tgt_newbie:     *      return RELATION_NEUTRAL     * */    PyObject *srcLvObj = getMemberObjFromObj(srcObj, GET_LC_FROM_TABLE(lv));    int src_newbie = (PyObject_Compare(srcLvObj, GET_MC_FROM_TABLE(PK_LV_PROTECT)) < 0);    Py_DECREF(srcLvObj);    PyObject *tgtLvObj = getMemberObjFromObj(tgtObj, GET_LC_FROM_TABLE(lv));    int tgt_newbie = (PyObject_Compare(tgtLvObj, GET_MC_FROM_TABLE(PK_LV_PROTECT)) < 0);    Py_DECREF(tgtLvObj);    /*     * 使用的变量 srcObj, tgtObj, arglistSrc, arglistTgt, srcIdObj, tgtIdObj, arglistTgtId, srcSpaceId,     *      tgtSpaceId, space_no     * */    if (src_newbie) {        if (tgt_newbie) {            retObj = GET_MC_FROM_TABLE(RELATION_COMRADE);            goto exit;        } else {            retObj = GET_MC_FROM_TABLE(RELATION_NEUTRAL);            goto exit;        }    } else {        if (tgt_newbie) {            retObj = GET_MC_FROM_TABLE(RELATION_NEUTRAL);            goto exit;        }    }    /*     * if resideInRefuge(src) or resideInRefuge(tgt):     *  return RELATION_NEUTRAL     * */    if (resideInRefuge(arglistSrc)) {        retObj = GET_MC_FROM_TABLE(RELATION_NEUTRAL);        goto exit;    }    if (resideInRefuge(arglistTgt)) {        retObj = GET_MC_FROM_TABLE(RELATION_NEUTRAL);        goto exit;    }    /*     * if src.spaceNo in const.PK_SPACE_FORBID:     *  return RELATION_NEUTRAL     * */    /*     * 使用的变量 srcObj, tgtObj, arglistSrc, arglistTgt, srcIdObj, tgtIdObj, arglistTgtId, srcSpaceId,     *      tgtSpaceId, space_no     * */    if (PySequence_Contains(GET_MC_FROM_TABLE(PK_SPACE_FORBID), space_no)) {        retObj = GET_MC_FROM_TABLE(RELATION_NEUTRAL);        goto exit;    }    /*     * if _in_pk_zone(src) and _in_pk_zone(tgt):     *  if _co_team(src, tgt):     *      return RELATION_COMRADE     *  else:     *      return RELATION_ENEMY     * */    /*     * 使用的变量 srcObj, tgtObj, arglistSrc, arglistTgt, srcIdObj, tgtIdObj, arglistTgtId, srcSpaceId,     *      tgtSpaceId, space_no     * */    tmpObj = PyObject_GetAttr(srcObj, GET_LC_FROM_TABLE(aiinfo));    int srcAiInfo;    if (tmpObj) {        srcAiInfo = PyInt_AS_LONG(tmpObj);        Py_DECREF(tmpObj);    } else {        srcAiInfo = 0;    }    tmpObj = PyObject_GetAttr(tgtObj, GET_LC_FROM_TABLE(aiinfo));    int tgtAiInfo;    if (tmpObj) {        tgtAiInfo = PyInt_AS_LONG(tmpObj);        Py_DECREF(tmpObj);    } else {        tgtAiInfo = 0;    }    if (CHECKFLAG(srcAiInfo, CHUCK_FLAG_PK) && CHECKFLAG(tgtAiInfo, CHUCK_FLAG_PK)) {        if (_co_team(srcObj, tgtObj)) {            retObj = GET_MC_FROM_TABLE(RELATION_COMRADE);            goto exit;        } else {            retObj = GET_MC_FROM_TABLE(RELATION_ENEMY);            goto exit;        }    }    /*     * if _in_camp_war_zone(src) and _in_camp_war_zone(tgt):     *  if _is_camp_war_fight():     *      return relation_common._by_camp(src, tgt)     * */    long space_no_int = PyInt_AS_LONG(space_no);    if ((CHECKFLAG(srcAiInfo, CHUCK_FLAG_CAMP_WAR) || inCampwarRectangle(srcObj, space_no_int)) &&        (CHECKFLAG(tgtAiInfo, CHUCK_FLAG_CAMP_WAR) || inCampwarRectangle(tgtObj, space_no_int))) {        tmpCallRetObj = PyObject_CallObject(GET_MF_FROM_TABLE(inFight), GET_LC_FROM_TABLE(emptyTuple));        if (PyObject_IsTrue(tmpCallRetObj)) {            Py_DECREF(tmpCallRetObj);            FREE_ALL_LV_TABLE();            return PyObject_CallObject(GET_MF_FROM_TABLE(_by_camp), args);        }        Py_DECREF(tmpCallRetObj);    }    /*     * if sphere_type in frozenset([const.SPHERE_TYPE_BLOC_MONO, const.SPHERE_TYPE_SPAN_MONO]):     *  return RELATION_COMRADE     * */    /*     * if sphere_type == const.SPHERE_TYPE_DANCE:     *  return RELATION_NEUTRAL     * */    /*     * if sphere_type == const.SPHERE_TYPE_WEDDING:     *  return RELATION_NEUTRAL     * */    if (sphere_type == SPHERE_TYPE_BLOC_MONO || sphere_type == SPHERE_TYPE_SPAN_MONO) {        retObj = GET_MC_FROM_TABLE(RELATION_COMRADE);        goto exit;    } else if (sphere_type == SPHERE_TYPE_DANCE ||             sphere_type == SPHERE_TYPE_WEDDING ||             sphere_type == SPACE_NO_MARRY) {        retObj = GET_MC_FROM_TABLE(RELATION_NEUTRAL);        goto exit;    }    /*     * if space_no == const.SPACE_NO_MARRY:     *  return RELATION_NEUTRAL     * */    if (space_no_int == SPACE_NO_MARRY) {        retObj = GET_MC_FROM_TABLE(RELATION_NEUTRAL);        goto exit;    }    /*     * if space_no in const.SPACE_FOR_WAR:     *  #SPACE_FOR_WAR = (SPACE_NO_MENGYUAN, )     *  ret = _war_zone(src, tgt)     *  if ret is not False:     *      return ret     * */    if (space_no_int == SPACE_NO_MENGYUAN) {        tmpCallRetObj = PyObject_CallObject(GET_MF_FROM_TABLE(_war_zone), args);        if (!PyObject_IsTrue(tmpCallRetObj)) {            FREE_ALL_LV_TABLE();            return tmpCallRetObj;        }        Py_DECREF(tmpCallRetObj);    }    /*     * if getattr(src, 'fortSwitch', False):     *  return _at_fort(src, tgt)     * elif getattr(tgt, 'fortSwitch', False):     *  return RELATION_IGNORE     * */    if (getFortSwitch(srcObj)) {        FREE_ALL_LV_TABLE();        return PyObject_CallObject(GET_MF_FROM_TABLE(_at_fort), args);    } else if (getFortSwitch(tgtObj)) {        retObj = GET_MC_FROM_TABLE(RELATION_IGNORE);        goto exit;    }    /*     * if _fight_at_vie(src, tgt):     *  return RELATION_ENEMY     * */    tmpCallRetObj = PyObject_CallObject(GET_MF_FROM_TABLE(_fight_at_vie), args);    if (PyObject_IsTrue(tmpCallRetObj)) {        Py_DECREF(tmpCallRetObj);        retObj = GET_MC_FROM_TABLE(RELATION_ENEMY);        goto exit;    }    Py_DECREF(tmpCallRetObj);    /*     * return _by_mode(src, tgt)     * */    //return PyObject_CallObject(GET_MF_FROM_TABLE(_by_mode), args);    tmpCallRetObj = _by_mode(srcObj, tgtObj);    FREE_ALL_LV_TABLE();    return tmpCallRetObj;test:    Py_INCREF(Py_None);    FREE_ALL_LV_TABLE();    return Py_None;exit:    Py_INCREF(retObj);    FREE_ALL_LV_TABLE();    return retObj;}static PyMethodDef ExtendMethods[] = {    {"decide", decide, METH_VARARGS, "a function from C"},    {NULL, NULL, 0, NULL},};#ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */#define PyMODINIT_FUNC void#endifPyMODINIT_FUNC initdecide_c(){    PyObject* m;    if (setTables()) {        return;    }    m = Py_InitModule3("decide_c", ExtendMethods, "Example of LearnNormal");    return;}
原创粉丝点击