DELTA 25394 72242 2299
SVN  �ñ/‚† V� †k ˆ �9†o± � ˆG€�S �çj‰E B�Ô€D L“@€R Q²>Ÿ L“@€s P²?¥ L“@€… T�×?± L“@€�% P²?° L“@€ƒ"iteratorgame.h"
#include "research.h"

#include "tech.h"
struct advance_req_iter {
  struct iterator base;
  bv_techs done;
  const struct advance *array[A_LAST];
  const struct advance **current, **end;
};
#define ADVANCE_REQ_ITER(it) ((struct advance_req_iter *) it)*************
  Return the size of the advance requirements iterator**/
size_t advance_req_iter_sizeof(void)
{
  return sizeof(struct advance_req_iter**
  Return the current advance**/
static void *advance_req_iter_get(const struct iterator *it)
{
  return (void *) *ADVANCE_REQ_ITER(it)->current**
  Jump to next advance requirement**/
static void advance_req_iter_next(struct iterator *it)
{
  struct advance_req_iter *iter = ADVANCE_REQ_ITER(it);
  const struct advance *padvance = *iter->current, *preq;
  enum tech_req req;
  bool new = FALSE;

  for (req = AR_ONE; req < AR_SIZE; req++) {
    preq = valid_advance(advance_requires(padvance, req));
    if (NULL != preq
        && A_NONE != advance_number(preq)
        && !BV_ISSET(iter->done, advance_number(preq))) {
      BV_SET(iter->done, advance_number(preq));
      if (new) {
        *iter->end++ = preq;
      } else {
        *iter->current = preq;
        new = TRUE;
      }
    }
  }

  if (!new) {
    iter->current++**
  Return whether we finished to iterate or not**/
static bool advance_req_iter_valid(const struct iterator *it)
{
  const struct advance_req_iter *iter = ADVANCE_REQ_ITER(it);

  return iter->current < iter->end**
  Initialize an advance requirements iterator**/
struct iterator *advance_req_iter_init(struct advance_req_iter *it,
                                       const struct advance *goal)
{
  struct iterator *base = ITERATOR(it);

  base->get = advance_req_iter_get;
  base->next = advance_req_iter_next;
  base->valid = advance_req_iter_valid;

  BV_CLR_ALL(it->done);
  it->current = it->array;
  *it->current = goal;
  it->end = it->current + 1;

  return base;
}
ENDREP
DELTA 13002 272960 6492
SVN  ¸	½q=¬ …a €‚C �Q†'€ƒ3 �J‰(€‚ aŒ`€Œh •!€K ƒ4—€‹B �­%‘ ‚®7€‹·nfdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/* utility */
#include "bitvector.h"
#include "shared.h"

/* common */
#include "fc_types.h"
#include "name_translation.h"

struct strvec;          /* Actually defined in "utility/string_vector.h". */

/*
  [kept for amusement and posterity]
typedef int Tech_type_id;/* [more accurately]
 * Unlike most other indices, the Tech_type_id is widely used, because it 
 * so frequently passed to packet and scripting.  The client menu routines 
 * sometimes add and substract these numbers.
 */
#define A_NONE 0
#define A_FIRST 1
#define A_LAST MAX_NUM_ITEMS /* Used in the network protocol. */
#define A_UNSET (A_LAST + 1)
#define A_FUTURE (A_LAST + 2)
#define A_UNKNOWN (A_LAST + 3)

#define A_NEVER (NULL)ndicates that no tech is selected (for research).

   A_FUTURE indicates that the player is researching a future tech.

   A_UNKNOWN may be passed to other players instead of the actual value.

   A_LAST is a value that is guaranteed to be larger than all
   actual Tech_type_ility to hold the
   full number of techs.

   A_NEVER is the pointer equivalent replacement for A_LAST flag value.
*/

/* Changing these breaks network compatibility. */
/* If a new flag is added techtools.c:player_tech_lost() should be checked */
#define SPECENUM_NAME tech_flag_id
/* player gets extra tech if rearched first */
#define SPECENUM_VALUE0 TF_BONUS_TECH
#define SPECENUM_VALUE0NAME "Bonus_Tech"
/* "Settler" unit types can build bridges over rivers */
#define SPECENUM_VALUE1 TF_BRIDGE
#define SPECENUM_VALUE1NAME "Bridge"
/* Increase the pollution factor created by population by one */
#define SPECENUM_VALUE2 TF_POPULATION_POLLUTION_INC
#define SPECENUM_VALUE2NAME "Population_Pollution_Inc"
/* Player can build air units */
#define SPECENUM_VALUE3 TF_BUILD_AIRBORNE
#define SPECENUM_VALUE3NAME "Build_Airborne"
/* Player can claim ocean tiles non-adjacent to border source */ 
#define SPECENUM_VALUE4 TF_CLAIM_OCEAN
#define SPECENUM_VALUE4NAME "Claim_Ocean"
#define SPECENUM_VALUE5 TECH_USER_1
#define SPECENUM_VALUE6 TECH_USER_2
#define SPECENUM_VALUE7 TECH_USER_3
#define SPECENUM_VALUE8 TECH_USER_4
#define SPECENUM_VALUE9 TECH_USER_5
#define SPECENUM_VALUE10 TECH_USER_6
#define SPECENUM_VALUE11 TECH_USER_7
#define SPECENUM_VALUE12 TECH_USER_LAST
/* Keep this last. */
#define SPECENUM_COUNT TF_COUNT
#define SPECENUM_BITVECTOR bv_tech_flags
#define SPECENUM_NAMEOVERRIDE
#include "specenum_gen.h"

#define MAX_NUM_USER_TECH_FLAGS (TECH_USER_LAST - TECH_USER_1 + 1)

enum tech_req {
  AR_ONE = 0,
  AR_TWO = 1,
  AR_ROOT = 2,
  AR_SIZE
};

struct advance {
  Tech_type_id item_number;
  struct name_translation name;
  struct advance *require[AR_SIZE];
  bv_tech_flags flags;
  struct strvecbv_techs, A_LAST);

/* General advance/technology accessor functions. */
Tech_type_id advance_count(void);
Tech_type_id advance_index(const struct advance *padvance);
Tech_type_id advance_number(const struct advance *padvance);

struct advance *advance_by_number(const Tech_type_id atype);

struct advance *valid_advance(struct advance *padvance);
struct advance *valid_advance_by_number(const Tech_type_id atype);

struct advance *advance_by_rule_name(const char *name);
struct advance *advance_by_translated_name(const char *name);

const char *advance_rule_name(const struct advance *padvance);
const char *advance_name_translation(const struct advance *padvance);

void user_tech_flags_init(void);
void user_tech_flags_free(void);
void set_user_tech_flag_name(enum tech_flag_id id, const char *name, const char *helptxt);
const char *tech_flag_helptxt(enum tech_flag_id id);

/* General advance/technology flag accessor routines */
bool advance_has_flag(Tech_type_id tech, enum tech_flag_id flag);

/* FIXME: oddball function used in one place */
Tech_type_id advance_by_flag(Tech_type_id index, enum tech_flag_id flag);

/* Ancillary routines */
Tech_type_id player_research_step(const struct player *pplayer,
				  Tech_type_id goal);
void player_research_update(struct player *pplayer);

Tech_type_id advance_required(const Tech_type_id tech,
			      enum tech_req require);
struct advance *advance_requires(const struct advance *padvance,
				 enum tech_req require, bool loss_value
			    Tech_type_id tech,
			    Tech_type_id goal);
bool is_future_tech(Tech_type_id tech);

void precalc_tech_data(void);

/* Initialization and iteration */
void techs_init(void);
void techs_free(void);

/* This iterates over almost all technologies.  It includes non-existent
 * technologies, but not A_FUTURE. */
#define advance_index_iterate(_start, _index)				\
{									\
  Tech_type_id _index = (_start);					\
  for (; _index < advance_count(); _index++) {

#define advance_index_iterate_end					\
  }									\
}

const struct advance *advance_array_last(void);

#define advance_iterate(_start, _p)					\
{									\
  struct advance *_p = advance_by_number(_start);			\
  if (NULL != _p) {							\
    for (; _p <= advance_array_last(); _p++) {

#define advance_iterate_end						\
    }									\
  }									\
}

/* Advance requirements iterator. */
struct advance_req_iter;

size_t advance_req_iter_sizeof(void);
struct iterator *advance_req_iter_init(struct advance_req_iter *it,
                                       const struct advance *goal);

#define advance_req_iterate(_goal, _padvance)                               \
  generic_iterate(struct advance_req_iter, const struct advance *,          \
                  _padvance, advance_req_iter_sizeof, advance_req_iter_init,\
                  _goal)
#define advance_req_iterate_end generic_iterate_end

#ifdef __cplusplus
}
#endif /* __cplusplus */ENDREP
id: t.5ck.r25396/7832
type: file
pred: t.5ck.r25394/146724
count: 155
text: 25396 0 2035 33568 f2e59cd390e741c3ed7033cd6d446ecb
props: 11069 11747 112 0 0ba48eb7b1f123775dc0e292f9b3ab64
cpath: /trunk/common/tech.c
copyroot: 15280 /trunk

id: u.5ck.r25396/8070
type: file
pred: u.5ck.r25394/146102
count: 96
text: 25396 2065 5736 7921 5e73c930c21bda81fb3d43292085b0ca
props: 11069 12096 111 0 7f9b5cf6c8fffd7438ed66579e7ad166
cpath: /trunk/common/tech.h
copyroot: 15280 /trunk

PLAIN
K 11
Makefile.am
V 23
file 5h.5ck.r25189/4645
K 14
achievements.c
V 24
file qhc.5ck.r24894/2711
K 14
achievements.h
V 25
file qhe.5ck.r23319/42059
K 9
actions.c
V 25
file r7a.5ck.r25382/96129
K 9
actions.h
V 24
file r7c.5ck.r24644/3223
K 4
ai.c
V 25
file 4go.5ck.r22382/18940
K 4
ai.h
V 24
file 4gp.5ck.r25253/1855
K 6
aicore
V 24
dir 18t.5ck.r25280/10764
K 6
base.c
V 26
file 3jw.5ck.r25382/100525
K 6
base.h
V 25
file 3jx.5ck.r24158/73597
K 9
borders.c
V 22
file 4f0.5ck.r25016/63
K 9
borders.h
V 25
file 4f1.5ck.r18858/99721
K 10
calendar.c
V 26
file 147p.5ck.r25063/58554
K 10
calendar.h
V 26
file 147r.5ck.r25063/58902
K 8
capstr.c
V 22
file dv.5ck.r24976/289
K 8
capstr.h
V 24
file dw.5ck.r18858/97074
K 10
citizens.c
V 24
file 6mx.5ck.r20853/5961
K 10
citizens.h
V 24
file 6my.5ck.r20853/6145
K 6
city.c
V 23
file q.5ck.r25382/96753
K 6
city.h
V 24
file 3q.5ck.r25288/28215
K 13
clientutils.c
V 24
file zj9.5ck.r24459/7375
K 13
clientutils.h
V 24
file zjb.5ck.r24459/7536
K 8
combat.c
V 24
file wp.5ck.r25273/35375
K 8
combat.h
V 24
file wq.5ck.r24573/25814
K 12
connection.c
V 24
file un.5ck.r22421/11281
K 12
connection.h
V 24
file uo.5ck.r22458/34945
K 9
culture.c
V 26
file 104t.5ck.r24841/13166
K 9
culture.h
V 26
file 104v.5ck.r24841/13353
K 8
dataio.c
V 23
file 15r.5ck.r23908/582
K 8
dataio.h
V 25
file 15s.5ck.r23422/59337
K 11
diptreaty.c
V 22
file 3r.5ck.r24570/203
K 11
diptreaty.h
V 24
file 3s.5ck.r22430/33000
K 10
disaster.c
V 25
file b2m.5ck.r25382/98960
K 10
disaster.h
V 25
file b2o.5ck.r25037/17586
K 9
effects.c
V 25
file 2eo.5ck.r25382/99332
K 9
effects.h
V 25
file 2ep.5ck.r25382/99832
K 8
events.c
V 24
file 33h.5ck.r23572/7042
K 8
events.h
V 23
file 3t.5ck.r23572/7281
K 8
extras.c
V 25
file o9u.5ck.r25382/96566
K 8
extras.h
V 23
file o9w.5ck.r24840/728
K 12
fc_cmdhelp.c
V 24
file 76j.5ck.r20867/6570
K 12
fc_cmdhelp.h
V 23
file 76k.5ck.r23663/127
K 14
fc_interface.c
V 24
file 4up.5ck.r22631/8528
K 14
fc_interface.h
V 24
file 4uq.5ck.r23325/4181
K 10
fc_types.h
V 24
file 2ll.5ck.r25365/4546
K 15
featured_text.c
V 24
file 4h3.5ck.r24895/9815
K 15
featured_text.h
V 25
file 4h4.5ck.r24895/10009
K 6
game.c
V 24
file 3u.5ck.r25063/59062
K 6
game.h
V 24
file 3v.5ck.r25087/86845
K 19
generate_packets.py
V 24
file 2f4.5ck.r25010/6739
K 12
government.c
V 25
file he.5ck.r25382/101248
K 12
government.h
V 24
file hf.5ck.r25151/83855
K 6
idex.c
V 24
file qo.5ck.r25151/84101
K 6
idex.h
V 24
file qp.5ck.r18858/92434
K 13
improvement.c
V 24
file vb.5ck.r25382/96319
K 13
improvement.h
V 24
file vc.5ck.r25333/41500
K 5
map.c
V 24
file r.5ck.r25382/100769
K 5
map.h
V 23
file 41.5ck.r24785/5617
K 8
mapimg.c
V 25
file 6n9.5ck.r25063/58715
K 8
mapimg.h
V 24
file 6na.5ck.r22508/1884
K 15
metaknowledge.c
V 26
file siq.5ck.r25382/100078
K 15
metaknowledge.h
V 25
file sis.5ck.r24569/17110
K 10
movement.c
V 25
file 2xv.5ck.r25326/10969
K 10
movement.h
V 25
file 2xw.5ck.r25326/11217
K 18
name_translation.h
V 25
file 4k1.5ck.r25037/17771
K 8
nation.c
V 24
file il.5ck.r25338/19579
K 8
nation.h
V 24
file im.5ck.r25338/19823
K 9
packets.c
V 24
file 43.5ck.r23778/20942
K 11
packets.def
V 25
file 2f5.5ck.r25374/12280
K 9
packets.h
V 24
file 44.5ck.r24891/13981
K 8
player.c
V 22
file 45.5ck.r25332/256
K 8
player.h
V 22
file 46.5ck.r25376/191
K 14
requirements.c
V 25
file 2wq.5ck.r25382/99579
K 14
requirements.h
V 26
file 2wr.5ck.r25382/100273
K 10
research.c
V 26
file 4ro.5ck.r25394/146342
K 10
research.h
V 26
file 4rp.5ck.r25394/146534
K 10
rgbcolor.c
V 25
file 6i6.5ck.r21333/48710
K 10
rgbcolor.h
V 25
file 6i7.5ck.r21333/48896
K 6
road.c
V 26
file 6pq.5ck.r25382/101496
K 6
road.h
V 25
file 6pr.5ck.r24873/70179
K 10
scriptcore
V 24
dir 75a.5ck.r25382/98713
K 11
spaceship.c
V 24
file 98.5ck.r23422/59826
K 11
spaceship.h
V 24
file 99.5ck.r23422/60070
K 12
specialist.c
V 23
file 33f.5ck.r22372/258
K 12
specialist.h
V 25
file 33g.5ck.r23560/15220
K 7
style.c
V 25
file zzb.5ck.r25382/99147
K 7
style.h
V 24
file zzd.5ck.r24742/9559
K 6
team.c
V 26
file 33i.5ck.r19259/396899
K 6
team.h
V 25
file 33j.5ck.r18858/94759
K 6
tech.c
V 22
file t.5ck.r25396/7832
K 6
tech.h
V 22
file u.5ck.r25396/8070
K 9
terrain.c
V 24
file 2fp.5ck.r24785/6224
K 9
terrain.h
V 24
file qs.5ck.r24693/11029
K 6
tile.c
V 24
file 2ys.5ck.r24537/2234
K 6
tile.h
V 25
file 2yt.5ck.r25151/83618
K 13
traderoutes.c
V 25
file bf8.5ck.r24649/19011
K 13
traderoutes.h
V 25
file bfa.5ck.r24649/19203
K 8
traits.h
V 25
file 7k3.5ck.r24972/68348
K 6
unit.c
V 24
file v.5ck.r25382/101007
K 6
unit.h
V 23
file 48.5ck.r25047/7354
K 10
unitlist.c
V 24
file 39m.5ck.r23624/4825
K 10
unitlist.h
V 24
file 39n.5ck.r24112/3056
K 10
unittype.c
V 24
file v9.5ck.r25334/99800
K 10
unittype.h
V 24
file va.5ck.r25327/35030
K 9
version.c
V 23
file oe.5ck.r24297/6701
K 9
version.h
V 23
file e7.5ck.r24297/6940
K 9
victory.c
V 24
file qex.5ck.r23119/2099
K 9
victory.h
V 24
file qez.5ck.r23119/2255
K 8
vision.c
V 26
file 4dm.5ck.r19259/404222
K 8
vision.h
V 24
file 4dn.5ck.r24742/9986
K 12
workertask.c
V 24
file llw.5ck.r22482/3617
K 12
workertask.h
V 25
file lly.5ck.r23027/52794
K 10
worklist.c
V 25
file o8.5ck.r19259/402799
K 10
worklist.h
V 24
file o9.5ck.r18858/98299
END
ENDREP
id: p.5ck.r25396/13488
type: dir
pred: p.5ck.r25394/152151
count: 3826
text: 25396 8309 5166 5166 c8585eb6b377b6bf94063b06f034f529
props: 23743 0 112 0 b2bc91bf125d83375389d51f25ff2c2f
cpath: /trunk/common
copyroot: 15280 /trunk

PLAIN
K 9
ABOUT-NLS
V 24
file fu.5ck.r23462/85000
K 7
AUTHORS
V 24
file 5u.5ck.r22143/14016
K 7
COPYING
V 19
file 1h.0.r9643/400
K 9
ChangeLog
V 26
file 6l.5ck.r22811/6091752
K 7
INSTALL
V 22
file 6.5ck.r24055/8187
K 11
Makefile.am
V 22
file 59.5ck.r25275/240
K 4
NEWS
V 24
file 6m.5ck.r23374/75525
K 6
README
V 20
file 7.0.r4421/96382
K 2
ai
V 23
dir 8.5ck.r25394/155973
K 10
autogen.sh
V 23
file 12o.5ck.r24091/228
K 9
bootstrap
V 24
dir 2p5.5ck.r25335/14222
K 6
client
V 22
dir d.5ck.r25395/10161
K 6
common
V 22
dir p.5ck.r25396/13488
K 12
configure.ac
V 24
file 149.5ck.r25389/3332
K 4
data
V 21
dir w.5ck.r25391/4965
K 12
dependencies
V 23
dir 2yu.5ck.r25384/8146
K 11
diff_ignore
V 23
file qq.5ck.r24665/2850
K 3
doc
V 22
dir k7.5ck.r25386/2744
K 10
fc_version
V 25
file 2lo.5en.r25374/18425
K 2
m4
V 23
dir 12p.5ck.r25389/3107
K 7
scripts
V 22
dir 2yo.5ck.r24495/862
K 6
server
V 21
dir z.5ck.r25395/5306
K 5
tests
V 22
dir 2g9.5ck.r25379/673
K 5
tools
V 25
dir 4pj.5js.r25394/102580
K 12
translations
V 25
dir t0a.5ck.r25381/763639
K 7
utility
V 22
dir 1c.5ck.r25361/3754
K 3
vms
V 25
dir u9.5ck.r21528/1396085
K 5
win32
V 23
dir 2eu.5ck.r25017/1947
END
ENDREP
id: 3.5ck.r25396/14888
type: dir
pred: 3.5ck.r25395/11564
count: 17675
text: 25396 13718 1157 1157 e52d60c39ca3d8a3cb93824016ca7ecf
props: 23244 4830 282 0 e4bb46e81629a60eef613b169b23a9ea
cpath: /trunk
copyroot: 15280 /trunk

PLAIN
K 8
branches
V 19
dir 1.0.r25392/6784
K 4
tags
V 19
dir 2.0.r24394/6245
K 5
trunk
V 22
dir 3.5ck.r25396/14888
K 7
website
V 21
dir 3ge.0.r22980/2263
END
ENDREP
id: 0.0.r25396/15281
type: dir
pred: 0.0.r25395/11958
count: 25396
text: 25396 15115 153 153 3ca93745e904aa488740afef32d64b52
cpath: /
copyroot: 0 /

t.5ck.t25395-1 modify true false /trunk/common/tech.c

u.5ck.t25395-1 modify true false /trunk/common/tech.h


15281 15431
