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