]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu/nexuiz/playermodel.c
-scmenu; make mapinfo default
[divverent/nexuiz.git] / data / qcsrc / menu / nexuiz / playermodel.c
1 #ifdef INTERFACE
2 CLASS(NexuizPlayerModelSelector) EXTENDS(NexuizImage)
3         METHOD(NexuizPlayerModelSelector, configureNexuizPlayerModelSelector, void(entity))
4         METHOD(NexuizPlayerModelSelector, loadCvars, void(entity))
5         METHOD(NexuizPlayerModelSelector, saveCvars, void(entity))
6         METHOD(NexuizPlayerModelSelector, draw, void(entity))
7         METHOD(NexuizPlayerModelSelector, resizeNotify, void(entity, vector, vector, vector, vector))
8         ATTRIB(NexuizPlayerModelSelector, currentModel, string, string_null)
9         ATTRIB(NexuizPlayerModelSelector, currentSkin, float, 0)
10         ATTRIB(NexuizPlayerModelSelector, currentModelName, string, string_null)
11         ATTRIB(NexuizPlayerModelSelector, currentModelTitle, string, string_null)
12         ATTRIB(NexuizPlayerModelSelector, currentModelTxtName, string, string_null)
13         ATTRIB(NexuizPlayerModelSelector, currentModelDescription, string, string_null)
14         ATTRIB(NexuizPlayerModelSelector, cvarName, string, "_cl_playermodel")
15         METHOD(NexuizPlayerModelSelector, go, void(entity, float))
16         ATTRIB(NexuizPlayerModelSelector, origin, vector, '0 0 0')
17         ATTRIB(NexuizPlayerModelSelector, size, vector, '0 0 0')
18         ATTRIB(NexuizPlayerModelSelector, realFontSize, vector, '0 0 0')
19         ATTRIB(NexuizPlayerModelSelector, fontSize, float, SKINFONTSIZE_NORMAL)
20         ATTRIB(NexuizPlayerModelSelector, titleFontSize, float, SKINFONTSIZE_TITLE)
21 ENDCLASS(NexuizPlayerModelSelector)
22 entity makeNexuizPlayerModelSelector();
23 void PlayerModelSelector_Next_Click(entity btn, entity me);
24 void PlayerModelSelector_Prev_Click(entity btn, entity me);
25 #endif
26
27 #ifdef IMPLEMENTATION
28 entity makeNexuizPlayerModelSelector()
29 {
30         entity me;
31         me = spawnNexuizPlayerModelSelector();
32         me.configureNexuizPlayerModelSelector(me);
33         return me;
34 }
35
36 void configureNexuizPlayerModelSelectorNexuizPlayerModelSelector(entity me)
37 {
38         me.configureNexuizImage(me, string_null, 263.0/360.0);
39         me.loadCvars(me);
40 }
41
42 void loadCvarsNexuizPlayerModelSelector(entity me)
43 {
44         float glob, i, fh;
45         string fn;
46         string nm, t, l;
47
48         if(me.currentModel)
49                 strunzone(me.currentModel);
50         if(me.currentModelTitle)
51                 strunzone(me.currentModelTitle);
52         if(me.currentModelName)
53                 strunzone(me.currentModelName);
54         if(me.currentModelTxtName)
55                 strunzone(me.currentModelTxtName);
56         if(me.currentModelDescription)
57                 strunzone(me.currentModelDescription);
58         me.currentSkin = cvar("_cl_playerskin");
59         me.currentModel = strzone(cvar_string("_cl_playermodel"));
60         me.currentModelName = string_null;
61         me.currentModelDescription = string_null;
62         me.currentModelTitle = string_null;
63         me.currentModelTxtName = string_null;
64
65         // lookup model name
66         glob = search_begin("models/player/*.txt", TRUE, TRUE);
67         if(glob < 0)
68                 return;
69         for(i = 0; i < search_getsize(glob); ++i)
70         {
71                 fn = search_getfilename(glob, i);
72                 fh = fopen(fn, FILE_READ);
73                 if(fh < 0)
74                         continue;
75                 t = fgets(fh);
76                 nm = fgets(fh);
77                 if(stof(fgets(fh)) == me.currentSkin)
78                 if(fgets(fh) == me.currentModel)
79                 {
80                         me.currentModelName = strzone(strcat("/", nm));
81                         me.currentModelTxtName = strzone(fn);
82                         me.currentModelTitle = strzone(t);
83                         me.currentModelDescription = "";
84                         while((l = fgets(fh)))
85                         {
86                                 if(me.currentModelDescription != "")
87                                         me.currentModelDescription = strcat(me.currentModelDescription, "\n");
88                                 me.currentModelDescription = strcat(me.currentModelDescription, l);
89                         }
90                         me.currentModelDescription = strzone(me.currentModelDescription);
91                         fclose(fh);
92                         break;
93                 }
94                 fclose(fh);
95         }
96         search_end(glob);
97 }
98
99 void goNexuizPlayerModelSelector(entity me, float d)
100 {
101         float glob, i, fh;
102         string l;
103
104         glob = search_begin("models/player/*.txt", TRUE, TRUE);
105         if(glob < 0)
106                 return;
107         for(i = 0; i < search_getsize(glob); ++i)
108                 if(search_getfilename(glob, i) == me.currentModelTxtName)
109                         break;
110         // now i is search_getsize(glob) if not found, and the right index if found.
111         if(i == search_getsize(glob))
112         {
113                 if(d < 0)
114                         i = search_getsize(glob) - 1;
115                 else
116                         i = 0;
117         }
118         else
119         {
120                 i = mod(i + d + search_getsize(glob), search_getsize(glob));
121         }
122
123         if(me.currentModel)
124                 strunzone(me.currentModel);
125         if(me.currentModelTitle)
126                 strunzone(me.currentModelTitle);
127         if(me.currentModelName)
128                 strunzone(me.currentModelName);
129         if(me.currentModelTxtName)
130                 strunzone(me.currentModelTxtName);
131         if(me.currentModelDescription)
132                 strunzone(me.currentModelDescription);
133
134         // select model #i!
135         me.currentModelTxtName = strzone(search_getfilename(glob, i));
136         fh = fopen(me.currentModelTxtName, FILE_READ);
137         search_end(glob);
138         if(fh < 0)
139                 return;
140         me.currentModelTitle = strzone(fgets(fh));
141         me.currentModelName = strzone(strcat("/", fgets(fh)));
142         me.currentSkin = stof(fgets(fh));
143         me.currentModel = strzone(fgets(fh));
144         me.currentModelDescription = "";
145         while((l = fgets(fh)))
146         {
147                 if(me.currentModelDescription != "")
148                         me.currentModelDescription = strcat(me.currentModelDescription, "\n");
149                 me.currentModelDescription = strcat(me.currentModelDescription, l);
150         }
151         me.currentModelDescription = strzone(me.currentModelDescription);
152         fclose(fh);
153 }
154
155 void PlayerModelSelector_Next_Click(entity btn, entity me)
156 {
157         me.go(me, +1);
158         me.saveCvars(me);
159 }
160
161 void PlayerModelSelector_Prev_Click(entity btn, entity me)
162 {
163         me.go(me, -1);
164         me.saveCvars(me);
165 }
166
167 void saveCvarsNexuizPlayerModelSelector(entity me)
168 {
169         // TODO rather set the _cl ones and apply later?
170         localcmd(strcat("playermodel ", me.currentModel, "\nplayerskin ", ftos(me.currentSkin), "\n"));
171 }
172
173 void drawNexuizPlayerModelSelector(entity me)
174 {
175         float i, n;
176         vector o;
177
178         me.src = me.currentModelName;
179         drawImage(me);
180         me.src = string_null;
181
182         // draw text on the image, handle \n in the description
183         draw_CenterText('0.5 0 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), '1 1 1', 1, FALSE);
184
185         o = '0.5 1 0' - eY * me.realFontSize_y * ((n = tokenizebyseparator(me.currentModelDescription, "\n")) + 0.5);
186         for(i = 0; i < n; ++i)
187         {
188                 draw_CenterText(o, argv(i), me.realFontSize, '1 1 1', 1, FALSE);
189                 o += eY * me.realFontSize_y;
190         }
191 }
192
193 void resizeNotifyNexuizPlayerModelSelector(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
194 {
195         resizeNotifyImage(me, relOrigin, relSize, absOrigin, absSize);
196         me.origin = absOrigin;
197         me.size = absSize;
198         me.realFontSize_y = me.fontSize / absSize_y;
199         me.realFontSize_x = me.fontSize / absSize_x;
200 }
201 #endif