DELTA
SVN   �‹f�‹f€�‹f/********************************************************************** 
 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
***********************************************************************/

#ifdef HAVE_CONFIG_H
#include <fc_config.h>
#endif

/* common */
#include "effects.h"
#include "game.h"
#include "government.h"
#include "player.h"
#include "road.h"
#include "specialist.h"
#include "tech.h"

/* server */
#include "ruleset.h"

#include "rssanity.h"

/**************************************************************************
  Does nation have tech initially?
**************************************************************************/
static bool nation_has_initial_tech(struct nation_type *pnation,
                                    struct advance *tech)
{
  int i;

  /* See if it's given as global init tech */
  for (i = 0; i < MAX_NUM_TECH_LIST
       && game.rgame.global_init_techs[i] != A_LAST; i++) {
    if (game.rgame.global_init_techs[i] == advance_number(tech)) {
      return TRUE;
    }
  }

  /* See if it's given as national init tech */
  for (i = 0;
       i < MAX_NUM_TECH_LIST && pnation->init_techs[i] != A_LAST;
       i++) {
    if (pnation->init_techs[i] == advance_number(tech)) {
      return TRUE;
    }
  }

  return FALSE;
}

/**************************************************************************
  Helper function for sanity_check_req_list() and sanity_check_req_vec()
**************************************************************************/
static bool sanity_check_req_set(int reqs_of_type[], int local_reqs_of_type[],
                                 struct requirement *preq,
                                 int max_tiles, const char *list_for)
{
  int rc;

  fc_assert_ret_val(universals_n_is_valid(preq->source.kind), FALSE);

  /* Add to counter */
  reqs_of_type[preq->source.kind]++;
  rc = reqs_of_type[preq->source.kind];

  if (preq->range == REQ_RANGE_LOCAL) {
    local_reqs_of_type[preq->source.kind]++;

    switch (preq->source.kind) {
     case VUT_TERRAINCLASS:
       if (local_reqs_of_type[VUT_TERRAIN] > 0) {
         log_error("%s: Requirement list has both local terrain and terrainclass requirement",
                   list_for);
         return FALSE;
       }
       break;
     case VUT_TERRAIN:
       if (local_reqs_of_type[VUT_TERRAINCLASS] > 0) {
         log_error("%s: Requirement list has both local terrain and terrainclass requirement",
                   list_for);
         return FALSE;
       }
       break;
     default:
       break;
    }
  }

  if (rc > 1) {
    /* Multiple requirements of the same type */
    switch (preq->source.kind) {
     case VUT_GOVERNMENT:
     case VUT_NATION:
     case VUT_UTYPE:
     case VUT_UCLASS:
     case VUT_OTYPE:
     case VUT_SPECIALIST:
     case VUT_MINSIZE: /* Breaks nothing, but has no sense either */
     case VUT_MINYEAR:
     case VUT_AI_LEVEL:
     case VUT_TERRAINALTER: /* Local range only */
     case VUT_CITYTILE:
       /* There can be only one requirement of these types (with current
        * range limitations)
        * Requirements might be identical, but we consider multiple
        * declarations error anyway. */

       log_error("%s: Requirement list has multiple %s requirements",
                 list_for, universal_type_rule_name(&preq->source));
       return FALSE;
       break;

     case VUT_TERRAIN:
     case VUT_RESOURCE:
       /* There can be only up to max_tiles requirements of these types */
       if (max_tiles != -1 && rc > max_tiles) {
         log_error("%s: Requirement list has more %s requirements than "
                   "can ever be fullfilled.", list_for,
                   universal_type_rule_name(&preq->source));
         return FALSE;
       }
       break;

     case VUT_TERRAINCLASS:
       if (rc > 2 || (max_tiles != -1 && rc > max_tiles)) {
         log_error("%s: Requirement list has more %s requirements than "
                   "can ever be fullfilled.", list_for,
                   universal_type_rule_name(&preq->source));
         return FALSE;
       }
       break;

     case VUT_SPECIAL:
     case VUT_BASE:
     case VUT_ROAD:
       /* Note that there can be more than 1 special, road, or base / tile. */
     case VUT_NONE:
     case VUT_ADVANCE:
     case VUT_IMPROVEMENT:
     case VUT_UTFLAG:
     case VUT_UCFLAG:
     case VUT_TERRFLAG:
       /* Can have multiple requirements of these types */
       break;
     case VUT_COUNT:
       /* Should never be in requirement vector */
       fc_assert(FALSE);
       return FALSE;
       break;
       /* No default handling here, as we want compiler warning
        * if new requirement type is added to enum and it's not handled
        * here. */
    }
  }

  return TRUE;
}

