os := import("os") json := import("json") fmt := import("fmt") //fpaths := import("fpaths") //objects := import("objects") html := import("html").Renderer() enum := import("enum") // DND5 specification for the RU. spec := { ru: { names : { system : "Подземелья и Драконы 5E", str: "Сила", dex: "Ловкость", con: "Телосложение", int: "Интеллект", wis: "Мудрость", cha: "Харизма", prof_bonus : "Бонус мастерства", prof: "Владение", modifier: "Модификатор" } } } calc_mod := func(x) { return int(x-10)/2 } new_char_stat := func(stat){ self := stat self.get_attr_mod = func(name){ return int(self.attr[name]-10)/2 } self.get_prof_bonus = func() { return int(self.level-1)/4 + 2 } self.make_attr_table = func(){ lang_name := "ru" lang_names := spec[lang_name].names trow := html.tr() for _, v in ["Атрибут", "Значение", "Модификатор"] { trow.add(html.td().body(v)) } thead := html.thead().body(trow) lang_map := {} for k, v in self.attr { lang_name := lang_names[k] if lang_name { lang_map[lang_name] = v } else { lang_map[format("undefined(%q)", k)] = v } } lang := enum.sort(enum.keys(lang_map)) tbody := html.tbody() for _, attr_lang_name in lang { v := lang_map[attr_lang_name] tr := html.tr().body( html.td().body( attr_lang_name ), html.td().body( v ), html.td().body( calc_mod(v) ) ) tbody.add(tr) } return html.table().body( thead, tbody ) } self.make_base_table = func() { hrow := html.tr() for _, v in ["Название", "Значение"] { hrow.add(html.td().body(v)) } thead := html.thead().body(hrow) values := { "Уровень": 1, "": 2 } tbody := html.tbody().body() } return self } new := func(c) { self := {} self.context = c self.get_char_stat = func(name){ stat_data := os.read_file(format( "%s/char/%s/stat.json", self.context.source_path, name )) if is_error(stat_data) { return stat_data } stat := json.decode(stat_data) return new_char_stat(stat.dnd5) } self.spec = spec return self } export new