completely changed event_queue logic
[h2d.git] / path.c
blobd8dbb21737151e50c1f0580815e5ee9cb82a33c5
3 void push(mcrd tile, mcrd parent, int newcost) {
4 mp(tile)->cost = newcost;
5 mp(tile)->parent = parent;
7 mnode * new = malloc(sizeof(mnode));
8 new->crd = tile;
9 l_push(cw->st, new);
14 mcrd pop(){
15 mnode * tmp = (mnode*)l_pop(cw->st);
16 mcrd crd = tmp->crd;
17 free(tmp);
18 return(crd);
24 // returns corrected newcost
25 // сделать так, что б ход заканчивался на этой клетке
26 // т.е. дополнить стоимость до ближайшего кратного
27 // в этом случае он и так закончится тут
28 int zoc(mcrd a, unit * u, int cost){
29 if(find_feature(u, FEATURE_IGNR))
30 return(cost);
32 int mvp = u->type->mvp;
33 for(int i=0; i<6; i++){
34 mcrd n = neib(a, i);
35 unit * u2 = mp(n)->unit;
36 if(inboard(n) && cost%mvp!=0
37 && u2 && u2->player!=u->player
38 && mp(n)->fog>0 && !is_invis(u2) )
39 return(cost + mvp - (cost % mvp));
41 return(cost);
46 // process neiborhood
47 void process_nbh (unit * u, mcrd t, mcrd nb){
48 if( ! inboard(nb) )
49 return;
51 // что бы не проходить через видимых врагов
52 unit * u2 = mp(nb)->unit;
53 if(u2 // && u2->player!=u->player
54 && mp(nb)->fog>0
55 && !is_invis(u2) )
56 return;
58 int n = u->type->ter_mvp[mp(nb)->type];
59 int newcost = zoc(nb, u, mp(t)->cost + n);
61 if(mp(nb)->cost>newcost && newcost<=u->type->mvp)
62 push(nb, t, newcost);
67 void fill_map(unit * u) {
68 FOR_EACH_TILE{
69 mp(mc)->cost = 30000;
70 mp(mc)->parent = nmcrd;
72 push(u->mcrd, u->mcrd, 0); // push start point
73 while(cw->st->count>0){
74 mcrd t = pop();
75 for(int i=0; i<6; i++)
76 process_nbh(u, t, neib(t, i));
82 void clear_path(){
83 while(cw->path->count)
84 free(l_pop(cw->path));
88 void addwaypoint(mcrd wp){
89 mnode * new = malloc(sizeof(mnode));
90 new->crd = wp;
91 l_push(cw->path, new);
96 void get_path(mcrd a){
97 clear_path();
98 while(mp(a)->cost!=0){
99 addwaypoint(a);
100 a = mp(a)->parent;
102 // добавляем отправную точку(где стоит юнит)
103 addwaypoint(a);