/**************************************************************************
  Check if requirement list is free of conflicting requirements.
  max_tiles is number of tiles that can provide requirement. Value -1
  disables checking based on number of tiles.

  Returns TRUE iff everything ok.

  TODO: This is based on current hardcoded range limitations.
        - There should be method of automatically determining these
          limitations for each requirement type
        - This function should check also problems caused by defining
          range to less than hardcoded max for requirement type
**************************************************************************/
static bool sanity_check_req_list(const struct requirement_list *preqs,
                                  int max_tiles,
                                  const char *list_for)
{
  int reqs_of_type[VUT_COUNT];
  int local_reqs_of_type[VUT_COUNT];

  /* Initialize requirement counters */
  memset(reqs_of_type, 0, sizeof(reqs_of_type));
  memset(local_reqs_of_type, 0, sizeof(local_reqs_of_type));

  requirement_list_iterate(preqs, preq) {
    if (!sanity_check_req_set(reqs_of_type, local_reqs_of_type, preq, max_tiles, list_for)) {
      return FALSE;
    }
  } requirement_list_iterate_end;

  return TRUE;
}

/**************************************************************************
  Requirement vector version of requirement sanity checking. See
  retuirement list version for comments.
**************************************************************************/
static bool sanity_check_req_vec(const struct requirement_vector *preqs,
                                 int max_tiles,
                                 const char *list_for)
{
  int reqs_of_type[VUT_COUNT];
  int local_reqs_of_type[VUT_COUNT];

  /* Initialize requirement counters */
  memset(reqs_of_type, 0, sizeof(reqs_of_type));
  memset(local_reqs_of_type, 0, sizeof(local_reqs_of_type));

  requirement_vector_iterate(preqs, preq) {
    if (!sanity_check_req_set(reqs_of_type, local_reqs_of_type, preq, max_tiles, list_for)) {
      return FALSE;
    }
  } requirement_vector_iterate_end;

  return TRUE;
}

/**************************************************************************
  Check that requirement list and negated requirements list do not have
  confliciting requirements.

  Returns TRUE iff everything ok.
**************************************************************************/
static bool sanity_check_req_nreq_list(const struct requirement_list *preqs,
                                       const struct requirement_list *pnreqs,
                                       int one_tile,
                                       const char *list_for)
{
  /* Check internal sanity of requirement list */
  if (!sanity_check_req_list(preqs, one_tile, list_for)) {
    return FALSE;
  }

  /* There is no pnreqs in all cases */
  if (pnreqs != NULL) {
    /* Check sanity between reqs and nreqs */
    requirement_list_iterate(preqs, preq) {
      requirement_list_iterate(pnreqs, pnreq) {
        if (are_requirements_equal(preq, pnreq)) {
          log_error("%s: Identical %s requirement in requirements and "
                    "negated requirements.", list_for,
                    universal_type_rule_name(&preq->source));
          return FALSE;
        }
      } requirement_list_iterate_end;
    } requirement_list_iterate_end;
  }

  return TRUE;
}

/**************************************************************************
  Check that requirement vector and negated requirements vector do not have
  conflicting requirements.

  Returns TRUE iff everything ok.
**************************************************************************/
static bool sanity_check_req_nreq_vec(const struct requirement_vector *preqs,
                                      const struct requirement_vector *pnreqs,
                                      int one_tile,
                                      const char *vec_for)
{
  /* Check internal sanity of requirement vector */
  if (!sanity_check_req_vec(preqs, one_tile, vec_for)) {
    return FALSE;
  }

  /* There is no pnreqs in all cases */
  if (pnreqs != NULL) {
    /* Check sanity between reqs and nreqs */
    requirement_vector_iterate(preqs, preq) {
      requirement_vector_iterate(pnreqs, pnreq) {
        if (are_requirements_equal(preq, pnreq)) {
          log_error("%s: Identical %s requirement in requirements and "
                    "negated requirements.", vec_for,
                    universal_type_rule_name(&preq->source));
          return FALSE;
        }
      } requirement_vector_iterate_end;
    } requirement_vector_iterate_end;
  }

  return TRUE;
}

