<URL: http://bugs.freeciv.org/Ticket/Display.html?id=34111 >
On 1/21/07, Marko Lindqvist <[EMAIL PROTECTED]> wrote:
> On 1/20/07, Marko Lindqvist <[EMAIL PROTECTED]> wrote:
> > For S2_1 adding ruleset for another barbarian nation is sufficient,
> > but in trunk code should be changed so that it doesn't even accept
> > same nation for both barbarian players.
>
> Here is untested code patch for trunk. Ruleset changes need to go in
> before this.
- Accept non-playable nations for barbarians. I'm not happy with
this. Is there other unplayable nations than barbarians?
- Do not pick_a_nation() again when barbarian player reborns.
- ML
diff -Nurd -X.diff_ignore freeciv/server/barbarian.c freeciv/server/barbarian.c
--- freeciv/server/barbarian.c 2007-01-24 18:09:41.000000000 +0200
+++ freeciv/server/barbarian.c 2007-01-26 22:01:44.000000000 +0200
@@ -81,30 +81,6 @@
return (pplayer->ai.barbarian_type == SEA_BARBARIAN);
}
-/****************************************************************************
- Return an available barbarian nation. This simply returns the first
- available nation, or the first nation already in use by another barbarian
- player.
-****************************************************************************/
-struct nation_type *pick_barbarian_nation(void)
-{
- nations_iterate(pnation) {
- if (is_nation_barbarian(pnation) && !pnation->player) {
- return pnation;
- }
- } nations_iterate_end;
-
- players_iterate(pplayer) {
- if (is_barbarian(pplayer)) {
- assert(is_nation_barbarian(pplayer->nation));
- return pplayer->nation;
- }
- } players_iterate_end;
-
- assert(0);
- return NO_NATION_SELECTED;
-}
-
/**************************************************************************
Creates the land/sea barbarian player and inits some stuff. If
barbarian player already exists, return player pointer. If barbarians
@@ -112,20 +88,20 @@
Dead barbarians forget the map and lose the money.
**************************************************************************/
-static struct player *create_barbarian_player(bool land)
+static struct player *create_barbarian_player(enum barbarian_type type)
{
int newplayer = game.info.nplayers;
struct player *barbarians;
- struct nation_type *nation = pick_barbarian_nation();
+ struct nation_type *nation;
players_iterate(barbarians) {
- if ((land && is_land_barbarian(barbarians))
- || (!land && is_sea_barbarian(barbarians))) {
+ if ((type == LAND_BARBARIAN && is_land_barbarian(barbarians))
+ || (type == SEA_BARBARIAN && is_sea_barbarian(barbarians))) {
if (!barbarians->is_alive) {
barbarians->economic.gold = 0;
barbarians->is_alive = TRUE;
barbarians->is_dying = FALSE;
- pick_random_player_name(nation, barbarians->name);
+ pick_random_player_name(barbarians->nation, barbarians->name);
sz_strlcpy(barbarians->username, ANON_USER_NAME);
/* I need to make them to forget the map, I think */
whole_map_iterate(ptile) {
@@ -147,6 +123,7 @@
server_player_init(barbarians, TRUE, TRUE);
+ nation = pick_a_nation(NULL, FALSE, TRUE, type);
player_set_nation(barbarians, nation);
pick_random_player_name(nation, barbarians->name);
@@ -165,11 +142,7 @@
/* Do the ai */
barbarians->ai.control = TRUE;
- if (land) {
- barbarians->ai.barbarian_type = LAND_BARBARIAN;
- } else {
- barbarians->ai.barbarian_type = SEA_BARBARIAN;
- }
+ barbarians->ai.barbarian_type = type;
set_ai_level_directer(barbarians, game.info.skill_level);
init_tech(barbarians);
give_initial_techs(barbarians);
@@ -240,7 +213,7 @@
return FALSE;
}
- barbarians = create_barbarian_player(TRUE);
+ barbarians = create_barbarian_player(LAND_BARBARIAN);
if (!barbarians) {
return FALSE;
}
@@ -427,7 +400,7 @@
int rand_factor = myrand(3);
/* land (disembark) barbarians */
- barbarians = create_barbarian_player(TRUE);
+ barbarians = create_barbarian_player(LAND_BARBARIAN);
if (city_list_size(victim->cities) > UPRISE_CIV_MOST) {
uprise = 3;
}
@@ -444,7 +417,7 @@
struct unit *ptrans;
struct unit_type *boat;
- barbarians = create_barbarian_player(FALSE);
+ barbarians = create_barbarian_player(SEA_BARBARIAN);
boat = find_a_unit_type(L_BARBARIAN_BOAT,-1);
ptrans = create_unit(barbarians, utile, boat, 0, 0, -1);
cap = get_transporter_capacity(unit_list_get(utile->units, 0));
diff -Nurd -X.diff_ignore freeciv/server/barbarian.h freeciv/server/barbarian.h
--- freeciv/server/barbarian.h 2006-07-17 23:56:22.000000000 +0300
+++ freeciv/server/barbarian.h 2007-01-26 21:58:35.000000000 +0200
@@ -27,7 +27,6 @@
#define MAP_FACTOR 2000 /* adjust this to get a good uprising frequency */
-struct nation_type *pick_barbarian_nation(void);
bool unleash_barbarians(struct tile *ptile);
void summon_barbarians(void);
bool is_land_barbarian(struct player *pplayer);
diff -Nurd -X.diff_ignore freeciv/server/plrhand.c freeciv/server/plrhand.c
--- freeciv/server/plrhand.c 2006-07-21 23:18:07.000000000 +0300
+++ freeciv/server/plrhand.c 2007-01-26 22:00:34.000000000 +0200
@@ -1346,7 +1346,8 @@
****************************************************************************/
struct nation_type *pick_a_nation(struct nation_type **choices,
bool ignore_conflicts,
- bool only_available)
+ bool only_available,
+ enum barbarian_type barb_type)
{
enum {
UNAVAILABLE, AVAILABLE, PREFERRED, UNWANTED
@@ -1361,9 +1362,12 @@
* 3: unwanted - we can used this nation, but we really don't want to
*/
nations_iterate(pnation) {
- if (!is_nation_playable(pnation)
- || pnation->player
- || (only_available && !pnation->is_available)) {
+ if (pnation->player
+ || (only_available && !pnation->is_available)
+ || (barb_type != NOT_A_BARBARIAN && !is_nation_barbarian(pnation))
+ || (barb_type == NOT_A_BARBARIAN
+ && (is_nation_barbarian(pnation)
+ || !is_nation_playable(pnation)))) {
/* Nation is unplayable or already used: don't consider it. */
nations_used[pnation->index] = UNAVAILABLE;
match[pnation->index] = 0;
@@ -1464,7 +1468,8 @@
/* select a new name and nation for the copied player. */
/* Rebel will always be an AI player */
- player_set_nation(cplayer, pick_a_nation(civilwar_nations, TRUE, FALSE));
+ player_set_nation(cplayer, pick_a_nation(civilwar_nations, TRUE, FALSE,
+ NOT_A_BARBARIAN));
pick_random_player_name(cplayer->nation, cplayer->name);
sz_strlcpy(cplayer->username, ANON_USER_NAME);
diff -Nurd -X.diff_ignore freeciv/server/plrhand.h freeciv/server/plrhand.h
--- freeciv/server/plrhand.h 2006-07-17 23:56:22.000000000 +0300
+++ freeciv/server/plrhand.h 2007-01-26 21:58:35.000000000 +0200
@@ -38,7 +38,8 @@
struct nation_type *pick_a_nation(struct nation_type **choices,
bool ignore_conflicts,
- bool only_available);
+ bool only_available,
+ enum barbarian_type barb_type);
void check_player_government_rates(struct player *pplayer);
void make_contact(struct player *pplayer1, struct player *pplayer2,
diff -Nurd -X.diff_ignore freeciv/server/savegame.c freeciv/server/savegame.c
--- freeciv/server/savegame.c 2006-07-17 23:56:22.000000000 +0300
+++ freeciv/server/savegame.c 2007-01-26 21:58:35.000000000 +0200
@@ -1916,8 +1916,14 @@
* necessary. The savegame should already mark those techs as known.
* give_initial_techs will crash if the nation is unset. */
+ /* It is important that barbarian_type is loaded before
+ * calling is_barbarian() and is_land_barbarian() */
if (is_barbarian(plr) && plr->nation == NO_NATION_SELECTED) {
- plr->nation = pick_barbarian_nation();
+ if (is_land_barbarian(plr)) {
+ plr->nation = pick_a_nation(NULL, FALSE, TRUE, LAND_BARBARIAN);
+ } else {
+ plr->nation = pick_a_nation(NULL, FALSE, TRUE, SEA_BARBARIAN);
+ }
}
/* government */
@@ -3839,7 +3845,8 @@
/* Some players may have invalid nations in the ruleset. Pick new
* nations for them. */
if (pplayer->nation == NO_NATION_SELECTED) {
- player_set_nation(pplayer, pick_a_nation(NULL, FALSE, TRUE));
+ player_set_nation(pplayer, pick_a_nation(NULL, FALSE, TRUE,
+ NOT_A_BARBARIAN));
freelog(LOG_NORMAL, "%s had invalid nation; changing to %s.",
pplayer->name, pplayer->nation->name);
}
diff -Nurd -X.diff_ignore freeciv/server/srv_main.c freeciv/server/srv_main.c
--- freeciv/server/srv_main.c 2007-01-26 20:05:25.000000000 +0200
+++ freeciv/server/srv_main.c 2007-01-26 21:58:35.000000000 +0200
@@ -1566,7 +1566,8 @@
continue;
}
- player_set_nation(pplayer, pick_a_nation(NULL, FALSE, TRUE));
+ player_set_nation(pplayer, pick_a_nation(NULL, FALSE, TRUE,
+ NOT_A_BARBARIAN));
assert(pplayer->nation != NO_NATION_SELECTED);
pplayer->city_style = get_nation_city_style(pplayer->nation);
_______________________________________________
Freeciv-dev mailing list
[email protected]
https://mail.gna.org/listinfo/freeciv-dev