]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/playermodel.qc
Merge branch 'terencehill/menu_remove_tab_title' of git://de.git.xonotic.org/xonotic...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / playermodel.qc
1 #ifndef PLAYERMODEL_H
2 #define PLAYERMODEL_H
3 #include "image.qc"
4 CLASS(XonoticPlayerModelSelector, XonoticImage)
5         METHOD(XonoticPlayerModelSelector, configureXonoticPlayerModelSelector, void(entity))
6         METHOD(XonoticPlayerModelSelector, loadCvars, void(entity))
7         METHOD(XonoticPlayerModelSelector, saveCvars, void(entity))
8         METHOD(XonoticPlayerModelSelector, draw, void(entity))
9         METHOD(XonoticPlayerModelSelector, resizeNotify, void(entity, vector, vector, vector, vector))
10         METHOD(XonoticPlayerModelSelector, showNotify, void(entity))
11         ATTRIB(XonoticPlayerModelSelector, currentModel, string, string_null)
12         ATTRIB(XonoticPlayerModelSelector, currentSkin, float, 0)
13         ATTRIB(XonoticPlayerModelSelector, currentModelImage, string, string_null)
14         ATTRIB(XonoticPlayerModelSelector, currentModelTitle, string, string_null)
15         ATTRIB(XonoticPlayerModelSelector, currentModelDescription, string, string_null)
16         METHOD(XonoticPlayerModelSelector, go, void(entity, float))
17         METHOD(XonoticPlayerModelSelector, destroy, void(entity))
18         ATTRIB(XonoticPlayerModelSelector, origin, vector, '0 0 0')
19         ATTRIB(XonoticPlayerModelSelector, size, vector, '0 0 0')
20         ATTRIB(XonoticPlayerModelSelector, realFontSize, vector, '0 0 0')
21         ATTRIB(XonoticPlayerModelSelector, fontSize, float, SKINFONTSIZE_NORMAL)
22         ATTRIB(XonoticPlayerModelSelector, titleFontSize, float, SKINFONTSIZE_TITLE)
23         ATTRIB(XonoticPlayerModelSelector, bufModels, float, -1)
24         ATTRIB(XonoticPlayerModelSelector, numModels, float, -1)
25         ATTRIB(XonoticPlayerModelSelector, idxModels, float, -1)
26 ENDCLASS(XonoticPlayerModelSelector)
27 entity makeXonoticPlayerModelSelector();
28 void PlayerModelSelector_Next_Click(entity btn, entity me);
29 void PlayerModelSelector_Prev_Click(entity btn, entity me);
30 #endif
31
32 #ifdef IMPLEMENTATION
33 entity makeXonoticPlayerModelSelector()
34 {
35         entity me;
36         me = NEW(XonoticPlayerModelSelector);
37         me.configureXonoticPlayerModelSelector(me);
38         return me;
39 }
40
41 const float BUFMODELS_TITLE = 0;
42 const float BUFMODELS_IMAGE = 1;
43 const float BUFMODELS_MODEL = 2;
44 const float BUFMODELS_SKIN = 3;
45 const float BUFMODELS_DESC = 4;
46 const float BUFMODELS_COUNT = 5;
47
48 #define XONVOTE186 1 // (nyov) removal of model text description
49
50 void XonoticPlayerModelSelector_configureXonoticPlayerModelSelector(entity me)
51 {
52         float sortbuf, glob, i;
53         string fn;
54
55         glob = search_begin(language_filename(get_model_datafilename(string_null, -1, "txt")), true, true);
56         if (glob < 0)
57                 return;
58
59         me.configureXonoticImage(me, string_null, -1);
60
61         sortbuf = buf_create();
62         for(i = 0; i < search_getsize(glob); ++i)
63         {
64                 // select model #i!
65                 fn = search_getfilename(glob, i);
66                 if(!get_model_parameters(fn, -1))
67                         continue;
68                 bufstr_add(sortbuf, sprintf("%-128s%s", get_model_parameters_name, fn), 1);
69         }
70         search_end(glob);
71         buf_sort(sortbuf, 128, 0);
72         me.numModels = buf_getsize(sortbuf);
73         me.bufModels = buf_create();
74         for(i = 0; i < me.numModels; ++i)
75         {
76                 fn = substring(bufstr_get(sortbuf, i), 128, -1);
77                 if(!get_model_parameters(fn, -1))
78                         error("But it JUST worked!");
79                 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_TITLE, get_model_parameters_name);
80                 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_IMAGE, strcat("/", substring(get_model_datafilename(get_model_parameters_modelname, get_model_parameters_modelskin, "tga"), 0, -5)));
81                 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL, get_model_parameters_modelname);
82                 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN, ftos(get_model_parameters_modelskin));
83                 get_model_parameters_desc = strcat(get_model_parameters_desc, "\n");
84 #if XONVOTE186
85                 if(get_model_parameters_sex)
86                         get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\n%s", get_model_parameters_sex));
87 #else
88                 if(get_model_parameters_description)
89                         get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\n%s\n", get_model_parameters_description));
90                 if(get_model_parameters_sex)
91                         get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nSex: %s", get_model_parameters_sex));
92                 if(get_model_parameters_weight)
93                         get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nWeight: %g kg", get_model_parameters_weight));
94                 if(get_model_parameters_age)
95                         get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nAge: %g", get_model_parameters_age));
96 #endif
97                 while(substring(get_model_parameters_desc, -1, 1) == "\n")
98                         get_model_parameters_desc = substring(get_model_parameters_desc, 0, -2);
99                 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_DESC, get_model_parameters_desc);
100         }
101         buf_del(sortbuf);
102         get_model_parameters(string_null, 0);
103         me.loadCvars(me); // this will select the initial model, depending on the current cvars
104         me.go(me, 0); // this will set the vars for the selected model
105 }
106 void XonoticPlayerModelSelector_destroy(entity me)
107 {
108         buf_del(me.bufModels);
109         me.bufModels = -1;
110 }
111
112 void XonoticPlayerModelSelector_loadCvars(entity me)
113 {
114         string skin, modelname;
115         float i;
116
117         skin = cvar_string("_cl_playerskin");
118         modelname = cvar_string("_cl_playermodel");
119
120         for(i = 0; i < me.numModels; ++i)
121         {
122                 if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL) == modelname)
123                 if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN) == skin)
124                         break;
125         }
126         if(i >= me.numModels) // fail
127                 i = 0;
128         me.idxModels = i;
129 }
130
131 void XonoticPlayerModelSelector_go(entity me, float d)
132 {
133         me.idxModels = mod(me.idxModels + d + me.numModels, me.numModels);
134
135         if(me.currentModel)
136                 strunzone(me.currentModel);
137         if(me.currentModelTitle)
138                 strunzone(me.currentModelTitle);
139         if(me.currentModelImage)
140                 strunzone(me.currentModelImage);
141         if(me.currentModelDescription)
142                 strunzone(me.currentModelDescription);
143
144         // select model #i!
145         me.currentModelTitle = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_TITLE));
146         me.currentModelImage = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_IMAGE));
147         me.currentSkin = stof(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_SKIN));
148         me.currentModel = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_MODEL));
149         me.currentModelDescription = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_DESC));
150
151         // fix the image
152         if(draw_PictureSize(me.currentModelImage) == '0 0 0')
153                 me.src = "nopreview_player";
154         else
155                 me.src = me.currentModelImage;
156         me.updateAspect(me);
157 }
158
159 void PlayerModelSelector_Next_Click(entity btn, entity me)
160 {
161         if (me.numModels <= 0)
162                 return;
163         me.go(me, +1);
164         me.saveCvars(me);
165 }
166
167 void PlayerModelSelector_Prev_Click(entity btn, entity me)
168 {
169         if (me.numModels <= 0)
170                 return;
171         me.go(me, -1);
172         me.saveCvars(me);
173 }
174
175 void XonoticPlayerModelSelector_saveCvars(entity me)
176 {
177         // we can't immediately apply here because of flood control
178         cvar_set("_cl_playermodel", me.currentModel);
179         cvar_set("_cl_playerskin", ftos(me.currentSkin));
180 }
181
182 void XonoticPlayerModelSelector_draw(entity me)
183 {
184         float i, n;
185         vector o;
186
187         if (me.numModels <= 0)
188         {
189                 draw_CenterText('0.5 0.5 0', _("<no model found>"), me.realFontSize, SKINCOLOR_TEXT, 0.6, false);
190                 return;
191         }
192
193         SUPER(XonoticPlayerModelSelector).draw(me);
194         // draw text on the image, handle \n in the description
195
196         draw_beginBoldFont();
197
198 #if XONVOTE186 // (nyov) lower name display looks better when there is no description text
199         draw_CenterText('0.5 0.8 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), SKINCOLOR_MODELTITLE, SKINALPHA_MODELTITLE, false);
200 #else
201         draw_CenterText('0.5 0 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), SKINCOLOR_MODELTITLE, SKINALPHA_MODELTITLE, false);
202 #endif
203
204         draw_endBoldFont();
205
206         o = '0.5 1 0' - eY * me.realFontSize.y * ((n = tokenizebyseparator(me.currentModelDescription, "\n")) + 0.5);
207         for(i = 0; i < n; ++i)
208         {
209                 draw_CenterText(o, argv(i), me.realFontSize, SKINCOLOR_TEXT, 1, false);
210                 o += eY * me.realFontSize.y;
211         }
212 }
213
214 void XonoticPlayerModelSelector_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
215 {
216         SUPER(XonoticPlayerModelSelector).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
217         me.realFontSize_y = me.fontSize / absSize.y;
218         me.realFontSize_x = me.fontSize / absSize.x;
219 }
220
221 void XonoticPlayerModelSelector_showNotify(entity me)
222 {
223         me.configureXonoticPlayerModelSelector(me);
224 }
225 #endif