/**************************************************************************
  Sanity check callback for iterating effects cache.
**************************************************************************/
static bool effect_list_sanity_cb(const struct effect *peffect)
{
  int one_tile = -1; /* TODO: Determine correct value from effect.
                      *       -1 disables checking */

  return sanity_check_req_nreq_list(peffect->reqs, peffect->nreqs, one_tile,
                                    effect_type_name(peffect->type));
}

/**************************************************************************
  Some more sanity checking once all rulesets are loaded. These check
  for some cross-referencing which was impossible to do while only one
  party was loaded in load_ruleset_xxx()

  Returns TRUE iff everything ok.
**************************************************************************/
bool sanity_check_ruleset_data(void)
{
  int num_utypes;
  int i;
  bool ok = TRUE; /* Store failures to variable instead of returning
                   * immediately so all errors get printed, not just first
                   * one. */

  /* Check that all players can have their initial techs */
  nations_iterate(pnation) {
    int i;

    /* Check global initial techs */
    for (i = 0; i < MAX_NUM_TECH_LIST
         && game.rgame.global_init_techs[i] != A_LAST; i++) {
      Tech_type_id tech = game.rgame.global_init_techs[i];
      struct advance *a = valid_advance_by_number(tech);

      if (!a) {
        ruleset_error(LOG_FATAL,
                      "Tech %s does not exist, but is initial "
                      "tech for everyone.",
                      advance_rule_name(advance_by_number(tech)));
      }
      if (advance_by_number(A_NONE) != a->require[AR_ROOT]
          && !nation_has_initial_tech(pnation, a->require[AR_ROOT])) {
        /* Nation has no root_req for tech */
        ruleset_error(LOG_FATAL,
                      "Tech %s is initial for everyone, but %s has "
                      "no root_req for it.",
                      advance_rule_name(a),
                      nation_rule_name(pnation));
      }
    }

    /* Check national initial techs */
    for (i = 0;
         i < MAX_NUM_TECH_LIST && pnation->init_techs[i] != A_LAST;
         i++) {
      Tech_type_id tech = pnation->init_techs[i];
      struct advance *a = valid_advance_by_number(tech);

      if (!a) {
        ruleset_error(LOG_FATAL,
                      "Tech %s does not exist, but is tech for %s.",
                      advance_rule_name(advance_by_number(tech)),
                      nation_rule_name(pnation));
        ok = FALSE;
      }
      if (advance_by_number(A_NONE) != a->require[AR_ROOT]
          && !nation_has_initial_tech(pnation, a->require[AR_ROOT])) {
        /* Nation has no root_req for tech */
        ruleset_error(LOG_FATAL,
                      "Tech %s is initial for %s, but they have "
                      "no root_req for it.",
                      advance_rule_name(a),
                      nation_rule_name(pnation));
        ok = FALSE;
      }
    }
  } nations_iterate_end;

  /* Check against unit upgrade loops */
  num_utypes = game.control.num_unit_types;
  unit_type_iterate(putype) {
    int chain_length = 0;
    struct unit_type *upgraded = putype;

    while (upgraded != NULL) {
      upgraded = upgraded->obsoleted_by;
      chain_length++;
      if (chain_length > num_utypes) {
        ruleset_error(LOG_FATAL,
                      "There seems to be obsoleted_by loop in update "
                      "chain that starts from %s", utype_rule_name(putype));
        ok = FALSE;
      }
    }
  } unit_type_iterate_end;

  /* Check requirement sets against conflicting requirements.
   * Effects use requirement lists */
  if (!iterate_effect_cache(effect_list_sanity_cb)) {
    ruleset_error(LOG_FATAL, "Effects have conflicting requirements!");
    ok = FALSE;
  }

  /* Others use requirement vectors */

  /* Disasters */
  disaster_type_iterate(pdis) {
    if (!sanity_check_req_nreq_vec(&pdis->reqs, &pdis->nreqs, -1,
                                   disaster_rule_name(pdis))) {
      ruleset_error(LOG_FATAL, "Disasters requirements are not sane!");
      ok = FALSE;
    }
  } disaster_type_iterate_end;

  /* Buildings */
  improvement_iterate(pimprove) {
    if (!sanity_check_req_vec(&pimprove->reqs, -1,
                              improvement_rule_name(pimprove))) {
      ruleset_error(LOG_FATAL, "Buildings have conflicting requirements!");
      ok = FALSE;
    }
  } improvement_iterate_end;

  /* Governments */
  governments_iterate(pgov) {
    if (!sanity_check_req_vec(&pgov->reqs, -1,
                              government_rule_name(pgov))) {
      ruleset_error(LOG_FATAL, "Governments have conflicting requirements!");
      ok = FALSE;
    }
  } governments_iterate_end;

  /* Specialists */
  specialist_type_iterate(sp) {
    struct specialist *psp = specialist_by_number(sp);

    if (!sanity_check_req_vec(&psp->reqs, -1,
                              specialist_rule_name(psp))) {
      ruleset_error(LOG_FATAL, "Specialists have conflicting requirements!");
      ok = FALSE;
    }
  } specialist_type_iterate_end;

  /* Bases */
  base_type_iterate(pbase) {
    if (!sanity_check_req_vec(&pbase->reqs, -1,
                              base_rule_name(pbase))) {
      ruleset_error(LOG_FATAL, "Bases have conflicting requirements!");
      ok = FALSE;
    }
  } base_type_iterate_end;

  /* Roads */
  road_type_iterate(proad) {
    if (!sanity_check_req_vec(&proad->reqs, -1,
                              road_rule_name(proad))) {
      ruleset_error(LOG_FATAL, "Roads have conflicting requirements!");
      ok = FALSE;
    }
  } road_type_iterate_end;

  /* City styles */
  for (i = 0; i < game.control.styles_count; i++) {
    if (!sanity_check_req_vec(&city_styles[i].reqs, -1,
                              city_style_rule_name(i))) {
      ruleset_error(LOG_FATAL, "City styles have conflicting requirements!");
      ok = FALSE;
    }
  }

  terrain_type_iterate(pterr) {
    unit_class_iterate(uc) {
      if (BV_ISSET(pterr->native_to, uclass_index(uc))) {
        if (is_ocean(pterr) && uc->move_type == UMT_LAND) {
          ruleset_error(LOG_FATAL,
                        "Oceanic %s is native to land units.",
                        terrain_rule_name(pterr));
          ok = FALSE;
        } else if (!is_ocean(pterr) && uc->move_type == UMT_SEA) {
          ruleset_error(LOG_FATAL,
                        "Non-oceanic %s is native to sea units.",
                        terrain_rule_name(pterr));
          ok = FALSE;
        }
      }
    } unit_class_iterate_end;
  } terrain_type_iterate_end;

  /* Check that all unit classes can exist somewhere */
  unit_class_iterate(pclass) {
    if (!uclass_has_flag(pclass, UCF_BUILD_ANYWHERE)) {
      bool can_exist = FALSE;

      terrain_type_iterate(pterr) {
        if (BV_ISSET(pterr->native_to, uclass_index(pclass))) {
          can_exist = TRUE;
          break;
        }
      } terrain_type_iterate_end;

      if (!can_exist) {
        base_type_iterate(pbase) {
          if (BV_ISSET(pbase->native_to, uclass_index(pclass))
              && base_has_flag(pbase, BF_NATIVE_TILE)) {
            can_exist = TRUE;
            break;
          }
        } base_type_iterate_end;
      }

      if (!can_exist) {
        road_type_iterate(proad) {
          if (BV_ISSET(proad->native_to, uclass_index(pclass))
             && road_has_flag(proad, RF_NATIVE_TILE)) {
            can_exist = TRUE;
            break;
          }
        } road_type_iterate_end;
      }

      if (!can_exist) {
        ruleset_error(LOG_FATAL,
                      "Unit class %s cannot exist anywhere.",
                      uclass_rule_name(pclass));
        ok = FALSE;
      }
    }
  } unit_class_iterate_end;

  return ok;
}
ENDREP
DELTA
SVN   †+†+€†+/********************************************************************** 
 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
***********************************************************************/
#ifndef FC__RSSANITY_H
#define FC__RSSANITY_H

