--- deliantra/server/common/material.C 2009/11/04 00:02:48 1.1 +++ deliantra/server/common/material.C 2009/11/04 00:08:44 1.2 @@ -137,3 +137,160 @@ } } +//TODO: make this a constructor +static materialtype_t * +get_empty_mat (void) +{ + materialtype_t *mt; + int i; + + mt = new materialtype_t; + + mt->name = shstr_unknown; + mt->description = 0; + + for (i = 0; i < NROFATTACKS; i++) + { + mt->save[i] = 0; + mt->mod[i] = 0; + } + + mt->chance = 0; + mt->difficulty = 0; + mt->magic = 0; + mt->damage = 0; + mt->wc = 0; + mt->ac = 0; + mt->sp = 0; + mt->weight = 100; + mt->value = 100; + mt->density = 1; + mt->next = 0; + + return mt; +} + +void +load_materials (void) +{ + char filename[MAX_BUF]; + + sprintf (filename, "%s/materials", settings.datadir); + LOG (llevDebug, "Reading material type data from %s...\n", filename); + + //TODO: somehow free old materials, or update them in-place + materialt = 0; + + object_thawer thawer (filename); + + if (!thawer) + { + LOG (llevError, "Cannot open %s for reading\n", filename); + goto done; + } + + while (thawer.kw != KW_name) + { + thawer.next (); + + if (thawer.kw == KW_EOF) + goto done; + } + + materialtype_t *mt; + + for (;;) + { + switch (thawer.kw) + { + case KW_name: + mt = get_empty_mat (); + mt->next = materialt; + materialt = mt; + + thawer.get (mt->name); + mt->description = mt->name; + break; + + case KW_description: + thawer.get (mt->description); + break; + + case KW_material: + thawer.get (mt->material); + break; + + case KW_saves: + { + const char *cp = thawer.get_str () - 1; + + for (int i = 0; i < NROFATTACKS; i++) + { + if (!cp) + { + mt->save[i] = 0; + continue; + } + + int value; + ++cp; + sscanf (cp, "%d", &value); + mt->save[i] = (sint8) value; + cp = strchr (cp, ','); + } + } + break; + + case KW_mods: + { + const char *cp = thawer.get_str () - 1; + + for (int i = 0; i < NROFATTACKS; i++) + { + if (!cp) + { + mt->save[i] = 0; + continue; + } + + ++cp; + int value; + sscanf (cp, "%d", &value); + mt->mod[i] = (sint8) value; + cp = strchr (cp, ','); + } + } + break; + + case KW_chance: thawer.get (mt->chance); break; + case KW_difficulty: // cf+ alias, not original cf + case KW_diff: thawer.get (mt->difficulty); break; + case KW_magic: thawer.get (mt->magic); break; + case KW_dam: // cf+ alias, not original cf + case KW_damage: thawer.get (mt->damage); break; + case KW_wc: thawer.get (mt->wc); break; + case KW_ac: thawer.get (mt->ac); break; + case KW_sp: thawer.get (mt->sp); break; + case KW_weight: thawer.get (mt->weight); break; + case KW_value: thawer.get (mt->value); break; + case KW_density: thawer.get (mt->density); break; + + case KW_EOF: + goto done; + + default: + if (!thawer.parse_error ("materials file", "materials")) + goto done; + break; + } + + thawer.next (); + } + +done: + if (!materialt) + materialt = get_empty_mat (); + + LOG (llevDebug, "Done.\n"); +} +