void monopoly_player(gint player_num, gint victim_num, gint num, Resource type) { gchar *buf; gchar *tmp; player_modify_statistic(player_num, STAT_RESOURCES, num); player_modify_statistic(victim_num, STAT_RESOURCES, -num); buf = resource_cards(num, type); if (player_num == my_player_num()) { /* I get the cards */ /* $1=resources, $2=player that loses resources */ log_message(MSG_STEAL, _("You get %s from %s.\n"), buf, player_name(victim_num, FALSE)); resource_modify(type, num); } else if (victim_num == my_player_num()) { /* I lose the cards */ /* $1=player that steals, $2=resources */ log_message(MSG_STEAL, _("%s took %s from you.\n"), player_name(player_num, TRUE), buf); resource_modify(type, -num); } else { /* I'm a bystander */ /* $1=player that steals, $2=resources, $3=player that loses resources */ tmp = g_strdup(player_name(player_num, TRUE)); log_message(MSG_STEAL, _("%s took %s from %s.\n"), tmp, buf, player_name(victim_num, FALSE)); g_free(tmp); } g_free(buf); }
void player_domestic_trade(gint player_num, gint partner_num, gint * supply, gint * receive) { gchar *supply_desc; gchar *receive_desc; gint diff; gint idx; diff = resource_count(receive) - resource_count(supply); player_modify_statistic(player_num, STAT_RESOURCES, -diff); player_modify_statistic(partner_num, STAT_RESOURCES, diff); if (player_num == my_player_num()) { for (idx = 0; idx < NO_RESOURCE; idx++) { resource_modify(idx, supply[idx]); resource_modify(idx, -receive[idx]); } } else if (partner_num == my_player_num()) { for (idx = 0; idx < NO_RESOURCE; idx++) { resource_modify(idx, -supply[idx]); resource_modify(idx, receive[idx]); } } if (!resource_count(supply)) { if (!resource_count(receive)) { log_message(MSG_TRADE, _("%s gave %s nothing!?\n"), player_name(player_num, TRUE), player_name(partner_num, FALSE)); } else { receive_desc = resource_format_num(receive); log_message(MSG_TRADE, _("%s gave %s %s for free.\n"), player_name(player_num, TRUE), player_name(partner_num, FALSE), receive_desc); g_free(receive_desc); } } else if (!resource_count(receive)) { supply_desc = resource_format_num(supply); log_message(MSG_TRADE, _("%s gave %s %s for free.\n"), player_name(partner_num, TRUE), player_name(player_num, FALSE), supply_desc); g_free(supply_desc); } else { supply_desc = resource_format_num(supply); receive_desc = resource_format_num(receive); log_message(MSG_TRADE, _("%s gave %s %s in exchange for %s.\n"), player_name(player_num, TRUE), player_name(partner_num, FALSE), receive_desc, supply_desc); g_free(supply_desc); g_free(receive_desc); } }
void develop_bought_card_turn(DevelType type, gint turnbought) { deck_card_add(develop_deck, type, turnbought); if (turnbought == turn_num()) { /* Cannot undo build after buying a development card */ build_clear(); bought_develop = TRUE; /* Only log if the cards is bought in the current turn. * This function is also called during reconnect */ if (is_unique[type]) log_message(MSG_DEVCARD, /* This development card is unique */ _("" "You bought the %s development card.\n"), get_devel_name(type)); else log_message(MSG_DEVCARD, /* This development card is not unique */ _("" "You bought a %s development card.\n"), get_devel_name(type)); }; player_modify_statistic(my_player_num(), STAT_DEVELOPMENT, 1); stock_use_develop(); callbacks.bought_develop(type); }
void player_maritime_trade(gint player_num, gint ratio, Resource supply, Resource receive) { gchar *buf_give; gchar *buf_receive; gint resources[NO_RESOURCE]; gint idx; for (idx = 0; idx < NO_RESOURCE; ++idx) resources[idx] = 0; resources[supply] = ratio; resources[receive] = -1; modify_bank(resources); player_modify_statistic(player_num, STAT_RESOURCES, 1 - ratio); if (player_num == my_player_num()) { resource_modify(supply, -ratio); resource_modify(receive, 1); } buf_give = resource_cards(ratio, supply); buf_receive = resource_cards(1, receive); log_message(MSG_TRADE, _("%s exchanged %s for %s.\n"), player_name(player_num, TRUE), buf_give, buf_receive); g_free(buf_give); g_free(buf_receive); }
void develop_bought(gint player_num) { log_message(MSG_DEVCARD, _("%s bought a development card.\n"), player_name(player_num, TRUE)); player_modify_statistic(player_num, STAT_DEVELOPMENT, 1); stock_use_develop(); }
void develop_played(gint player_num, gint card_idx, DevelType type) { if (player_num == my_player_num()) { deck_card_play(develop_deck, played_develop, card_idx, turn_num()); if (!is_victory_card(type)) played_develop = TRUE; } callbacks.played_develop(player_num, card_idx, type); if (is_unique[type]) log_message(MSG_DEVCARD, _("%s played the %s development card.\n"), player_name(player_num, TRUE), get_devel_name(type)); else log_message(MSG_DEVCARD, _("%s played a %s development card.\n"), player_name(player_num, TRUE), get_devel_name(type)); player_modify_statistic(player_num, STAT_DEVELOPMENT, -1); switch (type) { case DEVEL_ROAD_BUILDING: if (player_num == my_player_num()) { if (stock_num_roads() == 0 && stock_num_ships() == 0 && stock_num_bridges() == 0) log_message(MSG_INFO, _("" "You have run out of road segments.\n")); } break; case DEVEL_CHAPEL: player_modify_statistic(player_num, STAT_CHAPEL, 1); break; case DEVEL_UNIVERSITY: player_modify_statistic(player_num, STAT_UNIVERSITY, 1); break; case DEVEL_GOVERNORS_HOUSE: player_modify_statistic(player_num, STAT_GOVERNORS_HOUSE, 1); break; case DEVEL_LIBRARY: player_modify_statistic(player_num, STAT_LIBRARY, 1); break; case DEVEL_MARKET: player_modify_statistic(player_num, STAT_MARKET, 1); break; case DEVEL_SOLDIER: player_modify_statistic(player_num, STAT_SOLDIERS, 1); break; default: break; } }
void player_largest_army(gint player_num) { gint idx; if (player_num < 0) log_message(MSG_LARGESTARMY, _("There is no largest army.\n")); else log_message(MSG_LARGESTARMY, _("%s has the largest army.\n"), player_name(player_num, TRUE)); for (idx = 0; idx < num_total_players; idx++) { Player *player = player_get(idx); if (player->statistics[STAT_LARGEST_ARMY] != 0 && idx != player_num) player_modify_statistic(idx, STAT_LARGEST_ARMY, -1); if (player->statistics[STAT_LARGEST_ARMY] == 0 && idx == player_num) player_modify_statistic(idx, STAT_LARGEST_ARMY, 1); } }
void player_stole_from(gint player_num, gint victim_num, Resource resource) { player_modify_statistic(player_num, STAT_RESOURCES, 1); player_modify_statistic(victim_num, STAT_RESOURCES, -1); if (resource == NO_RESOURCE) { /* CHECK THIS: Since anonymous players (NULL) no longer exist, * player_name doesn't use its static buffer anymore, and * two calls can be safely combined. If not: ai/player.c should also be fixed */ /* FIXME: in the client, anonymous players can exist. * I prefer changing that instead of this function */ log_message(MSG_STEAL, /* We are not in on the action someone stole a resource from someone else */ _("%s stole a resource from %s.\n"), player_name(player_num, TRUE), player_name(victim_num, FALSE)); } else { gchar *buf; buf = resource_cards(1, resource); if (player_num == my_player_num()) { /* We stole a card :-) */ log_message(MSG_STEAL, _("You stole %s from %s.\n"), buf, player_name(victim_num, FALSE)); resource_modify(resource, 1); } else { /* Someone stole our card :-( */ log_message(MSG_STEAL, _("%s stole %s from you.\n"), player_name(player_num, TRUE), buf); resource_modify(resource, -1); } g_free(buf); } callbacks.player_robbed(player_num, victim_num, resource); }
void player_longest_road(gint player_num) { gint idx; if (player_num < 0) log_message(MSG_LONGESTROAD, _("There is no longest road.\n")); else log_message(MSG_LONGESTROAD, _("%s has the longest road.\n"), player_name(player_num, TRUE)); for (idx = 0; idx < num_total_players; idx++) { Player *player = player_get(idx); if (player->statistics[STAT_LONGEST_ROAD] != 0 && idx != player_num) player_modify_statistic(idx, STAT_LONGEST_ROAD, -1); if (player->statistics[STAT_LONGEST_ROAD] == 0 && idx == player_num) player_modify_statistic(idx, STAT_LONGEST_ROAD, 1); } }
void player_build_remove(gint player_num, BuildType type, gint x, gint y, gint pos) { Edge *edge; Node *node; switch (type) { case BUILD_ROAD: edge = map_edge(callbacks.get_map(), x, y, pos); edge->owner = -1; callbacks.draw_edge(edge); edge->type = BUILD_NONE; log_message(MSG_BUILD, _("%s removed a road.\n"), player_name(player_num, TRUE)); if (player_num == my_player_num()) stock_replace_road(); break; case BUILD_SHIP: edge = map_edge(callbacks.get_map(), x, y, pos); edge->owner = -1; callbacks.draw_edge(edge); edge->type = BUILD_NONE; log_message(MSG_BUILD, _("%s removed a ship.\n"), player_name(player_num, TRUE)); if (player_num == my_player_num()) stock_replace_ship(); break; case BUILD_SETTLEMENT: node = map_node(callbacks.get_map(), x, y, pos); node->type = BUILD_NONE; node->owner = -1; callbacks.draw_node(node); log_message(MSG_BUILD, _("%s removed a settlement.\n"), player_name(player_num, TRUE)); player_modify_statistic(player_num, STAT_SETTLEMENTS, -1); if (player_num == my_player_num()) stock_replace_settlement(); break; case BUILD_CITY: node = map_node(callbacks.get_map(), x, y, pos); node->type = BUILD_SETTLEMENT; node->owner = player_num; callbacks.draw_node(node); log_message(MSG_BUILD, _("%s removed a city.\n"), player_name(player_num, TRUE)); player_modify_statistic(player_num, STAT_SETTLEMENTS, 1); player_modify_statistic(player_num, STAT_CITIES, -1); if (player_num == my_player_num()) { stock_use_settlement(); stock_replace_city(); } break; case BUILD_CITY_WALL: node = map_node(callbacks.get_map(), x, y, pos); node->city_wall = FALSE; node->owner = player_num; callbacks.draw_node(node); log_message(MSG_BUILD, _("%s removed a city wall.\n"), player_name(player_num, TRUE)); player_modify_statistic(player_num, STAT_CITY_WALLS, -1); if (player_num == my_player_num()) stock_replace_city_wall(); break; case BUILD_NONE: log_message(MSG_ERROR, _("" "player_build_remove called with BUILD_NONE for user %s\n"), player_name(player_num, TRUE)); break; case BUILD_BRIDGE: edge = map_edge(callbacks.get_map(), x, y, pos); edge->owner = -1; callbacks.draw_edge(edge); edge->type = BUILD_NONE; log_message(MSG_BUILD, _("%s removed a bridge.\n"), player_name(player_num, TRUE)); if (player_num == my_player_num()) stock_replace_bridge(); break; case BUILD_MOVE_SHIP: /* This clause here to remove a compiler warning. It should not be possible to reach this case. */ g_error("Bug: unreachable code reached"); break; } }