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