--- deliantra/server/common/material.C 2010/04/29 12:24:04 1.14 +++ deliantra/server/common/material.C 2010/05/06 22:35:41 1.15 @@ -54,7 +54,13 @@ materialtype_t::materialtype_t () { - next = 0; + next = 0; + reset (); +} + +void +materialtype_t::reset () +{ name = shstr_unknown; description = shstr_unknown_material_description; material = 0; @@ -96,35 +102,44 @@ return mt; } -/* convert materialname to materialtype_t */ -materialtype_t * -name_to_material (const shstr_tmp name) +static materialtype_t * +find (const shstr_tmp name) { for (materialtype_t *mt = materialt; mt; mt = mt->next) if (name == mt->name) return mt; - LOG (llevError, "name_to_material called with nonexistent material '%s'\n", &name); + return 0; +} + +/* convert materialname to materialtype_t */ +materialtype_t * +name_to_material (const shstr_tmp name) +{ + materialtype_t *mt = find (name); + + if (!mt) + { + LOG (llevError, "name_to_material called with nonexistent material '%s'\n", &name); + mt = dummy_material (name); + } - return dummy_material (name); + return mt; } void -object_thawer::get (materialtype_t *&m) const +object_thawer::get (materialtype_t *&mt) const { shstr name; get (name); - for (materialtype_t *mt = materialt; mt; mt = mt->next) - if (name == mt->name) - { - m = mt; - return; - } - - parse_error (format ("material called %s requested, but not found, creating dummy material.\n", &name)); + mt = find (name); - m = dummy_material (name); + if (!mt) + { + parse_error (format ("material called %s requested, but not found, creating dummy material.\n", &name)); + mt = dummy_material (name); + } } /* when doing transmutation of objects, we have to recheck the resistances, @@ -216,18 +231,14 @@ //-GPL void -load_materials () +reload_materials () { - //TODO: somehow free old materials, or update them in-place - // currently we effectively leak them. - material_null.next = 0; materialt = &material_null; - object_thawer thawer (settings.datadir, "materials"); if (!thawer) { - LOG (llevError, "Cannot open %s for reading\n", thawer.name); - goto done; + LOG (llevError, "unable to load %s for reading\n", thawer.name); + return; } while (thawer.kw != KW_name) @@ -235,7 +246,7 @@ thawer.next (); if (thawer.kw == KW_EOF) - goto done; + return; } materialtype_t *mt; @@ -245,11 +256,26 @@ switch (thawer.kw) { case KW_name: - mt = new materialtype_t; - thawer.get (mt->name); - mt->description = mt->name; + coroapi::cede_to_tick (); + + { + // create a new dummy material, or find the existing material + shstr name; + thawer.get (name); + + mt = find (name); + + if (mt) + mt->reset (); + else + { + mt = new materialtype_t; + mt->next = materialt; materialt = mt; + } - mt->next = materialt; materialt = mt; + mt->name = name; + mt->description = name; + } break; case KW_description: @@ -316,18 +342,15 @@ case KW_density: thawer.get (mt->density); break; case KW_EOF: - goto done; + return; default: if (!thawer.parse_error ("materials file")) - goto done; + return; break; } thawer.next (); } - -done: - LOG (llevDebug, "Done.\n"); }