TObject *AIGetObjectRunningInto(TActor *a, int cmd) { // Check the position just in front of the character; // check if there's a (non-dangerous) object in front of it Vec2i frontPos = Vec2iFull2Real(a->Pos); TTileItem *item; if (cmd & CMD_LEFT) { frontPos.x--; } else if (cmd & CMD_RIGHT) { frontPos.x++; } if (cmd & CMD_UP) { frontPos.y--; } else if (cmd & CMD_DOWN) { frontPos.y++; } item = GetItemOnTileInCollision( &a->tileItem, frontPos, TILEITEM_IMPASSABLE, CalcCollisionTeam(1, a), gCampaign.Entry.Mode == CAMPAIGN_MODE_DOGFIGHT); if (!item || item->kind != KIND_OBJECT) { return NULL; } return CArrayGet(&gObjs, item->id); }
static bool IsPosOK(TActor *actor, Vec2i pos) { const Vec2i realPos = Vec2iFull2Real(pos); if (IsCollisionDiamond(&gMap, realPos, actor->tileItem.size)) { return false; } if (CollideGetFirstItem( &actor->tileItem, realPos, TILEITEM_IMPASSABLE, CalcCollisionTeam(1, actor), IsPVP(gCampaign.Entry.Mode))) { return false; } return true; }
static bool IsPosOK(TActor *actor, Vec2i pos) { Vec2i realPos = Vec2iFull2Real(pos); Vec2i size = Vec2iNew(actor->tileItem.w, actor->tileItem.h); if (IsCollisionWallOrEdge(&gMap, realPos, size)) { return 0; } if (GetItemOnTileInCollision( &actor->tileItem, realPos, TILEITEM_IMPASSABLE, CalcCollisionTeam(1, actor), gCampaign.Entry.Mode == CAMPAIGN_MODE_DOGFIGHT)) { return 0; } return 1; }
static int IsOnSameTeam(TTileItem *i, CollisionTeam team) { if (gConfig.Game.AllyCollision != ALLYCOLLISION_NORMAL) { CollisionTeam itemTeam = COLLISIONTEAM_NONE; if (i->kind == KIND_CHARACTER) { TActor *a = i->actor; itemTeam = CalcCollisionTeam(1, a); } return team != COLLISIONTEAM_NONE && itemTeam != COLLISIONTEAM_NONE && team == itemTeam; } return 0; }
bool CollisionIsOnSameTeam( const TTileItem *i, const CollisionTeam team, const bool isPVP) { if (gConfig.Game.AllyCollision != ALLYCOLLISION_NORMAL) { CollisionTeam itemTeam = COLLISIONTEAM_NONE; if (i->kind == KIND_CHARACTER) { TActor *a = CArrayGet(&gActors, i->id); itemTeam = CalcCollisionTeam(1, a); } return team != COLLISIONTEAM_NONE && itemTeam != COLLISIONTEAM_NONE && team == itemTeam && !isPVP; } return 0; }