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