diff options
-rw-r--r-- | data.c | 87 | ||||
-rw-r--r-- | main.c | 2 | ||||
-rw-r--r-- | player_turn.c | 48 | ||||
-rw-r--r-- | view.c | 8 | ||||
-rw-r--r-- | wonder.c | 43 |
5 files changed, 154 insertions, 34 deletions
@@ -4,6 +4,8 @@ int* getdeck(int era, int numplayers); int* cards_getproduction(int era, int card); int cards_gettype(int era, int card); +int* cards_getcost(int era, int card); +int* cards_getproduction(int era, int card); int* get_intarray(int size); void shuffle(int *deck, int n); @@ -12,10 +14,12 @@ void shuffle(int *deck, int n); static int decks[3][49]; static int player[7][4][7]; //3 eras and extra stuff (wonder, wonder side, wonder stages completed, gold, military wins, defeats) +static int buffer[7][2]; static int hands[7][7]; static int numplayers; static int era; static int turn; +static int totturns; void data_sorthands() { @@ -36,6 +40,7 @@ void data_nextera() if(era == 2) return; era++; turn = 0; + totturns = 0; int i, j, k; k = 0; for(i = 0; i < numplayers; i++) @@ -69,19 +74,36 @@ void data_init(int n) era = -1; data_nextera(); data_distributewonders(n); - for(i = 0; i < n; i++) + for(i = 0; i < n; i++) { for(j = 0; j < 3; j++) for(k = 0; k < 7; k++) player[i][j][k] = -1; + player[i][3][3] = 2; //start with 2 gold + buffer[i][0] = -1; + } } -void data_passturn() +void data_endturn() { //remember, player numbers are arranged clockwise if(era == 0 || era == 2) //pass to the left turn++; else //pass to the right turn--; if(turn < 0) turn = numplayers-1; + int i, j; + for(i = 0; i < numplayers; i++) { + if(buffer[i][0] == -2) { + player[i][3][2]++; + } else { + for(j = 0; player[i][era][j] != -1; j++); //get free spot in array + player[i][era][j] = buffer[i][0]; //build card + } + player[i][3][3] += buffer[i][1]; //change in gold + buffer[i][0] = -1; + buffer[i][1] = 0; + } + totturns++; + if(totturns == 6) data_nextera(); } int* data_gethand(int p) @@ -109,6 +131,11 @@ int data_getwonderstages(int p) return player[p][3][2]; } +int data_getgold(int p) +{ + return player[p][3][3]; +} + int data_numplayers() { return numplayers; @@ -117,11 +144,25 @@ int data_numplayers() void data_build(int p, int card) { int i; - for(i = 0; hands[p][i] != card; i++); - for(; i < 7; i++) hands[p][i] = hands[p][i+1]; - hands[p][7] = -1; - for(i = 0; player[p][era][i] != -1; i++); - player[p][era][i] = card; + int *hand = data_gethand(p); + for(i = 0; hand[i] != card; i++); + for(; i < 6; i++) hand[i] = hand[i+1]; + hand[6] = -1; + buffer[p][0] = card; //will be added to player array at end of turn + buffer[p][1] -= cards_getcost(era, card)[GOLD]; + buffer[p][1] += cards_getproduction(era, card)[GOLD]; +} + +void data_buildwonder(int p, int card) +{ + int i; + int *hand = data_gethand(p); + for(i = 0; hand[i] != card; i++); + for(; i < 6; i++) hand[i] = hand[i+1]; + hand[6] = -1; + buffer[p][0] = -2; + buffer[p][1] -= cards_getcost(data_getwonder(p), data_getwonderside(p)*3+1+data_getwonderstages(p))[GOLD]; + buffer[p][1] += cards_getproduction(data_getwonder(p), data_getwonderside(p)*3+1+data_getwonderstages(p))[GOLD]; } //0 is non producing, 1 produces one kind of resource, 2 produces multiple resources @@ -139,22 +180,32 @@ int data_productiontype(int e, int card) return type; } -void data_removedefinites(int p, int *cost) +int* data_getdefinites(int p) { + int *ret = get_intarray(GOLD); int i, j, k, *prod; for(i = 0; i < 3; i++) { for(j = 0; j < 7; j++) { - if(data_productiontype(i, player[p][p][j]) == 1) { + if(data_productiontype(i, player[p][i][j]) == 1) { prod = cards_getproduction(i, player[p][i][j]); for(k = 0; k < GOLD; k++) { - if(prod[k] && cost[k]) { - cost[k] -= prod[k]; - if(cost[k] < 0) cost[k] = 0; - } + ret[k] += prod[k]; } } } } + return ret; +} + +void data_removedefinites(int p, int *cost) +{ + cost[cards_gettype(data_getwonder(p), 0)]--; + int *prod = data_getdefinites(p); + int i; + for(i = 0; i < GOLD; i++) { + cost[i] -= prod[i]; + if(cost[i] < 0) cost[i] = 0; + } } #define INDEF 16 @@ -232,3 +283,13 @@ int* data_getbuilt(int p) ret[i] = -1; //Cap it here return ret; } + +int data_numbuilt(int p) +{ + int num = 0; + int i, j; + for(i = 0; i < 3; i++) + for(j = 0; j < 7; j++) + if(player[p][i][j] != -1) num++; + return num; +} @@ -23,7 +23,7 @@ main() { io_init(); cards_init(); - data_init(7); + data_init(3); // tester(); // wonder_selected(0); player_turn(0); diff --git a/player_turn.c b/player_turn.c index 203f430..cc52825 100644 --- a/player_turn.c +++ b/player_turn.c @@ -5,43 +5,73 @@ int data_getera(); void io_printhand(int x, int y, int player, int cursor); void io_printcard(int x, int y, int era, int card); int io_getkey(); -void data_passturn(); +void data_endturn(); void data_nextera(); int data_numplayers(); +void data_build(int p, int card); +void data_buildwonder(int p, int card); void view_refresh(int focus, int cursor, int player); int wonder_numstages(int player); +int* cards_getcost(int era, int card); +int data_numbuilt(int p); + +int player_build(int focus, int cursor, int player) +{ + if(focus == data_numplayers()) { + int *hand = data_gethand(player); + if(data_canafford(player, cards_getcost(data_getera(), hand[cursor])) == 2) { + data_build(player, hand[cursor]); + return 1; + } + } + if(focus == 0) { + if(data_canafford(player, cards_getcost(data_getwonder(player), data_getwonderside(player)*3+1+cursor)) == 2) { + data_buildwonder(player, 0); //change to choose card used + return 1; + } + } + return 0; +} void player_turn(int player) { - int *hand = data_gethand(player); - int numcards; - for(numcards = 0; numcards < 7 && hand[numcards] > -1; numcards++); + int numcards, *hand; int cursor = 0; int focus = data_numplayers(); while(1) { + hand = data_gethand(player); + for(numcards = 0; numcards < 7 && hand[numcards] > -1; numcards++); view_refresh(focus, cursor, player); switch(io_getkey()) { case UP: cursor--; break; case DOWN: cursor++; break; - case RIGHT: data_passturn(); + case RIGHT: focus++; break; - case LEFT: player = (player+1)%data_numplayers(); + case LEFT: focus--; break; - case ENTER: data_nextera(); + case ENTER: + if(player_build(focus, cursor, player)) + player++; break; case '\t': focus = (focus+1)%(data_numplayers()+1); break; default: break; } + if(player >= data_numplayers()) { + data_endturn(); + player = 0; + } + if(focus < 0) focus = data_numplayers(); + focus = focus%(data_numplayers()+1); if(focus == data_numplayers()) { if(cursor < 0) cursor = numcards-1; if(cursor >= numcards) cursor = 0; } else { - if(cursor < 0) cursor = wonder_numstages((player+focus)%data_numplayers())-1; - cursor = cursor % wonder_numstages((player+focus)%data_numplayers()); + if(cursor < 0) cursor = wonder_numstages((player+focus)%data_numplayers())+data_numbuilt(player+focus%data_numplayers())-1; + cursor = cursor % (wonder_numstages((player+focus)%data_numplayers())+data_numbuilt(player+focus%data_numplayers())); } } } @@ -10,11 +10,11 @@ void io_printhand(int x, int y, int player, int cursor); void view_printwonders(int focus, int cursor, int player) { -int num = data_numplayers(); - int x, y, i, dir; + int num = data_numplayers(); + int x, y, i, dir, p; x = y = 0; for(i = 0; i < num; i++) { - int p = (player+i)%num; + p = (player+i)%num; dir = 0; if(i == 1) dir = 1; if(i == num-1) dir = 2; @@ -31,7 +31,7 @@ void view_refresh(int focus, int cursor, int player) view_printwonders(player, -1, player); io_printhand(61, 0, player, cursor); } else { - view_printwonders(focus, cursor, player); + view_printwonders((focus+player)%data_numplayers(), cursor, player); io_printhand(61, 0, player, -1); } } @@ -13,12 +13,14 @@ int io_printtext(int xorigin, int y, int width, char* text); int io_printcard(int x, int y, int wonder, int stage); void io_printname(int x, int y, int era, int card); int data_getwonderstages(int p); +int data_getgold(int p); char* cat(char a[], char b[]); char* itoa(int i); int io_getkey(); void io_clearscreen(); int* data_getbuilt(int p); void io_printplain(int x, int y, char *s); +int* data_getdefinites(int p); int wonder_numstages(int player) { @@ -32,11 +34,29 @@ int wonder_numstages(int player) int print_wonder(int x, int y, int player, int cursor) { -// if(cursor != -1) cursor = cursor % wonder_numstages(player); + int i; io_printborder(x, y++); y = io_printtext(x, y, 29, cards_getname(data_getwonder(player), 0)); - y = io_printtext(x, y, 29, cat("Produces 1 ", getname(cards_gettype(data_getwonder(player), 0)))); - int i; + y = io_printtext(x, y, 29, cat("Produces: 1 ", getname(cards_gettype(data_getwonder(player), 0)))); + y = io_printtext(x, y, 29, cat(cat("Treasury: ", itoa(data_getgold(player))), " gold")); + io_printborder(x, y++); + + //Print resource incomes + int *def = data_getdefinites(player); + int has = 0; + for(i = 0; i < GOLD; i++) + if(def[i]) has = 1; + if(has) { + y = io_printtext(x, y, 29, "Production:"); + for(i = 0; i < GOLD; i++) { + if(def[i]) { + y = io_printtext(x, y, 29, cat(cat(cat(" ", getname(i)), ": "), itoa(def[i]))); + } + } + io_printborder(x, y++); + } + + //Print wonder stages for(i = 0; i < wonder_numstages(player); i++) { char *text = cat("Stage ", itoa(i+1)); if(data_getwonderstages(player) > i) @@ -44,7 +64,7 @@ int print_wonder(int x, int y, int player, int cursor) else text = cat(text, " "); if(cursor == i) - text = cat(text, " *"); + text = cat(text, " *"); else text = cat(text, " "); y = io_printtext(x, y, 29, text); @@ -53,14 +73,23 @@ int print_wonder(int x, int y, int player, int cursor) //Print what has been built int *built = data_getbuilt(player); - for(i = 0; built[i] != -1; i+=2) { - io_printname(x, y++, built[i], built[i+1]); + int j; + int print = -1; + for(j = 0; built[j] != -1; j+=2) { + io_printname(x, y++, built[j], built[j+1]); + if(cursor == i++) { + io_printplain(x+25, y-1, "*"); + print = j; + } } - if(i == 0) y--; + if(j == 0) y--; + io_printborder(x, y); //Info about component if(cursor >= 0 && cursor < wonder_numstages(player)) return io_printcard(x, y, data_getwonder(player), cursor+1+3*data_getwonderside(player)); + if(cursor >= wonder_numstages(player)) + return io_printcard(x, y, built[print], built[print+1]); } //dir is 0 for none, 1 for east, 2 for west |