ui/phase-21: sciences CRUD list, designer, and production-picker integration
Lights up the player-defined sciences feature: a table view with sort and filter, a designer with four percent inputs and a strict sum-equals-100 gate, and a Research-sub-row integration so the planet production picker lists the user's sciences alongside the four tech buttons. Phase 21 decisions are baked back into ui/PLAN.md (no UpdateScience on the wire — write-once via createScience + removeScience; percentages instead of fractions; sciences live under the existing Research segment). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -194,6 +194,8 @@ const en = {
|
||||
"game.sidebar.order.label.cargo_route_remove": "remove {loadType} route from planet {source}",
|
||||
"game.sidebar.order.label.ship_class_create": "design ship class {name}",
|
||||
"game.sidebar.order.label.ship_class_remove": "remove ship class {name}",
|
||||
"game.sidebar.order.label.science_create": "define science {name}",
|
||||
"game.sidebar.order.label.science_remove": "remove science {name}",
|
||||
"game.sidebar.order.label.ship_group_break": "split group {group} → {quantity} ships into new group",
|
||||
"game.sidebar.order.label.ship_group_send": "send group {group} → planet {destination}",
|
||||
"game.sidebar.order.label.ship_group_load": "load {cargo} × {quantity} onto group {group}",
|
||||
@@ -254,6 +256,47 @@ const en = {
|
||||
"game.designer.ship_class.preview.cargo_capacity": "cargo capacity per ship",
|
||||
"game.designer.ship_class.preview.unavailable": "—",
|
||||
|
||||
"game.table.sciences.title": "sciences",
|
||||
"game.table.sciences.column.name": "name",
|
||||
"game.table.sciences.column.drive": "drive %",
|
||||
"game.table.sciences.column.weapons": "weapons %",
|
||||
"game.table.sciences.column.shields": "shields %",
|
||||
"game.table.sciences.column.cargo": "cargo %",
|
||||
"game.table.sciences.column.actions": "actions",
|
||||
"game.table.sciences.empty": "no sciences defined yet",
|
||||
"game.table.sciences.filter.placeholder": "filter by name",
|
||||
"game.table.sciences.action.new": "+ new science",
|
||||
"game.table.sciences.action.delete": "delete",
|
||||
"game.table.sciences.loading": "loading sciences…",
|
||||
"game.designer.science.title.new": "define new science",
|
||||
"game.designer.science.title.view": "science {name}",
|
||||
"game.designer.science.field.name": "name",
|
||||
"game.designer.science.field.drive": "drive %",
|
||||
"game.designer.science.field.weapons": "weapons %",
|
||||
"game.designer.science.field.shields": "shields %",
|
||||
"game.designer.science.field.cargo": "cargo %",
|
||||
"game.designer.science.field.sum": "sum: {value} % (must equal 100)",
|
||||
"game.designer.science.action.save": "save",
|
||||
"game.designer.science.action.cancel": "cancel",
|
||||
"game.designer.science.action.delete": "delete",
|
||||
"game.designer.science.action.back": "back",
|
||||
"game.designer.science.hint.values": "each value is a percent in [0, 100] with one decimal; the four percentages must sum to exactly 100",
|
||||
"game.designer.science.read_only_notice": "sciences are defined once; values cannot be edited after creation",
|
||||
"game.designer.science.not_found": "science \"{name}\" does not exist",
|
||||
"game.designer.science.invalid.empty": "name cannot be empty",
|
||||
"game.designer.science.invalid.too_long": "name is too long (30 characters max)",
|
||||
"game.designer.science.invalid.starts_with_special": "name cannot start with a special character",
|
||||
"game.designer.science.invalid.ends_with_special": "name cannot end with a special character",
|
||||
"game.designer.science.invalid.consecutive_specials": "too many special characters in a row",
|
||||
"game.designer.science.invalid.whitespace": "name cannot contain spaces",
|
||||
"game.designer.science.invalid.disallowed_character": "name contains disallowed characters",
|
||||
"game.designer.science.invalid.duplicate_name": "a science with this name already exists",
|
||||
"game.designer.science.invalid.drive_value": "drive % must be in [0, 100]",
|
||||
"game.designer.science.invalid.weapons_value": "weapons % must be in [0, 100]",
|
||||
"game.designer.science.invalid.shields_value": "shields % must be in [0, 100]",
|
||||
"game.designer.science.invalid.cargo_value": "cargo % must be in [0, 100]",
|
||||
"game.designer.science.invalid.sum_not_hundred": "the four percentages must sum to exactly 100",
|
||||
|
||||
"game.inspector.ship_group.kind.local": "your group",
|
||||
"game.inspector.ship_group.kind.other": "other race group",
|
||||
"game.inspector.ship_group.kind.incoming": "incoming group",
|
||||
|
||||
@@ -195,6 +195,8 @@ const ru: Record<keyof typeof en, string> = {
|
||||
"game.sidebar.order.label.cargo_route_remove": "удалить маршрут {loadType} с планеты {source}",
|
||||
"game.sidebar.order.label.ship_class_create": "сконструировать класс корабля {name}",
|
||||
"game.sidebar.order.label.ship_class_remove": "удалить класс корабля {name}",
|
||||
"game.sidebar.order.label.science_create": "определить науку {name}",
|
||||
"game.sidebar.order.label.science_remove": "удалить науку {name}",
|
||||
"game.sidebar.order.label.ship_group_break": "разделить группу {group} → новая группа из {quantity} кораблей",
|
||||
"game.sidebar.order.label.ship_group_send": "отправить группу {group} → планета {destination}",
|
||||
"game.sidebar.order.label.ship_group_load": "загрузить {cargo} × {quantity} в группу {group}",
|
||||
@@ -255,6 +257,47 @@ const ru: Record<keyof typeof en, string> = {
|
||||
"game.designer.ship_class.preview.cargo_capacity": "грузоподъёмность одного корабля",
|
||||
"game.designer.ship_class.preview.unavailable": "—",
|
||||
|
||||
"game.table.sciences.title": "науки",
|
||||
"game.table.sciences.column.name": "название",
|
||||
"game.table.sciences.column.drive": "двигатель %",
|
||||
"game.table.sciences.column.weapons": "оружие %",
|
||||
"game.table.sciences.column.shields": "защита %",
|
||||
"game.table.sciences.column.cargo": "трюм %",
|
||||
"game.table.sciences.column.actions": "действия",
|
||||
"game.table.sciences.empty": "науки ещё не определены",
|
||||
"game.table.sciences.filter.placeholder": "фильтр по названию",
|
||||
"game.table.sciences.action.new": "+ новая наука",
|
||||
"game.table.sciences.action.delete": "удалить",
|
||||
"game.table.sciences.loading": "загрузка наук…",
|
||||
"game.designer.science.title.new": "определение новой науки",
|
||||
"game.designer.science.title.view": "наука {name}",
|
||||
"game.designer.science.field.name": "название",
|
||||
"game.designer.science.field.drive": "двигатель %",
|
||||
"game.designer.science.field.weapons": "оружие %",
|
||||
"game.designer.science.field.shields": "защита %",
|
||||
"game.designer.science.field.cargo": "трюм %",
|
||||
"game.designer.science.field.sum": "сумма: {value} % (должно быть 100)",
|
||||
"game.designer.science.action.save": "сохранить",
|
||||
"game.designer.science.action.cancel": "отмена",
|
||||
"game.designer.science.action.delete": "удалить",
|
||||
"game.designer.science.action.back": "назад",
|
||||
"game.designer.science.hint.values": "каждое значение — процент в [0, 100] с одним знаком после запятой; четыре процента должны давать в сумме ровно 100",
|
||||
"game.designer.science.read_only_notice": "науки определяются один раз; характеристики нельзя изменить после создания",
|
||||
"game.designer.science.not_found": "науки \"{name}\" не существует",
|
||||
"game.designer.science.invalid.empty": "название не может быть пустым",
|
||||
"game.designer.science.invalid.too_long": "название слишком длинное (максимум 30 символов)",
|
||||
"game.designer.science.invalid.starts_with_special": "название не может начинаться со спецсимвола",
|
||||
"game.designer.science.invalid.ends_with_special": "название не может заканчиваться спецсимволом",
|
||||
"game.designer.science.invalid.consecutive_specials": "слишком много спецсимволов подряд",
|
||||
"game.designer.science.invalid.whitespace": "название не может содержать пробелы",
|
||||
"game.designer.science.invalid.disallowed_character": "название содержит недопустимые символы",
|
||||
"game.designer.science.invalid.duplicate_name": "наука с таким названием уже существует",
|
||||
"game.designer.science.invalid.drive_value": "двигатель % должен быть в [0, 100]",
|
||||
"game.designer.science.invalid.weapons_value": "оружие % должно быть в [0, 100]",
|
||||
"game.designer.science.invalid.shields_value": "защита % должна быть в [0, 100]",
|
||||
"game.designer.science.invalid.cargo_value": "трюм % должен быть в [0, 100]",
|
||||
"game.designer.science.invalid.sum_not_hundred": "сумма четырёх процентов должна быть ровно 100",
|
||||
|
||||
"game.inspector.ship_group.kind.local": "ваша группа",
|
||||
"game.inspector.ship_group.kind.other": "группа другой расы",
|
||||
"game.inspector.ship_group.kind.incoming": "входящая группа",
|
||||
|
||||
Reference in New Issue
Block a user