aboutsummaryrefslogtreecommitdiff
path: root/ai_weights.c
blob: e76e9bf66c0b07e6aef88f58c811ef1453ad5a56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "7w.h"

int data_getdir(int dir, int p); //0 is east, 1 is west, 2 returns player
int* cards_getproduction(int era, int card);
int* cards_getcost(int era, int card);
int data_canafford(int p, int *cost);
int* data_getdefinites(int p);
int** data_getindefinites(int p);
int* data_gettradables(int p);
int data_productiontype(int e, int card);
int data_getwonderstages(int p);
int* get_special(int era, int card, int player);
int get_trade(int player, int type, int direction);
int cards_gettype(int era, int card);
int* get_science(int player);
int* get_special(int era, int card, int player);
int data_potentialvps(int p, int era, int card);
int military_might(int player);

int weight_science(int era, int card, int player)
{
 int weight = 0;
 int *science = get_science(player);
 int min = 100;
 int max = 0;
 int i, j;
 for(i = 0; i < 3; i++) {
  if(science[i] < min)
   min = science[i];
  if(science[i] > max)
   max = science[i];
 }
 if(era > 0 && max == 0) return 0;
 int *prod = cards_getproduction(era, card);
 for(i = COMPASS; prod[i] == 0; i++);
 i -= COMPASS;
 if(science[i] == min) weight = 5;
 int tots[3];
 for(i = 0; i < 3; i++) tots[i] = 0;
 for(i = 0; i < 3; i++) {
  science = get_science(data_getdir(i, player));
  for(j = 0; j < 3; j++) {
   tots[i] != science[j];
  }
 }
 if(tots[2] < tots[0]-1 || tots[2] < tots[1]-1) weight -= 3;
 return weight;
}

int weight_military(int era, int card, int player)
{
 int weight = 0;
 int military = cards_getproduction(era, card)[SHIELD];
 int strength[3];
 int i;
 for(i = 0; i < 3; i++)
  strength[i] = military_might(data_getdir(i, player));
 for(i = 0; i < 2; i++) {
  if(strength[i] >= strength[2] && strength[i] < strength[2] + military)
   weight += (era+2)*2;
  if(strength[i] == strength[2] + military)
   weight += (era+1)*2;
  if(strength[i] < strength[2])
   weight += 5 / (strength[2]-strength[i]);
 }
 return weight;
}

int weight_resource(int era, int card, int player)
{
 int weight = 0;
 int *prod = cards_getproduction(era, card);
 int *trade = data_gettradables(player);
 int i, j;
 for(i = 0; i < GOLD; i++) {
  if(prod[i] && !trade[i]) weight += 5;
  if(prod[i] && (i == STONE || i == ORE) && trade[i] < 2) weight += 2;
 }
 for(j = 0; j < 2; j++) {
  trade = data_gettradables(data_getdir(j, player));
  for(i = 0; i < GOLD; i++) {
   if(prod[i] && !trade[i]) weight++;
   if(prod[i] && trade[i] && get_trade(player, i, j) == 1) weight--;
  }
 }
 return weight;
}

int weight_tradingpost(int dir, int player);
int weight_marketplace(int player);
int weight_gold(int gold, int player);

int weight_commercial(int era, int card, int player)
{
 if(era == 0) {
  if(card == 17) return weight_gold(4, player);
  if(card == 18) return weight_tradingpost(0, player);
  if(card == 19) return weight_tradingpost(1, player);
  if(card == 20) return weight_marketplace(player);
 }
 if(era == 1) {
  if(card == 11 || card == 12) return weight_resource(era, card, player);
  if(card == 13 || card == 14) return weight_gold(get_special(era, card, player)[1], player);
 }
 return 0;
}

int weight_buildcard(int era, int card, int player)
{
 int weight = data_potentialvps(player, era, card);
 weight -= data_gettotvps(player);
 if(era == 2) return weight;
 if(cards_gettype(era, card) == SCIENTIFIC)
  weight += weight_science(era, card, player);
 if(cards_gettype(era, card) == MILITARY)
  weight += weight_military(era, card, player);
 if(cards_gettype(era, card) == RESOURCE || cards_gettype(era, card) == INDUSTRY)
  weight += weight_resource(era, card, player);
 if(cards_gettype(era, card) == COMMERCIAL)
  weight += weight_commercial(era, card, player);
}

int weight_buildwonder(int player)
{
 return (data_getwonderstages(player)+2) * 2;
}
bgstack15