]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/sortlist.qc
#include this
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / sortlist.qc
1 #if defined(CSQC)
2         #include "../dpdefs/csprogsdefs.qc"
3 #elif defined(MENUQC)
4 #elif defined(SVQC)
5 #endif
6
7 //.float(entity,entity) sort_cmp;
8 .entity sort_next, sort_prev;
9
10 entity Sort_Spawn()
11 {
12         entity sort;
13         sort = spawn();
14         sort.sort_next = world;
15         sort.chain = sort;
16         return sort;
17 }
18 /*
19 entity Sort_New(float(entity,entity) cmp)
20 {
21         entity sort;
22         sort = spawn();
23         sort.sort_cmp = cmp;
24         sort.sort_next = world;
25         sort.chain = sort;
26         return sort;
27 }
28
29 void Sort_Remove(entity sort)
30 {
31         entity next;
32         while(sort.sort_next)
33         {
34                 next = sort.sort_next;
35                 remove(sort);
36                 sort = next;
37         }
38         remove(sort);
39 }
40
41 void Sort_Add(entity sort, entity ent)
42 {
43         entity next, parent;
44         parent = sort;
45         next = sort.sort_next;
46         while(next)
47         {
48                 if(!sort.sort_cmp(next, ent))
49                         break;
50                 parent = next;
51                 next = next.sort_next;
52         }
53         ent.sort_next = next;
54         ent.sort_prev = parent;
55         parent.sort_next = ent;
56         if(next)
57                 next.sort_prev = ent;
58 }
59
60 void Sort_Reset(entity sort)
61 {
62         sort.chain = sort;
63 }
64
65 float Sort_HasNext(entity sort)
66 {
67         return (sort.chain.sort_next != world);
68 }
69
70 entity Sort_Next(entity sort)
71 {
72         entity next;
73         next = sort.chain.sort_next;
74         if(!next) {
75                 next = spawn();
76                 sort.chain.sort_next = next;
77                 next.sort_prev = sort.chain;
78                 next.sort_next = world;
79         }
80         sort.chain = next;
81         return next;
82 }
83
84 void Sort_Finish(entity sort)
85 {
86         entity next;
87         next = sort.chain;
88         if(!next)
89                 return;
90
91         while(next.sort_next)
92         {
93                 sort = next.sort_next;
94                 next.sort_next = sort.sort_next;
95                 remove(sort);
96         }
97 }
98
99 entity Sort_Get(entity sort, float i)
100 {
101         for(0; sort.sort_next && i > 0; --i)
102                 sort = sort.sort_next;
103         return sort;
104 }
105 */
106
107 /**
108  * Swap two neighbours in a sortlist.
109  * @param a FIRST entity
110  * @param b entity after a
111  */
112 #define SORT_SWAP(a,b)                                                                  \
113         b.sort_prev = a.sort_prev;                                                      \
114         a.sort_next = b.sort_next;                                                      \
115         if(b.sort_next) b.sort_next.sort_prev = a;                      \
116         if(a.sort_prev) a.sort_prev.sort_next = b;                      \
117         a.sort_prev = b;                                                                        \
118         b.sort_next = a
119
120 /*
121 void Sort_Erase(entity ent)
122 {
123         ent.sort_prev.sort_next = ent.sort_next;
124         if(ent.sort_next)
125                 ent.sort_next.sort_prev = ent.sort_prev;
126         remove(ent);
127 }
128
129 void Sort_RemoveOld(entity sort)
130 {
131         entity tmp;
132         for(tmp = sort.sort_next; tmp; tmp = tmp.sort_next)
133         {
134                 if(tmp.frame < time)
135                 {
136                         tmp = tmp.sort_prev;
137                         Sort_Erase(tmp.sort_next);
138                 }
139         }
140 }
141 */