bool sanity_check_ruleset_data(void);

#endif  /* FC__RSSANITY_H */
ENDREP
DELTA 21641 3384 4102
SVN  †  †  0‡F ‹ €� ¡;‹m G  �>³b€x „‡¶-” ˆG„¾*€‚! �Ù„Æe€ƒtraderoutes.h"
#include "unit.h"
#include "unittype.h"

/* server */
#include "citytools.h"
#include "plrhand.h"
#include "rssanityvoid ruleset_error_real(const char *file, const char *function,
                        int line, enum log_level level,
    const char *cstrcstr = secfile_lookup_str(file, "%s.class", tsection);
    pterrain->tclass = terrain_class_by_name(cstr, fc_strcasecmp);
    if (!terrain_class_is_valid(pterrain->tclass)) {
      ruleset_error(LOG_FATAL, "\"%s\": [%s] unknown class \"%s\"",
                    filename, tsection, cstr);    city_name[MAX_LEN_NAME - 1] = '\0';
    }
    pncity = nation_city_new(pnation, city_name);

    if (NULL != p) {
      /* Handle the labels one at a time. */
      do {
        enum nation_city_preference prefer;

        if ((next = strchr(p, ','))) {
          *next = '\0';
        }
        remove_leading_trailing_spaces(p);

        /* The ! is used to mark a negative, which is recorded with
  †  …¶J„¹y>‡X �Å ƒ’ �ŠL�È‘ N–t€„3 À‚Ò\™ µ"ƒ’[ �Bƒ¿|€‚_ R„‰ å'ƒÇtŠ …„­  const char *namefor (i = 0; (name             "trade.settings%d.type",
                                                 i)); i++) {
    enum trade_route_type type = trade_route_type_by_name(name);

    if (type == TRT_LAST) {
      ruleset_error(LOG_FATAL,
                    "\"%s\" unknown trade route type \"%s\".",
                    filename, name);
    } else {
      struct trade_route_settings *set = trade_route_settings_by_type(type);

      set->trade_pct = secfile_lookup_int_default(file, 100,
                                                  "trade.settings%d.pct", i);
    }
  }tclass = pterrain->tclasstrade_routes(struct conn_list *dest)
{
  struct packet_ruleset_trade packet;
  enum trade_route_type type;

  for (type = TRT_NATIONAL; type < TRT_LAST; type++) {
    struct trade_route_settings *set = trade_route_settings_by_type(type);

    packet.id = type;
    packet.trade_pct = set->trade_pct;

    lsend_packet_ruleset_trade(dest, &packet);
  }rade_routeENDREP
DELTA 20154 0 1392
SVN  šX�/@ˆm c €` F� €�e �?‚i‹ …k„>– …8Š!€f �5�e€m �’<€�. �
•F­ ‚—z€‚Y ]™{if FREECIV_WEB
srvbin = freeciv-web
else
srvbin = freeciv-server
endif

bin_PROGRAMS = $(srvbin)ai \
	-I$(top_srcdir)/ai/default \
	-I$(top_srcdir)/common \
	-I$(top_srcdir)/common/aicore \
	-I$(top_srcdir)/common/scriptcore \
	-I$(top_srcdir)/utility \
	-I$(srcdir)/advisors \
	-I$(srcdir)/generator \
	-I$(srcdir)/scriptingexe_sourcesssanity.c	\
		rssanityclassicai.la
else
if AI_MOD_STATIC_CLASSIC
da_libs += $(top_builddir)/ai/default/libclassicai.la
endif\
	$(srcdir)/hand_gen.c \
	$(srcdir)/hand_gen.h

srvlibs = \
 $(da_libs) \
 $(top_builddir)/ai/libaicommon.lafcdb.la \
 $(top_builddir)/server/scripting/libscripting_server.la

libfreeciv_srv_la_DEPENDENCIES = \
 $(srvlibs)

libfreeciv_srv_la_LIBADD = \
 $(srvlibs)

exe_dependenciesexe_ldflags = $(GGZDMOD_LDFLAGS)

exe_ldadd =if FREECIV_WEB
freeciv_web_SOURCES = $(exe_sources)
freeciv_web_DEPENDENCIES = $(exe_dependencies)
freeciv_web_LDFLAGS = $(exe_ldflags)
freeciv_web_LDADD = $(exe_ldadd)
else
freeciv_server_SOURCES = $(exe_sources)
freeciv_server_DEPENDENCIES = $(exe_dependencies)
freeciv_server_LDFLAGS = $(exe_ldflags)
freeciv_server_LDADD = $(exe_ldadd)
endifENDREP
DELTA 21454 4685 229
SVN  ‡‹
„ †t €„†rvoid ruleset_error_real(const char *file, const char *function,
                        int line, enum log_level level,
                        const char *format, ...)
  fc__attribute((__format__ (__printf__, 5, 6)));

#define ruleset_error(level, format, ...)                               \
  if (log_do_output_for_level(level)) {                                 \
    ruleset_error_real(__FILE__, __FUNCTION__, __FC_LINE__,             \
                       level, format, ## __VA_ARGS__);                  \
  }ENDREP
id: 8w.5ck.r21709/22681
type: file
pred: 8w.5ck.r21650/15128
count: 556
text: 21709 18762 2086 175353 00f67cbe0fa445a65747141decd74d4c
props: 11085 367 112 0 7f6d12fc80ead5cc285da723cb8caa9d
cpath: /trunk/server/ruleset.c
copyroot: 15280 /trunk

id: 8x.5ck.r21709/22927
type: file
pred: 8x.5ck.r21454/6679
count: 17
text: 21709 22112 541 1433 ee302e742b74547f6ae7e47458317630
props: 10951 8012 111 0 3d57169d64a739976bce7d2e578e29eb
cpath: /trunk/server/ruleset.h
copyroot: 15280 /trunk

id: hew.5ck.r21709/23169
type: file
count: 0
text: 21709 0 17911 17894 641c8d08a41a32721d071fce8a02ca8a
cpath: /trunk/server/rssanity.c
copyroot: 15280 /trunk

id: hey.5ck.r21709/23329
type: file
count: 0
text: 21709 17924 825 811 612db3d027061c0e61b0af4d894d177c
cpath: /trunk/server/rssanity.h
copyroot: 15280 /trunk

id: 5q.5ck.r21709/23489
type: file
pred: 5q.5ck.r21570/2443
count: 88
text: 21709 20877 1209 3759 7f513d09f116e5449328e53218942aa6
props: 10619 59300 111 0 8ba011ca1ef4e408ab91a853a48e15eb
cpath: /trunk/server/Makefile.am
copyroot: 15280 /trunk

PLAIN
K 11
Makefile.am
V 24
file 5q.5ck.r21709/23489
K 8
advisors
V 24
dir 4n2.5ck.r21647/37396
K 9
aiiface.c
V 24
file 4gm.5ck.r20695/2927
K 9
aiiface.h
V 24
file 4gn.5ck.r20559/1295
K 6
auth.c
V 25
file 39c.5ck.r20274/32101
K 6
auth.h
V 25
file 39d.5ck.r18977/19170
K 11
barbarian.c
V 25
file lw.5ck.r21517/101972
K 11
barbarian.h
V 24
file lx.5ck.r18054/18407
K 14
citizenshand.c
V 24
file 6mz.5ck.r21434/4187
K 14
citizenshand.h
V 24
file 6n0.5ck.r21434/4374
K 10
cityhand.c
V 24
file 10.5ck.r19573/66885
K 10
cityhand.h
V 23
file 4f.0.r13297/423686
K 11
citytools.c
V 24
file 4g.5ck.r21647/36026
K 11
citytools.h
V 24
file 4h.5ck.r18270/28958
K 10
cityturn.c
V 24
file 4i.5ck.r21628/11408
K 10
cityturn.h
V 24
file 4j.5ck.r20892/25211
K 11
civserver.c
V 23
file 4k.5ck.r21302/6235
K 11
civserver.h
V 21
file 4l.0.r2805/33121
K 10
commands.c
V 25
file 2ly.5ck.r21333/42696
K 10
commands.h
V 25
file 2lz.5ck.r20758/18307
K 13
connecthand.c
V 24
file 2dw.5ck.r20401/8151
K 13
connecthand.h
V 25
file 2dx.5ck.r18942/25217
K 9
console.c
V 22
file dd.5ck.r20765/191
K 9
console.h
V 23
file de.5ck.r19183/7918
K 10
diplhand.c
V 24
file 4m.5ck.r20286/38784
K 10
diplhand.h
V 21
file 4n.0.r13421/6826
K 11
diplomats.c
V 25
file vz.5ck.r21517/102712
K 11
diplomats.h
V 23
file w0.5ck.r19106/3619
K 10
edithand.c
V 26
file 3bk.5ck.r21517/102463
K 10
edithand.h
V 26
file 4ez.5ck.r18452/115476
K 6
fcdb.c
V 23
file 6l3.5ck.r21489/222
K 6
fcdb.h
V 25
file 6l4.5ck.r21255/12759
K 10
gamehand.c
V 24
file 4o.5ck.r20666/33497
K 10
gamehand.h
V 24
file 4p.5ck.r15698/24111
K 9
generator
V 24
dir 2me.5ck.r21647/35784
K 11
ggzserver.c
V 25
file 39a.5ck.r20126/49744
K 11
ggzserver.h
V 23
file 39b.5ck.r20191/350
K 10
handchat.c
V 23
file 4q.5ck.r21364/3610
K 10
handchat.h
V 24
file dj.5ck.r18270/28229
K 9
maphand.c
V 24
file 13.5ck.r21647/37883
K 9
maphand.h
V 23
file 14.5ck.r20902/2251
K 6
meta.c
V 24
file 4s.5ck.r19780/20117
K 6
meta.h
V 24
file 4t.5ck.r18054/19078
K 8
notify.c
V 25
file 4i2.5ck.r20229/25959
K 8
notify.h
V 24
file 4i3.5ck.r18282/3660
K 9
plrhand.c
V 22
file 4u.5ck.r21663/846
K 9
plrhand.h
V 24
file 4v.5ck.r21333/44124
K 8
report.c
V 25
file vi.5ck.r21517/101480
K 8
report.h
V 24
file vj.5ck.r18270/29203
K 10
rssanity.c
V 25
file hew.5ck.r21709/23169
K 10
rssanity.h
V 25
file hey.5ck.r21709/23329
K 9
ruleset.c
V 24
file 8w.5ck.r21709/22681
K 9
ruleset.h
V 24
file 8x.5ck.r21709/22927
K 13
sanitycheck.c
V 23
file wi.5ck.r21304/7351
K 13
sanitycheck.h
V 24
file wj.5ck.r20315/26296
K 10
savegame.c
V 22
file vl.5ck.r21466/166
K 10
savegame.h
V 24
file vm.5ck.r20758/19233
K 11
savegame2.c
V 24
file 4m0.5ck.r21575/3025
K 11
savegame2.h
V 25
file 4m1.5ck.r21363/11592
K 7
score.c
V 25
file 2eg.5ck.r19941/19796
K 7
score.h
V 25
file 2eh.5ck.r19156/21934
K 9
scripting
V 23
dir 31x.5ck.r21608/1528
K 8
sernet.c
V 23
file 15.5ck.r20559/1478
K 8
sernet.h
V 24
file 4y.5ck.r19197/31924
K 10
settings.c
V 24
file 2m0.5ck.r21632/8875
K 10
settings.h
V 24
file 2m1.5ck.r20244/5486
K 11
spacerace.c
V 24
file 9a.5ck.r19268/77290
K 11
spacerace.h
V 21
file 9b.0.r11338/1129
K 9
srv_log.c
V 25
file 15t.5el.r20229/25451
K 9
srv_log.h
V 25
file 15u.5em.r20315/26035
K 10
srv_main.c
V 24
file vg.5ck.r21641/14506
K 10
srv_main.h
V 24
file vh.5ck.r20964/10558
K 11
stdinhand.c
V 23
file 4z.5ck.r21607/6480
K 11
stdinhand.h
V 23
file 50.5ck.r18978/5769
K 11
techtools.c
V 24
file 33n.5ck.r21632/9121
K 11
techtools.h
V 24
file 33o.5ck.r18665/2277
K 10
unithand.c
V 25
file 18.5ck.r21517/103208
K 10
unithand.h
V 24
file 19.5ck.r21095/21648
K 11
unittools.c
V 23
file 1a.5ck.r21643/1064
K 11
unittools.h
V 23
file 1b.5ck.r21269/1443
K 8
voting.c
V 24
file 4ex.5ck.r21364/3852
K 8
voting.h
V 25
file 4ey.5ck.r18054/19315
END
ENDREP
id: z.5ck.r21709/27466
type: dir
pred: z.5ck.r21663/4721
count: 4858
text: 21709 23735 3718 3718 5c3aa71d2ba2048ea780828511b222d6
props: 17175 659 139 0 d1c9699dde7f9d81e54426750008041d
cpath: /trunk/server
copyroot: 15280 /trunk

PLAIN
K 9
ABOUT-NLS
V 22
file fu.0.r13215/85704
K 7
AUTHORS
V 19
file 5u.0.r12982/94
K 7
COPYING
V 19
file 1h.0.r9643/400
K 9
ChangeLog
V 26
file 6l.5ck.r20415/4358289
K 7
INSTALL
V 22
file 6.5ck.r21468/8473
K 11
Makefile.am
V 22
file 59.5ck.r21668/716
K 4
NEWS
V 23
file 6m.5ck.r20417/3239
K 6
README
V 20
file 7.0.r4421/96382
K 2
ai
V 22
dir 8.5ck.r21647/33885
K 10
autogen.sh
V 23
file 12o.5ck.r21323/726
K 9
bootstrap
V 22
dir 2p5.5ck.r21695/916
K 6
client
V 22
dir d.5ck.r21706/19771
K 6
common
V 22
dir p.5ck.r21701/12392
K 12
config.mac.h
V 20
file hb.0.r6045/5982
K 12
configure.ac
V 23
file 149.5ck.r21666/732
K 4
data
V 22
dir w.5ck.r21697/11317
K 6
debian
V 24
dir 5w.5ck.r21460/324392
K 12
dependencies
V 24
dir 2yu.5ck.r21572/14485
K 11
diff_ignore
V 24
file qq.5ck.r21039/26581
K 3
doc
V 22
dir k7.5ck.r21697/6848
K 10
fc_version
V 25
file 2lo.5en.r21655/13787
K 2
m4
V 23
dir 12p.5ck.r21675/3352
K 2
po
V 22
dir fs.5ck.r21652/2286
K 7
scripts
V 22
dir 2yo.5ck.r21694/735
K 6
server
V 22
dir z.5ck.r21709/27466
K 10
stamp-h.in
V 19
file 80.0.r1125/241
K 5
tests
V 23
dir 2g9.5ck.r20384/1173
K 5
tools
V 22
dir 4pj.5js.r21472/121
K 7
utility
V 22
dir 1c.5ck.r21691/6216
K 3
vms
V 25
dir u9.5ck.r21528/1396085
K 5
win32
V 23
dir 2eu.5ck.r21679/1265
END
ENDREP
id: 3.5ck.r21709/28969
type: dir
pred: 3.5ck.r21706/21271
count: 15675
text: 21709 27697 1259 1259 8ef4c3288f97471d25c785a42c492ffa
props: 20140 3888 282 0 e4bb46e81629a60eef613b169b23a9ea
cpath: /trunk
copyroot: 15280 /trunk

PLAIN
K 8
branches
V 22
dir 1.0.r21708/1299988
K 4
tags
V 19
dir 2.0.r21087/5782
K 5
trunk
V 22
dir 3.5ck.r21709/28969
K 7
website
V 18
dir 3ge.0.r12388/0
END
ENDREP
id: 0.0.r21709/29362
type: dir
pred: 0.0.r21708/1300317
count: 21709
text: 21709 29196 153 153 9c3fd4375bed81e7e5a777a9a98f38f9
cpath: /
copyroot: 0 /

5q.5ck.t21708-1 modify true false /trunk/server/Makefile.am

8x.5ck.t21708-1 modify true false /trunk/server/ruleset.h

_2.5ck.t21708-1 add true false /trunk/server/rssanity.c

_4.5ck.t21708-1 add true false /trunk/server/rssanity.h

8w.5ck.t21708-1 modify true false /trunk/server/ruleset.c


29362 29514
