ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/material.C
(Generate patch)

Comparing deliantra/server/common/material.C (file contents):
Revision 1.13 by root, Wed Apr 28 19:49:50 2010 UTC vs.
Revision 1.21 by root, Sat Nov 17 23:40:00 2018 UTC

1/* 1/*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team
4 * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 5 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002 Mark Wedel & Crossfire Development Team 6 * Copyright (©) 2002 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992 Frank Tore Johansen 7 * Copyright (©) 1992 Frank Tore Johansen
7 * 8 *
8 * Deliantra is free software: you can redistribute it and/or modify it under 9 * Deliantra is free software: you can redistribute it and/or modify it under
9 * the terms of the Affero GNU General Public License as published by the 10 * the terms of the Affero GNU General Public License as published by the
10 * Free Software Foundation, either version 3 of the License, or (at your 11 * Free Software Foundation, either version 3 of the License, or (at your
11 * option) any later version. 12 * option) any later version.
12 * 13 *
13 * This program is distributed in the hope that it will be useful, 14 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details. 17 * GNU General Public License for more details.
17 * 18 *
18 * You should have received a copy of the Affero GNU General Public License 19 * You should have received a copy of the Affero GNU General Public License
19 * and the GNU General Public License along with this program. If not, see 20 * and the GNU General Public License along with this program. If not, see
20 * <http://www.gnu.org/licenses/>. 21 * <http://www.gnu.org/licenses/>.
21 * 22 *
22 * The authors can be reached via e-mail to <support@deliantra.net> 23 * The authors can be reached via e-mail to <support@deliantra.net>
23 */ 24 */
24 25
25#include <global.h> 26#include <global.h>
26#include <material.h> 27#include <material.h>
52}; 53};
53*/ 54*/
54 55
55materialtype_t::materialtype_t () 56materialtype_t::materialtype_t ()
56{ 57{
57 next = 0; 58 next = 0;
59 reset ();
60}
61
62void
63materialtype_t::reset ()
64{
58 name = shstr_unknown; 65 name = shstr_unknown;
59 description = shstr_unknown_material_description; 66 description = shstr_unknown_material_description;
60 material = 0; 67 material = 0;
61 68
62 for (int i = 0; i < NROFATTACKS; i++) 69 for (int i = 0; i < NROFATTACKS; i++)
75 weight = 100; 82 weight = 100;
76 value = 100; 83 value = 100;
77 density = 1000; 84 density = 1000;
78} 85}
79 86
87// create a new material of the given name
88static materialtype_t *
89dummy_material (shstr_tmp name)
90{
91 materialtype_t *mt = new materialtype_t;
92 mt->name = name;
93
94 // make it susceptible to attacks
95 for (int i = 0; i < NROFATTACKS; i++)
96 {
97 mt->save [i] = 10;
98 mt->mod [i] = 9;
99 }
100
101 mt->next = materialt; materialt = mt;
102
103 return mt;
104}
105
106static materialtype_t *
107find (const shstr_tmp name)
108{
109 for (materialtype_t *mt = materialt; mt; mt = mt->next)
110 if (name == mt->name)
111 return mt;
112
113 return 0;
114}
115
80/* convert materialname to materialtype_t */ 116/* convert materialname to materialtype_t */
81materialtype_t * 117materialtype_t *
82name_to_material (const shstr_tmp name) 118name_to_material (const shstr_tmp name)
83{ 119{
84 for (materialtype_t *mt = materialt; mt; mt = mt->next) 120 materialtype_t *mt = find (name);
85 if (name == mt->name)
86 return mt;
87 121
122 if (!mt)
123 {
88 LOG (llevError, "name_to_material called with nonexistent material '%s'\n", &name); 124 LOG (llevError, "name_to_material called with nonexistent material '%s'\n", &name);
89 125 mt = dummy_material (name);
90 // create a new material of the given name
91 materialtype_t *mt = new materialtype_t;
92 mt->name = name;
93
94 // make it susceptible to attacks
95 for (int i = 0; i < NROFATTACKS; i++)
96 { 126 }
97 mt->save [i] = 10;
98 mt->mod [i] = 9;
99 }
100
101 mt->next = materialt; materialt = mt;
102 127
103 return mt; 128 return mt;
129}
130
131void
132object_thawer::get (materialtype_t *&mt) const
133{
134 shstr name;
135 get (name);
136
137 mt = find (name);
138
139 if (!mt)
140 {
141 parse_error (format ("material called %s requested, but not found, creating dummy material.\n", &name));
142 mt = dummy_material (name);
143 }
104} 144}
105 145
106/* when doing transmutation of objects, we have to recheck the resistances, 146/* when doing transmutation of objects, we have to recheck the resistances,
107 * as some that did not apply previously, may apply now. 147 * as some that did not apply previously, may apply now.
108 */ 148 */
190} 230}
191 231
192//-GPL 232//-GPL
193 233
194void 234void
195load_materials () 235_reload_materials ()
196{ 236{
197 //TODO: somehow free old materials, or update them in-place
198 // currently we effectively leak them.
199 material_null.next = 0; materialt = &material_null;
200
201 object_thawer thawer (settings.datadir, "materials"); 237 object_thawer thawer (settings.datadir, "materials");
202 238
203 if (!thawer) 239 if (!thawer)
204 { 240 {
205 LOG (llevError, "Cannot open %s for reading\n", thawer.name); 241 LOG (llevError, "unable to load %s for reading\n", thawer.name);
206 goto done; 242 return;
207 } 243 }
208 244
209 while (thawer.kw != KW_name) 245 while (thawer.kw != KW_name)
210 { 246 {
211 thawer.next (); 247 thawer.next ();
212 248
213 if (thawer.kw == KW_EOF) 249 if (thawer.kw == KW_EOF)
214 goto done; 250 return;
215 } 251 }
216 252
217 materialtype_t *mt; 253 materialtype_t *mt;
218 254
219 for (;;) 255 for (;;)
220 { 256 {
221 switch (thawer.kw) 257 switch (thawer.kw)
222 { 258 {
223 case KW_name: 259 case KW_name:
260 coroapi::cede_to_tick ();
261
262 {
263 // create a new dummy material, or find the existing material
264 shstr name;
265 thawer.get (name);
266
267 mt = find (name);
268
269 if (mt)
270 mt->reset ();
271 else
272 {
224 mt = new materialtype_t; 273 mt = new materialtype_t;
225 thawer.get (mt->name);
226 mt->description = mt->name;
227
228 mt->next = materialt; materialt = mt; 274 mt->next = materialt; materialt = mt;
275 }
276
277 mt->name = name;
278 mt->description = name;
279 }
229 break; 280 break;
230 281
231 case KW_description: 282 case KW_description:
232 thawer.get (mt->description); 283 thawer.get (mt->description);
233 break; 284 break;
290 case KW_weight: thawer.get (mt->weight); break; 341 case KW_weight: thawer.get (mt->weight); break;
291 case KW_value: thawer.get (mt->value); break; 342 case KW_value: thawer.get (mt->value); break;
292 case KW_density: thawer.get (mt->density); break; 343 case KW_density: thawer.get (mt->density); break;
293 344
294 case KW_EOF: 345 case KW_EOF:
295 goto done; 346 return;
296 347
297 default: 348 default:
298 if (!thawer.parse_error ("materials file")) 349 if (!thawer.parse_error ("materials file"))
299 goto done; 350 return;
300 break; 351 break;
301 } 352 }
302 353
303 thawer.next (); 354 thawer.next ();
304 } 355 }
305
306done:
307 LOG (llevDebug, "Done.\n");
308} 356}
309 357

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines