/** * @brief Returns an array of faction ids. * * @param *n Writes the number of elements. * @param which Which factions to get. (0,1,2,3 : all, friendly, neutral, hostile) * @return A pointer to an array, or NULL. */ int *faction_getGroup( int *n, int which ) { int *group; int i; /* Set defaults. */ group = NULL; *n = 0; switch(which) { case 0: /* 'all' */ *n = faction_nstack; group = malloc(sizeof(int) * *n); for(i = 0; i < faction_nstack; i++) group[i] = i; break; case 1: /* 'friendly' */ for(i = 0; i < faction_nstack; i++) if(areAllies(FACTION_PLAYER, i)) { (*n)++; group = realloc(group, sizeof(int) * *n); group[*n - 1] = i; } break; case 2: /* 'neutral' */ for(i = 0; i < faction_nstack; i++) if(!areAllies(FACTION_PLAYER, i) && !areEnemies(FACTION_PLAYER, i)) { (*n)++; group = realloc(group, sizeof(int) * *n); group[*n - 1] = i; } break; case 3: /* 'hostile' */ for(i = 0; i < faction_nstack; i++) if(areEnemies(FACTION_PLAYER, i)) { (*n)++; group = realloc(group, sizeof(int) * *n); group[*n - 1] = i; } break; default: /* Defaults have already been set. */ break; } return group; }
/** * @brief Gets the faction character associated to it's standing with the player. * * Use this to do something like "\e%c", faction_getColourChar( some_faction ) in the * font print routines. * * @param f Faction to get the colour of based on player's standing. * @return The character associated to the faction. */ char faction_getColourChar( int f ) { if (f<0) return 'I'; else if (areEnemies(FACTION_PLAYER,f)) return 'H'; else if (areAllies(FACTION_PLAYER,f)) return 'F'; else return 'N'; }
/** * @brief Gets the colour of the faction based on it's standing with the player. * * Used to unify the colour checks all over. * * @param f Faction to get the colour of based on player's standing. * @return Pointer to the colour. */ const glColour* faction_getColour( int f ) { if (f<0) return &cInert; else if (areAllies(FACTION_PLAYER,f)) return &cFriend; else if (areEnemies(FACTION_PLAYER,f)) return &cHostile; else return &cNeutral; }
/** * @brief Checks to see if f is an ally of a. * * @usage if f:areAllies( faction.get( "Pirate" ) ) then * * @luaparam f Faction to check against. * @luaparam a Faction to check if is an enemy. * @luareturn true if they are enemies, false if they aren't. * @luafunc areAllies( f, a ) */ static int factionL_areallies( lua_State *L ) { int f, ff; f = luaL_validfaction(L,1); ff = luaL_validfaction(L,2); lua_pushboolean(L, areAllies( f, ff )); return 1; }
/** * @brief Calculates the resistance between two star systems. * * @param A Star system to calculate the resistance between. * @param B Star system to calculate the resistance between. * @return Resistance between A and B. */ static double econ_calcJumpR( StarSystem *A, StarSystem *B ) { double R; /* Set to base to ensure price change. */ R = ECON_BASE_RES; /* Modify based on system conditions. */ R += (A->nebu_density + B->nebu_density) / 1000.; /* Density shouldn't affect much. */ R += (A->nebu_volatility + B->nebu_volatility) / 100.; /* Volatility should. */ /* Modify based on global faction. */ if ((A->faction != -1) && (B->faction != -1)) { if (areEnemies(A->faction, B->faction)) R += ECON_FACTION_MOD * ECON_BASE_RES; else if (areAllies(A->faction, B->faction)) R -= ECON_FACTION_MOD * ECON_BASE_RES; } /* @todo Modify based on fleets. */ return R; }
int FactionSetup::areAllies(FactionMember memberA, FactionMember memberB) { return areAllies(memberA.getFactionId(), memberB.getFactionId()); }
/** * @brief Draws the minimap weapons (used in player.c). * * @param res Minimap resolution. * @param w Width of minimap. * @param h Height of minimap. * @param shape Shape of the minimap. * @param alpha Alpha to draw points at. */ void weapon_minimap( const double res, const double w, const double h, const RadarShape shape, double alpha ) { int i, rc, p; double x, y; Weapon *wp; glColour *c; GLsizei offset; /* Get offset. */ p = 0; offset = weapon_vboSize; if (shape==RADAR_CIRCLE) rc = (int)(w*w); /* Draw the points for weapons on all layers. */ for (i=0; i<nwbackLayer; i++) { wp = wbackLayer[i]; /* Make sure is in range. */ if (!pilot_inRange( player, wp->solid->pos.x, wp->solid->pos.y )) continue; /* Get radar position. */ x = (wp->solid->pos.x - player->solid->pos.x) / res; y = (wp->solid->pos.y - player->solid->pos.y) / res; /* Make sure in range. */ if (shape==RADAR_RECT && (ABS(x)>w/2. || ABS(y)>h/2.)) continue; if (shape==RADAR_CIRCLE && (((x)*(x)+(y)*(y)) > rc)) continue; /* Choose colour based on if it'll hit player. */ if (outfit_isSeeker(wp->outfit) && (wp->target != PLAYER_ID)) c = &cNeutral; else if ((wp->target == PLAYER_ID) || !areAllies(FACTION_PLAYER, wp->faction)) c = &cHostile; else c = &cNeutral; /* Set the colour. */ weapon_vboData[ offset + 4*p + 0 ] = c->r; weapon_vboData[ offset + 4*p + 1 ] = c->g; weapon_vboData[ offset + 4*p + 2 ] = c->b; weapon_vboData[ offset + 4*p + 3 ] = alpha; /* Put the pixel. */ weapon_vboData[ 2*p + 0 ] = x; weapon_vboData[ 2*p + 1 ] = y; /* "Add" pixel. */ p++; } for (i=0; i<nwfrontLayer; i++) { wp = wfrontLayer[i]; /* Make sure is in range. */ if (!pilot_inRange( player, wp->solid->pos.x, wp->solid->pos.y )) continue; /* Get radar position. */ x = (wp->solid->pos.x - player->solid->pos.x) / res; y = (wp->solid->pos.y - player->solid->pos.y) / res; /* Make sure in range. */ if (shape==RADAR_RECT && (ABS(x)>w/2. || ABS(y)>h/2.)) continue; if (shape==RADAR_CIRCLE && (((x)*(x)+(y)*(y)) > rc)) continue; /* Choose colour based on if it'll hit player. */ if (outfit_isSeeker(wp->outfit) && (wp->target != PLAYER_ID)) c = &cNeutral; else if ((wp->target == PLAYER_ID) || !areAllies(FACTION_PLAYER, wp->faction)) c = &cHostile; else c = &cNeutral; /* Set the colour. */ weapon_vboData[ offset + 4*p + 0 ] = c->r; weapon_vboData[ offset + 4*p + 1 ] = c->g; weapon_vboData[ offset + 4*p + 2 ] = c->b; weapon_vboData[ offset + 4*p + 3 ] = alpha; /* Put the pixel. */ weapon_vboData[ 2*p + 0 ] = x; weapon_vboData[ 2*p + 1 ] = y; /* "Add" pixel. */ p++; } /* Only render with something to draw. */ if (p > 0) { /* Upload data changes. */ gl_vboSubData( weapon_vbo, 0, sizeof(GLfloat) * 2*p, weapon_vboData ); gl_vboSubData( weapon_vbo, offset * sizeof(GLfloat), sizeof(GLfloat) * 4*p, &weapon_vboData[offset] ); /* Activate VBO. */ gl_vboActivateOffset( weapon_vbo, GL_VERTEX_ARRAY, 0, 2, GL_FLOAT, 0 ); gl_vboActivateOffset( weapon_vbo, GL_COLOR_ARRAY, offset * sizeof(GLfloat), 4, GL_FLOAT, 0 ); /* Render VBO. */ glDrawArrays( GL_POINTS, 0, p ); /* Disable VBO. */ gl_vboDeactivate(); } }
/** * @brief Applies a hunk and adds it to the diff. * * @param diff Diff to which the hunk belongs. * @param hunk Hunk to apply. * @return 0 on success. */ static int diff_patchHunk( UniHunk_t *hunk ) { Planet *p; int a, b; switch (hunk->type) { /* Adding an asset. */ case HUNK_TYPE_ASSET_ADD: planet_updateLand( planet_get(hunk->u.name) ); return system_addPlanet( system_get(hunk->target.u.name), hunk->u.name ); /* Removing an asset. */ case HUNK_TYPE_ASSET_REMOVE: return system_rmPlanet( system_get(hunk->target.u.name), hunk->u.name ); /* Making an asset a black market. */ case HUNK_TYPE_ASSET_BLACKMARKET: planet_addService( planet_get(hunk->u.name), PLANET_SERVICE_BLACKMARKET ); return 0; /* Making an asset a legal market. */ case HUNK_TYPE_ASSET_LEGALMARKET: planet_rmService( planet_get(hunk->u.name), PLANET_SERVICE_BLACKMARKET ); return 0; /* Adding a Jump. */ case HUNK_TYPE_JUMP_ADD: return system_addJumpDiff( system_get(hunk->target.u.name), hunk->node ); /* Removing a jump. */ case HUNK_TYPE_JUMP_REMOVE: return system_rmJump( system_get(hunk->target.u.name), hunk->u.name ); /* Adding a tech. */ case HUNK_TYPE_TECH_ADD: return tech_addItem( hunk->target.u.name, hunk->u.name ); /* Removing a tech. */ case HUNK_TYPE_TECH_REMOVE: return tech_rmItem( hunk->target.u.name, hunk->u.name ); /* Changing asset faction. */ case HUNK_TYPE_ASSET_FACTION: p = planet_get( hunk->target.u.name ); if (p==NULL) return -1; hunk->o.name = faction_name( p->faction ); return planet_setFaction( p, faction_get(hunk->u.name) ); case HUNK_TYPE_ASSET_FACTION_REMOVE: return planet_setFaction( planet_get(hunk->target.u.name), faction_get(hunk->o.name) ); /* Making a faction visible. */ case HUNK_TYPE_FACTION_VISIBLE: return faction_setInvisible( faction_get(hunk->target.u.name), 0 ); /* Making a faction invisible. */ case HUNK_TYPE_FACTION_INVISIBLE: return faction_setInvisible( faction_get(hunk->target.u.name), 1 ); /* Making two factions allies. */ case HUNK_TYPE_FACTION_ALLY: a = faction_get( hunk->target.u.name ); b = faction_get( hunk->u.name ); if (areAllies(a, b)) hunk->o.data = 'A'; else if (areEnemies(a, b)) hunk->o.data = 'E'; else hunk->o.data = 0; faction_addAlly( a, b ); faction_addAlly( b, a ); return 0; /* Making two factions enemies. */ case HUNK_TYPE_FACTION_ENEMY: a = faction_get( hunk->target.u.name ); b = faction_get( hunk->u.name ); if (areAllies(a, b)) hunk->o.data = 'A'; else if (areEnemies(a, b)) hunk->o.data = 'E'; else hunk->o.data = 0; faction_addEnemy( a, b ); faction_addEnemy( b, a ); return 0; /* Making two factions neutral (removing enemy/ally statuses). */ case HUNK_TYPE_FACTION_NEUTRAL: a = faction_get( hunk->target.u.name ); b = faction_get( hunk->u.name ); if (areAllies(a, b)) hunk->o.data = 'A'; else if (areEnemies(a, b)) hunk->o.data = 'E'; else hunk->o.data = 0; faction_rmAlly( a, b ); faction_rmAlly( b, a ); faction_rmEnemy( a, b ); faction_rmEnemy( b, a ); return 0; /* Resetting the alignment state of two factions. */ case HUNK_TYPE_FACTION_REALIGN: a = faction_get( hunk->target.u.name ); b = faction_get( hunk->u.name ); if (hunk->o.data == 'A') { faction_rmEnemy(a, b); faction_rmEnemy(b, a); faction_addAlly(a, b); faction_addAlly(b, a); } else if (hunk->o.data == 'E') { faction_rmAlly(a, b); faction_rmAlly(b, a); faction_addEnemy(a, b); faction_addAlly(b, a); } else { faction_rmAlly( a, b ); faction_rmAlly( b, a ); faction_rmEnemy( a, b ); faction_rmEnemy( b, a ); } return 0; default: WARN(_("Unknown hunk type '%d'."), hunk->type); break; } return -1; }