2 votes

Coût d'inciter une révolte

Quelle est la formule qui détermine le coût d'inciter une révolte en utilisant des diplomates/espions ? Je sais que pour une capitale c'est 1000000 gp. Je n'ai pu trouver qu'une formule pour les coûts de corruption/sabotage des unités sur le FreeCiv Wikia, mais pas pour les villes.

2voto

Angzuril Points 8248

Réponse courte, cela dépend du jeu de règles. Une section du 'classique' game.ruleset est ci-dessous.

[incite_cost]
; city_incite_cost = total_factor * (city_size) * (base_incite_cost
;                      + (units_cost) * unit_factor
;                      + (improvements_cost) * improvement_factor)
;                    / ((distance to capital) * 100)
; Voir city_incite_cost() pour plus de détails
base_incite_cost = 1000
improvement_factor = 1
unit_factor = 2
total_factor = 100

Cette formule n'est pas réellement utilisée (c'est un commentaire) mais les valeurs le sont. Elle est essentiellement correcte mais il manque de nombreux modificateurs et une limite de distance que je montrerai ci-dessous.

La réponse longue se trouve principalement dans server\cityturn.c, mais dépend de nombreux, nombreux fichiers. (Vous pouvez télécharger la version non compilée de freeciv pour ces fichiers, ci-dessous n'est qu'une partie de server\cityturn.c)

int city_incite_cost(struct player *pplayer, struct city *pcity)
{
  struct city *capital;
  int dist, size;
  double cost; /* Les valeurs intermédiaires peuvent devenir très grandes */

  if (get_city_bonus(pcity, EFT_NO_INCITE) > 0) {
    return INCITE_IMPOSSIBLE_COST;
  }

  /* Facteur Or */
  cost = city_owner(pcity)->economic.gold + game.server.base_incite_cost;

  unit_list_iterate(pcity->tile->units, punit) {
    cost += (unit_build_shield_cost(punit)
         * game.server.incite_unit_factor);
  } unit_list_iterate_end;

  /* Bâtiments */
  city_built_iterate(pcity, pimprove) {
    cost += impr_build_shield_cost(pimprove)
            * game.server.incite_improvement_factor;
  } city_built_iterate_end;

  /* Bonus de stabilité */
  if (!city_unhappy(pcity)) {
    cost *= 2;
  }
  if (city_celebrating(pcity)) {
    cost *= 2;
  }

  /* La ville est vide */
  if (unit_list_size(pcity->tile->units) == 0) {
    cost /= 2;
  }

  /* Le rachat est bon marché, les villes conquises sont également bon marché */
  if (!game.info.citizen_nationality) {
    if (city_owner(pcity) != pcity->original) {
      if (pplayer == pcity->original) {
        cost /= 2;            /* rachat : réduction de prix de 50% */
      } else {
        cost = cost * 2 / 3;  /* acheter conquise : réduction de prix de 33% */
      }
    }
  }

  /* Distance depuis la capitale */
  capital = player_capital(city_owner(pcity));
  if (capital) {
    int tmp = map_distance(capital->tile, pcity->tile);
    dist = MIN(32, tmp);
  } else {
    /* Pas de capitale ? Prenez la pénalité maximale ! */
    dist = 32;
  }

  size = MAX(1, city_size_get(pcity)
                + pcity->feel[CITIZEN_HAPPY][FEELING_FINAL]
                - pcity->feel[CITIZEN_UNHAPPY][FEELING_FINAL]
                - pcity->feel[CITIZEN_ANGRY][FEELING_FINAL] * 3);
  cost *= size;
  cost *= game.server.incite_total_factor;
  cost = cost / (dist + 3);

  if (game.info.citizen_nationality) {
    int cost_per_citizen = cost / pcity->size;
    int natives = citizens_nation_get(pcity, city_owner(pcity)->slot);
    int tgt_cit = citizens_nation_get(pcity, pplayer->slot);
    int third_party = pcity->size - natives - tgt_cit;

    cost = cost_per_citizen * (natives + 0.7 * third_party + 0.5 * tgt_cit); 
  }

  cost += (cost * get_city_bonus(pcity, EFT_INCITE_COST_PCT)) / 100;
  cost /= 100;

  if (cost >= INCITE_IMPOSSIBLE_COST) {
    return INCITE_IMPOSSIBLE_COST;
  } else {
    return cost;
  }
}

Pour résumer : Si la ville n'est pas naturellement impossible à soudoyer,

-Ajoutez l'or du joueur cible au base_incite_cost du jeu de règles (par défaut 1000)

-Ajoutez (ruleset unit_factor (par défaut 2) fois le coût total en boucliers des unités de la ville)

-Ajoutez (ruleset improvement_factor (par défaut 1) fois le coût total en boucliers des améliorations (bâtiments) de la ville)

(Ce total est maintenant multiplié/divisé par d'autres modificateurs)

-Multipliez par 2 si pas mécontent

-Multipliez par 2 si en train de célébrer

-Divisez par 2 s'il n'y a pas d'unités dans la ville

-Divisez par 2 s'il s'agissait initialement de votre ville

-Multipliez par 2/3 s'il ne s'agit pas initialement de votre ville ou de la ville actuelle du propriétaire

-Multipliez par (taille de la ville + citoyens heureux - citoyens mécontents - (3*citoyens en colère)) *Remarque cela ne descendra pas en dessous de 1 en raison du maximum

-Multipliez par ruleset total_factor (par défaut 100)

-Divisez par (distance depuis la capitale (limitée à 32) plus 3)

-Si la nationalité est activée (dans cities.ruleset), Multipliez par (0,5 * fraction de citoyens de votre nationalité + 1 * fraction de citoyens de la nationalité du propriétaire + 0,7 * fraction de citoyens d'une autre nationalité)

-Multipliez par ( (une augmentation de pourcentage spéciale, normalement seulement à partir des palais Incite_Cost_Pct (par défaut 300), divisée par 100)+1 )

-Divisez par 100

Notes/références diverses

Nationalité dans cities.ruleset

[citizen]
nationality   = TRUE            ; tenir compte de la nationalité des citoyens

Incite_Cost_Pct dans effects.ruleset

[effect_courthouse_3]
type    = "Incite_Cost_Pct"
value   = 300

En passant, la valeur 1000000 est définie comme étant l'INCITE_IMPOSSIBLE_COST, et apparaîtra pour les villes contenant un palais (capitales), ou dans une démocratie.

Depuis common\city.h

#define INCITE_IMPOSSIBLE_COST (1000 * 1000 * 1000)

AlleGamers.com

AlleGamers est une communauté de gamers qui cherche à élargir la connaissance des jeux vidéo.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X