Initial attempt at making rogue work with application overrides.

This commit is contained in:
Storm Dragon committed 2026-10-28 16:24:44 -04:00
1 parent 088f706cb4
commit 46dc520854
15 files changed
+1836 -111

No files matched your search

+5 -2
View File
@@ -11,6 +11,7 @@ import (
"git.stormux.org/storm/fenrir/internal/applicationoverrides"
"git.stormux.org/storm/fenrir/internal/applicationoverrides/networkmanager"
"git.stormux.org/storm/fenrir/internal/applicationoverrides/ninjam"
"git.stormux.org/storm/fenrir/internal/applicationoverrides/rogue"
"git.stormux.org/storm/fenrir/internal/config"
"git.stormux.org/storm/fenrir/internal/i18n"
"git.stormux.org/storm/fenrir/internal/interaction"
@@ -192,6 +193,8 @@ func (a *application) select_override(id string) {
adapter = &ninjam.Adapter{}
case "networkmanager":
adapter = &networkmanager.Adapter{}
case "rogue":
adapter = &rogue.Adapter{}
default:
return
}
@@ -315,8 +318,8 @@ func (a *application) open_applications() {
a.voice.Say(i18n.T("Settings are busy"))
return
}
items := []string{i18n.T("Default"), i18n.T("NetworkManager"), i18n.T("Ninjam")}
ids := []string{"default", "networkmanager", "ninjam"}
items := []string{i18n.T("Default"), i18n.T("NetworkManager"), i18n.T("Ninjam"), i18n.T("Rogue")}
ids := []string{"default", "networkmanager", "ninjam", "rogue"}
position := 0
if selected := a.overrides[a.lastTerminal]; selected != nil {
position = slices.Index(ids, selected.id)
+47 -1
View File
@@ -35,12 +35,56 @@ func override_screen(terminal int, kind string) screen.Snapshot {
s.Attributes[111] = screen.Attribute{Foreground: screen.ColorIndexed, Background: screen.ColorIndexed | 7}
case "networkmanager":
copy(s.Line(2), []rune("┌──────── NetworkManager TUI ─────────┐"))
case "rogue":
copy(s.Line(5), []rune("|..@...+"))
copy(s.Line(23), []rune("Level: 1 Gold: 0 Hp: 12(12) Str: 16(16) Arm: 4 Exp: 1/0"))
default:
copy(s.Line(23), []rune(kind))
}
return s
}
func TestRogueMenuSelectionNamedReadProfileAndShellExit(t *testing.T) {
a, voice := persistence_application(t, true)
override_read(t, a, override_screen(1, "rogue"))
a.open_applications()
a.ui.handle(interaction.Key{Text: "r"})
if got := voice.messages[len(voice.messages)-1]; got != "Rogue" {
t.Fatal(got)
}
a.ui.handle(interaction.Key{Name: "enter"})
override_read(t, a, override_screen(1, "rogue"))
if a.overrideCurrent == nil || a.overrideCurrent.id != "rogue" {
t.Fatal("Rogue not activated")
}
a.handle_command(command.ReadLiveRegion1)
if got := voice.messages[len(voice.messages)-1]; got != "Health: 12 of 12" {
t.Fatal(got)
}
base := a.overrideCurrent.underlying.settings.live.Presentation.Speech.Rate
a.handle_command(command.NextQuickValue)
rate := a.settings.live.Presentation.Speech.Rate
if rate == base {
t.Fatal("application rate unchanged")
}
a.save_settings()
finish_persistence(t, a, false)
path := filepath.Join(filepath.Dir(a.options.ConfigPath), "applications", "rogue.toml")
doc, err := config.Open_application_document(path, a.overrideCurrent.base)
if err != nil || doc.Settings.Presentation.Speech.Rate != rate {
t.Fatal("Rogue profile not saved", err)
}
override_read(t, a, override_screen(1, "[Username@host directory] $"))
if a.overrideCurrent != nil || a.overrides[1] != nil || a.settings.live.Presentation.Speech.Rate != base {
t.Fatal("shell did not restore default settings")
}
a.select_override("rogue")
override_read(t, a, override_screen(1, "rogue"))
if a.overrideCurrent == nil || a.settings.live.Presentation.Speech.Rate != rate {
t.Fatal("Rogue profile not reloaded")
}
}
func TestOverrideRestoresSynthesizerAndKeepsSaveBlockedUntilCompletion(t *testing.T) {
for _, failed := range []bool{false, true} {
a, voice, _ := selection_application(t, true)
@@ -136,8 +180,9 @@ func TestApplicationsMenuActivatesOnlyOnEnterAndReleasesCapture(t *testing.T) {
for _, step := range []struct{ key, want string }{
{"down", "NetworkManager"},
{"down", "Ninjam"},
{"down", "Rogue"},
{"down", "Default"},
{"up", "Ninjam"},
{"up", "Rogue"},
} {
a.ui.handle(interaction.Key{Name: step.key})
if got := voice.messages[len(voice.messages)-1]; got != step.want {
@@ -172,6 +217,7 @@ func TestApplicationsMenuActivatesOnlyOnEnterAndReleasesCapture(t *testing.T) {
t.Fatal("Cancel button changed selection")
}
a.open_applications()
a.ui.handle(interaction.Key{Name: "down"}) // Rogue
a.ui.handle(interaction.Key{Name: "down"}) // list wraps to Default
a.ui.handle(interaction.Key{Name: "enter"})
if a.saves_unavailable() || a.engine.Tracking_mode() != "cursor" {
+14
View File
@@ -8,6 +8,7 @@ package applicationoverrides
import (
"git.stormux.org/storm/fenrir/internal/command"
"git.stormux.org/storm/fenrir/internal/config"
"git.stormux.org/storm/fenrir/internal/i18n"
"git.stormux.org/storm/fenrir/internal/presentation"
"git.stormux.org/storm/fenrir/internal/screen"
)
@@ -16,6 +17,19 @@ type Region struct {
Name, Text string
}
// Read includes the region's name for an explicit read. Automatic updates can
// use Text alone when repeating the name would add unnecessary speech.
func (r Region) Read() string {
text := r.Text
if text == "" {
text = i18n.T("Information unavailable")
}
if r.Name == "" {
return text
}
return i18n.Format("{0}: {1}", r.Name, text)
}
// Frame supplements the ordinary reader. OwnsPresentation replaces generic
// automatic diffs, never raw review/copy or typing echo. Updates are independent
// of focus: a focus change must not swallow a simultaneous chat message.
@@ -0,0 +1,21 @@
// Copyright (c) 2026 Storm Dragon
// SPDX-License-Identifier: GPL-3.0-or-later
package applicationoverrides
import "testing"
func TestRegionReadIncludesNameAndHandlesMissingInformation(t *testing.T) {
for _, trial := range []struct {
region Region
want string
}{
{Region{Name: "Health", Text: "12 of 12"}, "Health: 12 of 12"},
{Region{Name: "Health"}, "Health: Information unavailable"},
{Region{Text: "12 of 12"}, "12 of 12"},
} {
if got := trial.region.Read(); got != trial.want {
t.Fatalf("%q, want %q", got, trial.want)
}
}
}
@@ -0,0 +1,291 @@
// Copyright (c) 2026 Storm Dragon
// SPDX-License-Identifier: GPL-3.0-or-later
// Package rogue interprets classic Rogue 5.4's visible terminal display.
// Layout and glyphs follow RogueForge's io.c, command.c, and rogue.h:
// https://github.com/rogueforge/rogue5.4/tree/d4ff90dc41053f1962efbf32c7b71b12503b9b62
package rogue
import (
"regexp"
"slices"
"strconv"
"strings"
"git.stormux.org/storm/fenrir/internal/applicationoverrides"
"git.stormux.org/storm/fenrir/internal/command"
"git.stormux.org/storm/fenrir/internal/config"
"git.stormux.org/storm/fenrir/internal/i18n"
"git.stormux.org/storm/fenrir/internal/presentation"
"git.stormux.org/storm/fenrir/internal/screen"
)
// Classic Rogue uses a 24 by 80 playfield even in a larger terminal.
const mapBottom = 22
var statusPattern = regexp.MustCompile(`^Level:\s+(\d+)\s+Gold:\s+(\d+)\s+Hp:\s+(-?\d+)\(\s*(\d+)\)\s+Str:\s+(\d+)\(\s*(\d+)\)\s+Arm:\s+(-?\d+)\s+Exp:\s+(\d+)/(\d+)\s*(Hungry|Weak|Faint)?\s*$`)
type entity struct {
x, y int
glyph rune
}
type Adapter struct {
previous screen.Snapshot
stats []string
message, latest string
entities []entity
regions []applicationoverrides.Region
dialog bool
}
func (*Adapter) Name() string { return "Rogue" }
func (*Adapter) Configure(settings *config.Settings) {
settings.Reading.Mode = "cursor"
settings.Review.LeaveReviewOnCursorChange = true
}
func (a *Adapter) Reset() { *a = Adapter{} }
func (a *Adapter) Close() { a.Reset() }
func (a *Adapter) Command(id command.ID) (presentation.CommandResult, bool) {
ids := []command.ID{command.ReadLiveRegion1, command.ReadLiveRegion2, command.ReadLiveRegion3, command.ReadLiveRegion4, command.ReadLiveRegion5, command.ReadLiveRegion6}
if slot := slices.Index(ids, id); slot >= 0 {
regions := a.regions
if len(regions) == 0 {
regions = region_names()
}
return presentation.CommandResult{Text: regions[slot].Read()}, true
}
if id == command.ListReadingRegions {
var entries []string
for slot, region := range region_names() {
entries = append(entries, i18n.Format("Live region {0}: {1}", strconv.Itoa(slot+1), region.Name))
}
return presentation.CommandResult{Text: strings.Join(entries, ". ")}, true
}
return presentation.CommandResult{}, false
}
func region_names() []applicationoverrides.Region {
return []applicationoverrides.Region{
{Name: i18n.T("Health")}, {Name: i18n.T("Status")},
{Name: i18n.T("Latest message")}, {Name: i18n.T("Surroundings")},
{Name: i18n.T("Visible monsters")}, {Name: i18n.T("Visible objects and landmarks")},
}
}
func (a *Adapter) Observe(next screen.Snapshot) applicationoverrides.Frame {
if !next.Active || next.Rows < 24 || next.Cols < 80 || len(next.Cells) != next.Rows*next.Cols {
a.Reset()
return applicationoverrides.Frame{}
}
stable := a.previous.Active && a.previous.Terminal == next.Terminal && a.previous.Generation == next.Generation && a.previous.Rows == next.Rows && a.previous.Cols == next.Cols
if !stable {
a.Reset()
}
stats := statusPattern.FindStringSubmatch(strings.TrimSpace(next.Text(23)))
// Options and full-screen help/inventory use a separate curses window.
// Let ordinary reading handle their text; never interpret it as map glyphs.
options := strings.Contains(next.Text(0), `Terse output ("terse"):`) && strings.Contains(string(next.Cells), `Inventory style ("inven"):`)
page := strings.Contains(string(next.Cells), "--Press space to continue--")
if options || page && (stable || stats != nil) {
a.regions = region_names()
a.regions[2].Text = a.latest
a.previous, a.dialog = next, true
return applicationoverrides.Frame{Recognized: true, Regions: slices.Clone(a.regions)}
}
x, y, found := player_position(next)
if stats == nil || !found {
a.Reset()
return applicationoverrides.Frame{}
}
frame := applicationoverrides.Frame{Recognized: true, OwnsPresentation: true}
message := strings.TrimSpace(next.Text(0))
if strings.HasSuffix(message, "--More--") {
message = strings.TrimSpace(strings.TrimSuffix(message, "--More--")) + ". " + i18n.T("More; press Space")
}
if message != "" && message != a.message {
a.latest = message
frame.Updates = append(frame.Updates, presentation.Message{Text: message})
}
// A visible clear permits the same message to be announced on a later turn.
// Messages replaced between captures cannot be recovered from screenshots.
a.message = message
regions := region_names()
regions[0].Text = i18n.Format("{0} of {1}", stats[3], stats[4])
regions[1].Text = strings.TrimSpace(next.Text(23))
regions[2].Text = a.latest
regions[3].Text = surroundings(next, x, y)
entities := visible_entities(next)
var monsters, objects []string
for _, item := range entities {
text := describe(item, x, y)
if is_monster(item.glyph) {
monsters = append(monsters, text)
} else {
objects = append(objects, text)
}
}
regions[4].Text, regions[5].Text = join_entities(monsters), join_entities(objects)
if !stable || len(a.stats) == 0 {
frame.Updates = append(frame.Updates, presentation.Message{Text: regions[0].Read()})
if stats[10] != "" {
frame.Updates = append(frame.Updates, presentation.Message{Text: stats[10]})
}
} else {
if stats[3] != a.stats[3] || stats[4] != a.stats[4] {
frame.Updates = append(frame.Updates, presentation.Message{Text: regions[0].Read()})
}
for _, field := range []struct {
index int
label string
}{
{1, i18n.T("Dungeon level")}, {5, i18n.T("Strength")},
{7, i18n.T("Armor")}, {8, i18n.T("Experience level")},
} {
if stats[field.index] != a.stats[field.index] {
frame.Updates = append(frame.Updates, presentation.Message{Text: (applicationoverrides.Region{Name: field.label, Text: stats[field.index]}).Read()})
}
}
if stats[10] != a.stats[10] {
hunger := stats[10]
if hunger == "" {
hunger = i18n.T("Not hungry")
}
frame.Updates = append(frame.Updates, presentation.Message{Text: hunger})
}
}
// Compare monsters by glyph count so a moving monster does not repeatedly
// sound like a new arrival. Objects and landmarks have fixed map positions.
if stable && !a.dialog && len(a.stats) != 0 && stats[1] == a.stats[1] {
counts := map[rune]int{}
for _, item := range a.entities {
if is_monster(item.glyph) {
counts[item.glyph]++
}
}
for _, item := range entities {
if is_monster(item.glyph) && counts[item.glyph] > 0 {
counts[item.glyph]--
continue
}
if !is_monster(item.glyph) && slices.Contains(a.entities, item) {
continue
}
frame.Updates = append(frame.Updates, presentation.Message{Text: describe(item, x, y)})
}
}
a.regions, a.stats, a.entities = regions, stats, entities
a.previous, a.dialog = next, false
frame.Regions = slices.Clone(regions)
return frame
}
func player_position(s screen.Snapshot) (int, int, bool) {
x, y := -1, -1
for row := 1; row <= mapBottom; row++ {
for col, glyph := range s.Line(row)[:80] {
if glyph == '@' {
if x >= 0 {
return 0, 0, false
}
x, y = col, row
}
}
}
return x, y, x >= 0
}
func is_monster(glyph rune) bool { return glyph >= 'A' && glyph <= 'Z' }
func visible_entities(s screen.Snapshot) []entity {
var result []entity
for y := 1; y <= mapBottom; y++ {
for x, glyph := range s.Line(y)[:80] {
if is_monster(glyph) || strings.ContainsRune("+^%*!?$:)],=/", glyph) {
result = append(result, entity{x, y, glyph})
}
}
}
return result
}
func join_entities(items []string) string {
if len(items) == 0 {
return i18n.T("None visible")
}
return strings.Join(items, "; ")
}
func surroundings(s screen.Snapshot, x, y int) string {
var items []string
for _, delta := range [][2]int{{0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}} {
col, row := x+delta[0], y+delta[1]
if col < 0 || col >= 80 || row < 1 || row > mapBottom {
continue
}
items = append(items, describe(entity{col, row, s.Line(row)[col]}, x, y))
}
return strings.Join(items, "; ")
}
func describe(item entity, x, y int) string {
var offsets []string
if item.y < y {
offsets = append(offsets, i18n.Format("north {0}", strconv.Itoa(y-item.y)))
}
if item.y > y {
offsets = append(offsets, i18n.Format("south {0}", strconv.Itoa(item.y-y)))
}
if item.x < x {
offsets = append(offsets, i18n.Format("west {0}", strconv.Itoa(x-item.x)))
}
if item.x > x {
offsets = append(offsets, i18n.Format("east {0}", strconv.Itoa(item.x-x)))
}
return i18n.Format("{0}, {1}", glyph_name(item.glyph), strings.Join(offsets, ", "))
}
func glyph_name(glyph rune) string {
// These are Rogue's own English monster names, rather than Fenrir labels.
if is_monster(glyph) {
return []string{"aquator", "bat", "centaur", "dragon", "emu", "venus flytrap", "griffin", "hobgoblin", "ice monster", "jabberwock", "kestrel", "leprechaun", "medusa", "nymph", "orc", "phantom", "quagga", "rattlesnake", "snake", "troll", "black unicorn", "vampire", "wraith", "xeroc", "yeti", "zombie"}[glyph-'A']
}
switch glyph {
case ' ', 0:
return i18n.T("Unseen")
case '|', '-':
return i18n.T("Wall")
case '.':
return i18n.T("Floor")
case '#':
return i18n.T("Passage")
case '+':
return i18n.T("Door")
case '^':
return i18n.T("Trap")
case '%':
return i18n.T("Stairs")
case '*':
return i18n.T("Gold")
case '!':
return i18n.T("Potion")
case '?':
return i18n.T("Scroll")
case '$':
return i18n.T("Magic")
case ':':
return i18n.T("Food")
case ')':
return i18n.T("Weapon")
case ']':
return i18n.T("Armor")
case ',':
return i18n.T("Amulet")
case '=':
return i18n.T("Ring")
case '/':
return i18n.T("Wand or staff")
}
return string(glyph)
}
@@ -0,0 +1,213 @@
// Copyright (c) 2026 Storm Dragon
// SPDX-License-Identifier: GPL-3.0-or-later
package rogue_test
import (
"slices"
"strings"
"testing"
"git.stormux.org/storm/fenrir/internal/applicationoverrides/rogue"
"git.stormux.org/storm/fenrir/internal/command"
"git.stormux.org/storm/fenrir/internal/presentation"
"git.stormux.org/storm/fenrir/internal/reader"
"git.stormux.org/storm/fenrir/internal/screen"
)
const initialStatus = "Level: 1 Gold: 0 Hp: 12(12) Str: 16(16) Arm: 4 Exp: 1/0"
func game(rows, cols int, message, status string) screen.Snapshot {
s := screen.Snapshot{Terminal: 1, Active: true, Rows: rows, Cols: cols, X: 10, Y: 5, Cells: make([]rune, rows*cols)}
for index := range s.Cells {
s.Cells[index] = ' '
}
copy(s.Line(0), []rune(message))
copy(s.Line(4)[8:], []rune("-----"))
copy(s.Line(5)[8:], []rune("|.@.+"))
copy(s.Line(6)[8:], []rune("----|"))
copy(s.Line(23), []rune(status))
return s
}
func texts(messages []presentation.Message) []string {
var result []string
for _, message := range messages {
if message.Text != "" {
result = append(result, message.Text)
}
}
return result
}
func TestNamedRegionsAndVisibleMap(t *testing.T) {
for _, size := range [][2]int{{24, 80}, {32, 100}} {
a := &rogue.Adapter{}
s := game(size[0], size[1], "Welcome", initialStatus)
s.Line(5)[14], s.Line(8)[10], s.Line(9)[10] = 'B', '%', '!'
frame := a.Observe(s)
if !frame.Recognized || !frame.OwnsPresentation {
t.Fatal("game not recognized")
}
for _, trial := range []struct {
id command.ID
want string
}{
{command.ReadLiveRegion1, "Health: 12 of 12"},
{command.ReadLiveRegion2, "Status: " + initialStatus},
{command.ReadLiveRegion3, "Latest message: Welcome"},
{command.ReadLiveRegion4, "Wall, north 1"},
{command.ReadLiveRegion5, "Visible monsters: bat, east 4"},
{command.ReadLiveRegion6, "Stairs, south 3"},
} {
got, handled := a.Command(trial.id)
if !handled || !strings.Contains(got.Text, trial.want) {
t.Fatalf("%s: %+v", trial.id, got)
}
}
if got, _ := a.Command(command.ListReadingRegions); !strings.Contains(got.Text, "Live region 1: Health") || !strings.Contains(got.Text, "Live region 6: Visible objects and landmarks") {
t.Fatal(got)
}
if _, handled := a.Command(command.ReadLiveRegion7); handled {
t.Fatal("unassigned slot captured")
}
if got, _ := a.Command(command.ReadLiveRegion5); strings.Contains(got.Text, "dragon") {
t.Fatal("invented hidden monster")
}
}
}
func TestMessagesHealthAndHungerWithoutMapChatter(t *testing.T) {
a := &rogue.Adapter{}
r := reader.New()
update := func(s screen.Snapshot) []string { return texts(r.Update_application(s, a.Observe(s))) }
update(game(24, 80, "", initialStatus))
if got := update(game(24, 80, "", initialStatus)); len(got) != 0 {
t.Fatal("idle chatter", got)
}
damaged := strings.Replace(initialStatus, "12(12)", "9(12)", 1) + " Hungry"
got := update(game(24, 80, "The bat hits you", damaged))
if !slices.Equal(got, []string{"The bat hits you", "Health: 9 of 12", "Hungry"}) {
t.Fatal(got)
}
if got := update(game(24, 80, "The bat hits you", damaged)); len(got) != 0 {
t.Fatal("repeated snapshot", got)
}
update(game(24, 80, "", damaged))
if got := update(game(24, 80, "The bat hits you", damaged)); !slices.Equal(got, []string{"The bat hits you"}) {
t.Fatal("repeated combat lost", got)
}
if got := update(game(24, 80, "The bat hits you--More--", damaged)); len(got) != 1 || !strings.Contains(got[0], "More") {
t.Fatal("paging prompt lost", got)
}
if got := update(game(24, 80, "", initialStatus)); !slices.Contains(got, "Not hungry") {
t.Fatal("hunger recovery", got)
}
r.Configure(false, true)
if got := update(game(24, 80, "A new message", damaged)); len(got) != 0 {
t.Fatal("automatic disabled", got)
}
if got, _ := a.Command(command.ReadLiveRegion3); got.Text != "Latest message: A new message" {
t.Fatal("explicit read disabled", got)
}
}
func TestNewMonstersAndLandmarks(t *testing.T) {
a := &rogue.Adapter{}
a.Observe(game(24, 80, "", initialStatus))
s := game(24, 80, "", initialStatus)
s.Line(5)[14], s.Line(8)[10] = 'B', '%'
if got := texts(a.Observe(s).Updates); !slices.Equal(got, []string{"bat, east 4", "Stairs, south 3"}) {
t.Fatal(got)
}
s = game(24, 80, "", initialStatus)
s.Line(5)[13], s.Line(8)[10] = 'B', '%'
if got := texts(a.Observe(s).Updates); len(got) != 0 {
t.Fatal("moving monster chatter", got)
}
s = game(24, 80, "", initialStatus)
s.Line(5)[13], s.Line(8)[10], s.Line(6)[15] = 'B', '%', 'B'
if got := texts(a.Observe(s).Updates); !slices.Equal(got, []string{"bat, south 1, east 5"}) {
t.Fatal("second monster", got)
}
}
func TestStatusChangesAndNewLevelBaseline(t *testing.T) {
a := &rogue.Adapter{}
a.Observe(game(24, 80, "", initialStatus))
s := game(24, 80, "", "Level: 2 Gold: 45 Hp: 9(15) Str: 15(16) Arm: 3 Exp: 2/10 Weak")
s.Line(10)[10] = 'D'
want := []string{"Health: 9 of 15", "Dungeon level: 2", "Strength: 15", "Armor: 3", "Experience level: 2", "Weak"}
if got := texts(a.Observe(s).Updates); !slices.Equal(got, want) {
t.Fatal("status or level baseline", got)
}
}
func TestDialogsAndContextBoundaries(t *testing.T) {
a := &rogue.Adapter{}
a.Observe(game(24, 80, "Welcome", initialStatus))
s := game(24, 80, "", initialStatus)
for index := range s.Cells {
s.Cells[index] = ' '
}
copy(s.Line(0), []rune("a) A potion of healing"))
copy(s.Line(23), []rune("--Press space to continue--"))
frame := a.Observe(s)
if !frame.Recognized || frame.OwnsPresentation {
t.Fatal("inventory did not use ordinary reading")
}
if got, _ := a.Command(command.ReadLiveRegion4); got.Text != "Surroundings: Information unavailable" {
t.Fatal("stale surroundings", got)
}
if got := texts(a.Observe(game(24, 80, "", initialStatus)).Updates); len(got) != 0 {
t.Fatal("return replayed game", got)
}
for _, boundary := range []string{"resize", "terminal", "buffer", "inactive", "shell", "malformed"} {
t.Run(boundary, func(t *testing.T) {
a := &rogue.Adapter{}
a.Observe(game(24, 80, "Old message", initialStatus))
s := game(24, 80, "", initialStatus)
switch boundary {
case "resize":
s = game(32, 100, "", initialStatus)
case "terminal":
s.Terminal++
case "buffer":
s.Generation++
case "inactive":
s.Active = false
case "shell":
for index := range s.Cells {
s.Cells[index] = ' '
}
copy(s.Line(23), []rune("user@host $ "))
case "malformed":
s.Cells = s.Cells[:10]
}
frame := a.Observe(s)
if boundary == "inactive" || boundary == "shell" || boundary == "malformed" {
if frame.Recognized {
t.Fatal("unrelated screen recognized")
}
}
if got, _ := a.Command(command.ReadLiveRegion3); strings.Contains(got.Text, "Old message") {
t.Fatal("stale context", got)
}
})
}
}
func TestRawReviewStillReadsActualMap(t *testing.T) {
a, r := &rogue.Adapter{}, reader.New()
s := game(24, 80, "", initialStatus)
r.Update_application(s, a.Observe(s))
if got := r.Command(command.CurrentLine); !strings.Contains(got.Text, "@") {
t.Fatal(got)
}
r.Note_input(true, false, false)
s = game(24, 80, "", initialStatus)
s.Line(5)[10], s.Line(5)[11], s.X = '.', '@', 11
if got := texts(r.Update_application(s, a.Observe(s))); len(got) != 0 {
t.Fatal("movement spoke map", got)
}
}
+168 -18
View File
@@ -59,6 +59,10 @@ msgstr "Alle"
msgid "All 10 live regions are set"
msgstr "Alle 10 Live-Bereiche sind festgelegt"
#: internal/applicationoverrides/rogue/rogue.go:284
msgid "Amulet"
msgstr "Amulett"
#: internal/emoji/catalog.go:23
msgid "Angry"
msgstr "Wütend"
@@ -67,11 +71,11 @@ msgstr "Wütend"
msgid "Apple"
msgstr "Apfel"
#: internal/app/application_overrides.go:325
#: internal/app/application_overrides.go:328
msgid "Application"
msgstr "Anwendung"
#: internal/app/application_overrides.go:324
#: internal/app/application_overrides.go:327
msgid "Applications"
msgstr "Anwendungen"
@@ -79,6 +83,11 @@ msgstr "Anwendungen"
msgid "Argentina"
msgstr "Argentinien"
#: internal/applicationoverrides/rogue/rogue.go:144
#: internal/applicationoverrides/rogue/rogue.go:282
msgid "Armor"
msgstr "Rüstung"
#: internal/config/config.go:155
msgid "Attribute format"
msgstr "Attributformat"
@@ -163,7 +172,7 @@ msgstr "Schmetterling"
msgid "Canada"
msgstr "Kanada"
#: internal/app/application_overrides.go:326
#: internal/app/application_overrides.go:329
#: internal/preferences/settings.go:93
msgid "Cancel"
msgstr "Abbrechen"
@@ -289,13 +298,13 @@ msgstr "Cool"
msgid "Could not check spelling: {0}"
msgstr "Rechtschreibung konnte nicht geprüft werden: {0}"
#: internal/app/application_overrides.go:278
#: internal/app/application_overrides.go:83
#: internal/app/application_overrides.go:281
#: internal/app/application_overrides.go:84
msgid "Could not load application settings: {0}"
msgstr "Anwendungseinstellungen konnten nicht geladen werden: {0}"
#: internal/app/application_overrides.go:329
#: internal/app/application_overrides.go:333
#: internal/app/application_overrides.go:332
#: internal/app/application_overrides.go:336
msgid "Could not open Applications: {0}"
msgstr "Anwendungen konnten nicht geöffnet werden: {0}"
@@ -312,8 +321,8 @@ msgstr "Fenrir-Menü konnte nicht geöffnet werden: {0}"
msgid "Could not open Spellcheck Menu: {0}"
msgstr "Rechtschreibmenü konnte nicht geöffnet werden: {0}"
#: internal/app/application_overrides.go:161
#: internal/app/application_overrides.go:296
#: internal/app/application_overrides.go:162
#: internal/app/application_overrides.go:299
msgid "Could not restore application settings: {0}"
msgstr "Anwendungseinstellungen konnten nicht wiederhergestellt werden: {0}"
@@ -342,12 +351,12 @@ msgstr "Dolch"
msgid "Date format"
msgstr "Datumsformat"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "Default"
msgstr "Standard"
#: internal/app/application_overrides.go:186
#: internal/app/application_overrides.go:242
#: internal/app/application_overrides.go:187
#: internal/app/application_overrides.go:245
msgid "Default settings restored"
msgstr "Standardeinstellungen wiederhergestellt"
@@ -383,10 +392,18 @@ msgstr "Hund"
msgid "Donut"
msgstr "Donut"
#: internal/applicationoverrides/rogue/rogue.go:264
msgid "Door"
msgstr "Tür"
#: internal/config/config.go:120 internal/config/config.go:127
msgid "Driver"
msgstr "Treiber"
#: internal/applicationoverrides/rogue/rogue.go:143
msgid "Dungeon level"
msgstr "Verliesebene"
#: internal/config/config.go:142
msgid "Echo on CapsLock"
msgstr "Zeichenansage bei Feststelltaste"
@@ -437,6 +454,10 @@ msgstr "Lesemodus verlassen"
msgid "Exiting tutorial mode. To enter tutorial mode again press Fenrir+F1"
msgstr "Anleitungsmodus verlassen. Zum erneuten Aufrufen Fenrir+F1 drücken"
#: internal/applicationoverrides/rogue/rogue.go:144
msgid "Experience level"
msgstr "Erfahrungsstufe"
#: internal/emoji/catalog.go:30
msgid "Exploding head"
msgstr "Explodierender Kopf"
@@ -486,11 +507,15 @@ msgstr "Erste Zwischenablage "
msgid "Flags"
msgstr "Flaggen"
#: internal/applicationoverrides/rogue/rogue.go:260
msgid "Floor"
msgstr "Boden"
#: internal/emoji/catalog.go:105
msgid "Folded hands"
msgstr "Gefaltete Hände"
#: internal/emoji/catalog.go
#: internal/applicationoverrides/rogue/rogue.go:278 internal/emoji/catalog.go
msgid "Food"
msgstr "Essen"
@@ -514,6 +539,10 @@ msgstr "Geist"
msgid "Gift"
msgstr "Geschenk"
#: internal/applicationoverrides/rogue/rogue.go:270
msgid "Gold"
msgstr "Gold"
#: internal/emoji/catalog.go:127
msgid "Greece"
msgstr "Griechenland"
@@ -530,6 +559,10 @@ msgstr "Grinsend mit Schweißtropfen"
msgid "Hamburger"
msgstr "Hamburger"
#: internal/applicationoverrides/rogue/rogue.go:71
msgid "Health"
msgstr "Gesundheit"
#: internal/emoji/catalog.go:106
msgid "Heart"
msgstr "Herz"
@@ -574,6 +607,10 @@ msgstr "Einrückung"
msgid "India"
msgstr "Indien"
#: internal/applicationoverrides/override.go:25
msgid "Information unavailable"
msgstr "Information nicht verfügbar"
#: internal/applicationoverrides/ninjam/ninjam.go:276
msgid "Input {0}"
msgstr "Eingang {0}"
@@ -614,6 +651,10 @@ msgstr "Letzte Zwischenablage "
msgid "Latest chat message"
msgstr "Letzte Chatnachricht"
#: internal/applicationoverrides/rogue/rogue.go:72
msgid "Latest message"
msgstr "Letzte Nachricht"
#: internal/emoji/catalog.go:37
msgid "Laughing"
msgstr "Lachend"
@@ -646,6 +687,7 @@ msgstr "Live-Bereich {0} außerhalb des Bildschirms"
msgid "Live region {0} set"
msgstr "Live-Bereich {0} festgelegt"
#: internal/applicationoverrides/rogue/rogue.go:62
#: internal/reader/regions.go:245
msgid "Live region {0}: {1}"
msgstr "Live-Bereich {0}: {1}"
@@ -662,6 +704,10 @@ msgstr "Lokaler Kanal {0}"
msgid "Mage"
msgstr "Magier"
#: internal/applicationoverrides/rogue/rogue.go:276
msgid "Magic"
msgstr "Magie"
#: internal/applicationoverrides/ninjam/ninjam.go:237
msgid "Master"
msgstr "Hauptausgang"
@@ -682,6 +728,10 @@ msgstr "Signalton bei Rechtschreibfehlern"
msgid "Moon"
msgstr "Mond"
#: internal/applicationoverrides/rogue/rogue.go:105
msgid "More; press Space"
msgstr "Mehr; Leertaste drücken"
#: internal/command/descriptions.go:35
msgid "Move Review to the end of current line and display the content"
msgstr "Lesecursor zum Ende der aktuellen Zeile bewegen und Inhalt ausgeben"
@@ -731,7 +781,7 @@ msgstr "Übelkeit"
msgid "Netherlands"
msgstr "Niederlande"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "NetworkManager"
msgstr "NetworkManager"
@@ -739,7 +789,7 @@ msgstr "NetworkManager"
msgid "New channel"
msgstr "Neuer Kanal"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "Ninjam"
msgstr "Ninjam"
@@ -780,10 +830,18 @@ msgstr "Kein Text in der Zwischenablage oder kein zugängliches Display"
msgid "No word"
msgstr "Kein Wort"
#: internal/applicationoverrides/rogue/rogue.go:215
msgid "None visible"
msgstr "Nichts sichtbar"
#: internal/emoji/catalog.go:135
msgid "Norway"
msgstr "Norwegen"
#: internal/applicationoverrides/rogue/rogue.go:153
msgid "Not hungry"
msgstr "Nicht hungrig"
#: internal/review/follow_cursor.go:26
msgid "Not in Review Mode"
msgstr "Nicht im Lesemodus"
@@ -800,6 +858,10 @@ msgstr "OK"
msgid "One or two marks are needed"
msgstr "Eine oder zwei Markierungen werden benötigt"
#: internal/applicationoverrides/rogue/rogue.go:262
msgid "Passage"
msgstr "Gang"
#: internal/emoji/catalog.go:109
msgid "Peace"
msgstr "Frieden"
@@ -840,6 +902,10 @@ msgstr "Kothaufen"
msgid "Portugal"
msgstr "Portugal"
#: internal/applicationoverrides/rogue/rogue.go:272
msgid "Potion"
msgstr "Trank"
#: internal/command/descriptions.go:52
msgid "Present the version of Fenrir currently in use."
msgstr "Verwendete Fenrir-Version ansagen."
@@ -987,10 +1053,18 @@ msgstr "Wiederholte Symbole"
msgid "Repeated symbols minimum length"
msgstr "Mindestanzahl wiederholter Symbole"
#: internal/applicationoverrides/rogue/rogue.go:286
msgid "Ring"
msgstr "Ring"
#: internal/emoji/catalog.go:110
msgid "Rock on"
msgstr "Rock-Geste"
#: internal/app/application_overrides.go:321
msgid "Rogue"
msgstr "Rogue"
#: internal/emoji/catalog.go:41
msgid "Rolling laughing"
msgstr "Sich vor Lachen wälzend"
@@ -1051,6 +1125,10 @@ msgstr "Skriptdatei nicht gefunden"
msgid "Script source is not a valid file"
msgstr "Skriptquelle ist keine gültige Datei"
#: internal/applicationoverrides/rogue/rogue.go:274
msgid "Scroll"
msgstr "Schriftrolle"
#: internal/interaction/grid.go:71
msgid "Search cleared"
msgstr "Suche gelöscht"
@@ -1083,8 +1161,8 @@ msgstr "Live-Bereich aus einer oder zwei Markierungen festlegen"
msgid "Set window begin and end marks"
msgstr "Setze Fensteranfangs- und -endmarken"
#: internal/app/application_overrides.go:171
#: internal/app/application_overrides.go:315 internal/app/commands.go:84
#: internal/app/application_overrides.go:172
#: internal/app/application_overrides.go:318 internal/app/commands.go:84
msgid "Settings are busy"
msgstr "Einstellungen sind beschäftigt"
@@ -1188,6 +1266,10 @@ msgstr "Buchstabiert das aktuelle Wort"
msgid "Spider"
msgstr "Spinne"
#: internal/applicationoverrides/rogue/rogue.go:268
msgid "Stairs"
msgstr "Treppe"
#: internal/emoji/catalog.go:113
msgid "Star"
msgstr "Stern"
@@ -1196,10 +1278,18 @@ msgstr "Stern"
msgid "Start Fenrir"
msgstr "Fenrir starten"
#: internal/applicationoverrides/rogue/rogue.go:71
msgid "Status"
msgstr "Status"
#: internal/emoji/catalog.go:72
msgid "Strawberry"
msgstr "Erdbeere"
#: internal/applicationoverrides/rogue/rogue.go:143
msgid "Strength"
msgstr "Stärke"
#: internal/app/spellcheck_menu.go:45 internal/app/spellcheck_menu.go:47
msgid "Suggestions"
msgstr "Vorschläge"
@@ -1212,6 +1302,10 @@ msgstr "Sonne"
msgid "Sunflower"
msgstr "Sonnenblume"
#: internal/applicationoverrides/rogue/rogue.go:72
msgid "Surroundings"
msgstr "Umgebung"
#: internal/emoji/catalog.go:142
msgid "Sweden"
msgstr "Schweden"
@@ -1264,6 +1358,10 @@ msgstr "Oben"
msgid "Tracking mode"
msgstr "Verfolgungsmodus"
#: internal/applicationoverrides/rogue/rogue.go:266
msgid "Trap"
msgstr "Falle"
#: internal/emoji/catalog.go:60
msgid "Tree"
msgstr "Baum"
@@ -1305,10 +1403,22 @@ msgstr "Vereinigtes Königreich"
msgid "United States"
msgstr "Vereinigte Staaten"
#: internal/applicationoverrides/rogue/rogue.go:256
msgid "Unseen"
msgstr "Nicht sichtbar"
#: internal/emoji/catalog.go:94
msgid "Vampire"
msgstr "Vampir"
#: internal/applicationoverrides/rogue/rogue.go:73
msgid "Visible monsters"
msgstr "Sichtbare Monster"
#: internal/applicationoverrides/rogue/rogue.go:73
msgid "Visible objects and landmarks"
msgstr "Sichtbare Gegenstände und Orientierungspunkte"
#: internal/app/quick_settings.go:191 internal/app/synthesizer_preview.go:60
msgid "Voice test failed"
msgstr "Stimmtest fehlgeschlagen"
@@ -1330,6 +1440,14 @@ msgstr "Lautstärke und Panorama {0}"
msgid "WTF?"
msgstr "Was zum Teufel?"
#: internal/applicationoverrides/rogue/rogue.go:258
msgid "Wall"
msgstr "Wand"
#: internal/applicationoverrides/rogue/rogue.go:288
msgid "Wand or staff"
msgstr "Zauberstab oder Stab"
#: internal/app/tutorial.go:24
msgid ""
"Warning: full keyboard capture is unavailable. Unbound keys may reach the "
@@ -1338,6 +1456,10 @@ msgstr ""
"Warnung: Vollständige Tastaturerfassung nicht verfügbar. Unbelegte Tasten "
"können die aktive Anwendung erreichen."
#: internal/applicationoverrides/rogue/rogue.go:280
msgid "Weapon"
msgstr "Waffe"
#: internal/emoji/catalog.go:95
msgid "Web"
msgstr "Spinnennetz"
@@ -1614,6 +1736,10 @@ msgstr "Dollar"
msgid "dot"
msgstr "Punkt"
#: internal/applicationoverrides/rogue/rogue.go:244
msgid "east {0}"
msgstr "Osten {0}"
#: internal/command/descriptions.go:69
msgid "enables or disables automatic reading of new text as it appears"
msgstr "Automatisches Vorlesen von neuem Text ein- oder ausschalten"
@@ -1960,6 +2086,10 @@ msgstr "keine Textkonsole"
msgid "none"
msgstr "keine"
#: internal/applicationoverrides/rogue/rogue.go:235
msgid "north {0}"
msgstr "Norden {0}"
#: internal/applicationoverrides/ninjam/ninjam.go:263
msgid "not receiving"
msgstr "Empfang aus"
@@ -2159,6 +2289,10 @@ msgstr "Lächeln"
msgid "some"
msgstr "einige"
#: internal/applicationoverrides/rogue/rogue.go:238
msgid "south {0}"
msgstr "Süden {0}"
#: config/punctuation/default.toml config/punctuation/en.toml
#: config/punctuation/rhvoice-en.toml
msgid "space"
@@ -2275,6 +2409,10 @@ msgstr "unterstrichen"
msgid "unmuted"
msgstr "nicht stummgeschaltet"
#: internal/applicationoverrides/rogue/rogue.go:241
msgid "west {0}"
msgstr "Westen {0}"
#: internal/presentation/attributes.go internal/presentation/attributes.go:27
msgid "white"
msgstr "weiß"
@@ -2287,7 +2425,7 @@ msgstr "Zwinkern"
msgid "{0} added to dictionary"
msgstr "{0} zum Wörterbuch hinzugefügt"
#: internal/app/application_overrides.go:207
#: internal/app/application_overrides.go:210
msgid "{0} application override selected"
msgstr "Anwendungseinstellungen für {0} ausgewählt"
@@ -2323,6 +2461,10 @@ msgstr "{0} Raster. {1}"
msgid "{0} is already in dictionary"
msgstr "{0} ist bereits im Wörterbuch"
#: internal/applicationoverrides/rogue/rogue.go:115
msgid "{0} of {1}"
msgstr "{0} von {1}"
#: internal/applicationoverrides/ninjam/ninjam.go:313
msgid "{0} percent left"
msgstr "{0} Prozent links"
@@ -2343,10 +2485,18 @@ msgstr "{0} Registerkarte"
msgid "{0} {1}"
msgstr "{0} {1}"
#: internal/applicationoverrides/rogue/rogue.go:246
msgid "{0}, {1}"
msgstr "{0}, {1}"
#: internal/interaction/grid.go:39
msgid "{0}. row {1}, column {2}. {3} of {4}"
msgstr "{0}. Zeile {1}, Spalte {2}. {3} von {4}"
#: internal/applicationoverrides/override.go:30
msgid "{0}: {1}"
msgstr "{0}: {1}"
#: internal/app/tutorial.go:25
msgid ""
"{command_name}, Shortcuts {command_shortcuts}, Description "
+168 -18
View File
@@ -59,6 +59,10 @@ msgstr "Todos"
msgid "All 10 live regions are set"
msgstr "Las 10 regiones dinámicas están definidas"
#: internal/applicationoverrides/rogue/rogue.go:284
msgid "Amulet"
msgstr "Amuleto"
#: internal/emoji/catalog.go:23
msgid "Angry"
msgstr "Enfadado"
@@ -67,11 +71,11 @@ msgstr "Enfadado"
msgid "Apple"
msgstr "Manzana"
#: internal/app/application_overrides.go:325
#: internal/app/application_overrides.go:328
msgid "Application"
msgstr "Aplicación"
#: internal/app/application_overrides.go:324
#: internal/app/application_overrides.go:327
msgid "Applications"
msgstr "Aplicaciones"
@@ -79,6 +83,11 @@ msgstr "Aplicaciones"
msgid "Argentina"
msgstr "Argentina"
#: internal/applicationoverrides/rogue/rogue.go:144
#: internal/applicationoverrides/rogue/rogue.go:282
msgid "Armor"
msgstr "Armadura"
#: internal/config/config.go:155
msgid "Attribute format"
msgstr "Formato de atributos"
@@ -163,7 +172,7 @@ msgstr "Mariposa"
msgid "Canada"
msgstr "Canadá"
#: internal/app/application_overrides.go:326
#: internal/app/application_overrides.go:329
#: internal/preferences/settings.go:93
msgid "Cancel"
msgstr "Cancelar"
@@ -289,13 +298,13 @@ msgstr "Genial"
msgid "Could not check spelling: {0}"
msgstr "No se pudo revisar la ortografía: {0}"
#: internal/app/application_overrides.go:278
#: internal/app/application_overrides.go:83
#: internal/app/application_overrides.go:281
#: internal/app/application_overrides.go:84
msgid "Could not load application settings: {0}"
msgstr "No se pudo cargar la configuración de la aplicación: {0}"
#: internal/app/application_overrides.go:329
#: internal/app/application_overrides.go:333
#: internal/app/application_overrides.go:332
#: internal/app/application_overrides.go:336
msgid "Could not open Applications: {0}"
msgstr "No se pudo abrir Aplicaciones: {0}"
@@ -312,8 +321,8 @@ msgstr "No se pudo abrir el menú de Fenrir: {0}"
msgid "Could not open Spellcheck Menu: {0}"
msgstr "No se pudo abrir el menú de ortografía: {0}"
#: internal/app/application_overrides.go:161
#: internal/app/application_overrides.go:296
#: internal/app/application_overrides.go:162
#: internal/app/application_overrides.go:299
msgid "Could not restore application settings: {0}"
msgstr "No se pudo restaurar la configuración de la aplicación: {0}"
@@ -342,12 +351,12 @@ msgstr "Daga"
msgid "Date format"
msgstr "Formato de fecha"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "Default"
msgstr "Predeterminado"
#: internal/app/application_overrides.go:186
#: internal/app/application_overrides.go:242
#: internal/app/application_overrides.go:187
#: internal/app/application_overrides.go:245
msgid "Default settings restored"
msgstr "Configuración predeterminada restaurada"
@@ -383,10 +392,18 @@ msgstr "Perro"
msgid "Donut"
msgstr "Rosquilla"
#: internal/applicationoverrides/rogue/rogue.go:264
msgid "Door"
msgstr "Puerta"
#: internal/config/config.go:120 internal/config/config.go:127
msgid "Driver"
msgstr "Controlador"
#: internal/applicationoverrides/rogue/rogue.go:143
msgid "Dungeon level"
msgstr "Nivel de la mazmorra"
#: internal/config/config.go:142
msgid "Echo on CapsLock"
msgstr "Eco con Bloq Mayús"
@@ -438,6 +455,10 @@ msgid "Exiting tutorial mode. To enter tutorial mode again press Fenrir+F1"
msgstr ""
"Saliendo del modo de aprendizaje. Para volver a entrar, pulse Fenrir+F1"
#: internal/applicationoverrides/rogue/rogue.go:144
msgid "Experience level"
msgstr "Nivel de experiencia"
#: internal/emoji/catalog.go:30
msgid "Exploding head"
msgstr "Cabeza explotando"
@@ -487,11 +508,15 @@ msgstr "Primer portapapeles "
msgid "Flags"
msgstr "Banderas"
#: internal/applicationoverrides/rogue/rogue.go:260
msgid "Floor"
msgstr "Suelo"
#: internal/emoji/catalog.go:105
msgid "Folded hands"
msgstr "Manos juntas"
#: internal/emoji/catalog.go
#: internal/applicationoverrides/rogue/rogue.go:278 internal/emoji/catalog.go
msgid "Food"
msgstr "Comida"
@@ -515,6 +540,10 @@ msgstr "Fantasma"
msgid "Gift"
msgstr "Regalo"
#: internal/applicationoverrides/rogue/rogue.go:270
msgid "Gold"
msgstr "Oro"
#: internal/emoji/catalog.go:127
msgid "Greece"
msgstr "Grecia"
@@ -531,6 +560,10 @@ msgstr "Sonrisa con sudor"
msgid "Hamburger"
msgstr "Hamburguesa"
#: internal/applicationoverrides/rogue/rogue.go:71
msgid "Health"
msgstr "Salud"
#: internal/emoji/catalog.go:106
msgid "Heart"
msgstr "Corazón"
@@ -575,6 +608,10 @@ msgstr "Sangría"
msgid "India"
msgstr "India"
#: internal/applicationoverrides/override.go:25
msgid "Information unavailable"
msgstr "Información no disponible"
#: internal/applicationoverrides/ninjam/ninjam.go:276
msgid "Input {0}"
msgstr "Entrada {0}"
@@ -615,6 +652,10 @@ msgstr "Último portapapeles "
msgid "Latest chat message"
msgstr "Último mensaje de chat"
#: internal/applicationoverrides/rogue/rogue.go:72
msgid "Latest message"
msgstr "Último mensaje"
#: internal/emoji/catalog.go:37
msgid "Laughing"
msgstr "Riendo"
@@ -647,6 +688,7 @@ msgstr "Región dinámica {0} fuera de la pantalla"
msgid "Live region {0} set"
msgstr "Región dinámica {0} definida"
#: internal/applicationoverrides/rogue/rogue.go:62
#: internal/reader/regions.go:245
msgid "Live region {0}: {1}"
msgstr "Región dinámica {0}: {1}"
@@ -663,6 +705,10 @@ msgstr "Canal local {0}"
msgid "Mage"
msgstr "Mago"
#: internal/applicationoverrides/rogue/rogue.go:276
msgid "Magic"
msgstr "Magia"
#: internal/applicationoverrides/ninjam/ninjam.go:237
msgid "Master"
msgstr "Maestro"
@@ -683,6 +729,10 @@ msgstr "Sonido de error ortográfico"
msgid "Moon"
msgstr "Luna"
#: internal/applicationoverrides/rogue/rogue.go:105
msgid "More; press Space"
msgstr "Más; pulsa Espacio"
#: internal/command/descriptions.go:35
msgid "Move Review to the end of current line and display the content"
msgstr ""
@@ -739,7 +789,7 @@ msgstr "Náuseas"
msgid "Netherlands"
msgstr "Países Bajos"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "NetworkManager"
msgstr "NetworkManager"
@@ -747,7 +797,7 @@ msgstr "NetworkManager"
msgid "New channel"
msgstr "Nuevo canal"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "Ninjam"
msgstr "Ninjam"
@@ -789,10 +839,18 @@ msgstr ""
msgid "No word"
msgstr "Ninguna palabra"
#: internal/applicationoverrides/rogue/rogue.go:215
msgid "None visible"
msgstr "Ninguno visible"
#: internal/emoji/catalog.go:135
msgid "Norway"
msgstr "Noruega"
#: internal/applicationoverrides/rogue/rogue.go:153
msgid "Not hungry"
msgstr "Sin hambre"
#: internal/review/follow_cursor.go:26
msgid "Not in Review Mode"
msgstr "Fuera del modo de revisión"
@@ -809,6 +867,10 @@ msgstr "Aceptar"
msgid "One or two marks are needed"
msgstr "Se necesitan una o dos marcas"
#: internal/applicationoverrides/rogue/rogue.go:262
msgid "Passage"
msgstr "Pasadizo"
#: internal/emoji/catalog.go:109
msgid "Peace"
msgstr "Paz"
@@ -849,6 +911,10 @@ msgstr "Caca"
msgid "Portugal"
msgstr "Portugal"
#: internal/applicationoverrides/rogue/rogue.go:272
msgid "Potion"
msgstr "Poción"
#: internal/command/descriptions.go:52
msgid "Present the version of Fenrir currently in use."
msgstr "Anunciar la versión de Fenrir en uso."
@@ -994,10 +1060,18 @@ msgstr "Símbolos repetidos"
msgid "Repeated symbols minimum length"
msgstr "Cantidad mínima de símbolos repetidos"
#: internal/applicationoverrides/rogue/rogue.go:286
msgid "Ring"
msgstr "Anillo"
#: internal/emoji/catalog.go:110
msgid "Rock on"
msgstr "Gesto de rock"
#: internal/app/application_overrides.go:321
msgid "Rogue"
msgstr "Rogue"
#: internal/emoji/catalog.go:41
msgid "Rolling laughing"
msgstr "Revolcándose de risa"
@@ -1058,6 +1132,10 @@ msgstr "Archivo de script no encontrado"
msgid "Script source is not a valid file"
msgstr "El origen del script no es un archivo válido"
#: internal/applicationoverrides/rogue/rogue.go:274
msgid "Scroll"
msgstr "Pergamino"
#: internal/interaction/grid.go:71
msgid "Search cleared"
msgstr "Búsqueda borrada"
@@ -1090,8 +1168,8 @@ msgstr "Definir una región dinámica a partir de una o dos marcas"
msgid "Set window begin and end marks"
msgstr "Establece una marca de principio y otra para el final de la ventana"
#: internal/app/application_overrides.go:171
#: internal/app/application_overrides.go:315 internal/app/commands.go:84
#: internal/app/application_overrides.go:172
#: internal/app/application_overrides.go:318 internal/app/commands.go:84
msgid "Settings are busy"
msgstr "La configuración está ocupada"
@@ -1195,6 +1273,10 @@ msgstr "Deletrea la palabra actual"
msgid "Spider"
msgstr "Araña"
#: internal/applicationoverrides/rogue/rogue.go:268
msgid "Stairs"
msgstr "Escaleras"
#: internal/emoji/catalog.go:113
msgid "Star"
msgstr "Estrella"
@@ -1203,10 +1285,18 @@ msgstr "Estrella"
msgid "Start Fenrir"
msgstr "Iniciando fenrir"
#: internal/applicationoverrides/rogue/rogue.go:71
msgid "Status"
msgstr "Estado"
#: internal/emoji/catalog.go:72
msgid "Strawberry"
msgstr "Fresa"
#: internal/applicationoverrides/rogue/rogue.go:143
msgid "Strength"
msgstr "Fuerza"
#: internal/app/spellcheck_menu.go:45 internal/app/spellcheck_menu.go:47
msgid "Suggestions"
msgstr "Sugerencias"
@@ -1219,6 +1309,10 @@ msgstr "Sol"
msgid "Sunflower"
msgstr "Girasol"
#: internal/applicationoverrides/rogue/rogue.go:72
msgid "Surroundings"
msgstr "Alrededores"
#: internal/emoji/catalog.go:142
msgid "Sweden"
msgstr "Suecia"
@@ -1271,6 +1365,10 @@ msgstr "Fin"
msgid "Tracking mode"
msgstr "Modo de seguimiento"
#: internal/applicationoverrides/rogue/rogue.go:266
msgid "Trap"
msgstr "Trampa"
#: internal/emoji/catalog.go:60
msgid "Tree"
msgstr "Árbol"
@@ -1311,10 +1409,22 @@ msgstr "Reino Unido"
msgid "United States"
msgstr "Estados Unidos"
#: internal/applicationoverrides/rogue/rogue.go:256
msgid "Unseen"
msgstr "No visible"
#: internal/emoji/catalog.go:94
msgid "Vampire"
msgstr "Vampiro"
#: internal/applicationoverrides/rogue/rogue.go:73
msgid "Visible monsters"
msgstr "Monstruos visibles"
#: internal/applicationoverrides/rogue/rogue.go:73
msgid "Visible objects and landmarks"
msgstr "Objetos y puntos de referencia visibles"
#: internal/app/quick_settings.go:191 internal/app/synthesizer_preview.go:60
msgid "Voice test failed"
msgstr "La prueba de voz falló"
@@ -1335,6 +1445,14 @@ msgstr "Volumen y panorámica {0}"
msgid "WTF?"
msgstr "¿Pero qué demonios?"
#: internal/applicationoverrides/rogue/rogue.go:258
msgid "Wall"
msgstr "Pared"
#: internal/applicationoverrides/rogue/rogue.go:288
msgid "Wand or staff"
msgstr "Varita o bastón"
#: internal/app/tutorial.go:24
msgid ""
"Warning: full keyboard capture is unavailable. Unbound keys may reach the "
@@ -1343,6 +1461,10 @@ msgstr ""
"Advertencia: la captura completa del teclado no está disponible. Las teclas "
"sin asignar pueden llegar a la aplicación activa."
#: internal/applicationoverrides/rogue/rogue.go:280
msgid "Weapon"
msgstr "Arma"
#: internal/emoji/catalog.go:95
msgid "Web"
msgstr "Telaraña"
@@ -1619,6 +1741,10 @@ msgstr "dólar"
msgid "dot"
msgstr "punto"
#: internal/applicationoverrides/rogue/rogue.go:244
msgid "east {0}"
msgstr "este {0}"
#: internal/command/descriptions.go:69
msgid "enables or disables automatic reading of new text as it appears"
msgstr ""
@@ -1967,6 +2093,10 @@ msgstr "sin consola de texto"
msgid "none"
msgstr "ninguno"
#: internal/applicationoverrides/rogue/rogue.go:235
msgid "north {0}"
msgstr "norte {0}"
#: internal/applicationoverrides/ninjam/ninjam.go:263
msgid "not receiving"
msgstr "sin recibir"
@@ -2165,6 +2295,10 @@ msgstr "sonrisa"
msgid "some"
msgstr "algunos"
#: internal/applicationoverrides/rogue/rogue.go:238
msgid "south {0}"
msgstr "sur {0}"
#: config/punctuation/default.toml config/punctuation/en.toml
#: config/punctuation/rhvoice-en.toml
msgid "space"
@@ -2281,6 +2415,10 @@ msgstr "subrayado"
msgid "unmuted"
msgstr "no silenciado"
#: internal/applicationoverrides/rogue/rogue.go:241
msgid "west {0}"
msgstr "oeste {0}"
#: internal/presentation/attributes.go internal/presentation/attributes.go:27
msgid "white"
msgstr "blanco"
@@ -2293,7 +2431,7 @@ msgstr "guiño"
msgid "{0} added to dictionary"
msgstr "{0} añadido al diccionario"
#: internal/app/application_overrides.go:207
#: internal/app/application_overrides.go:210
msgid "{0} application override selected"
msgstr "Ajustes de aplicación seleccionados para {0}"
@@ -2329,6 +2467,10 @@ msgstr "{0} cuadrícula. {1}"
msgid "{0} is already in dictionary"
msgstr "{0} ya está en el diccionario"
#: internal/applicationoverrides/rogue/rogue.go:115
msgid "{0} of {1}"
msgstr "{0} de {1}"
#: internal/applicationoverrides/ninjam/ninjam.go:313
msgid "{0} percent left"
msgstr "{0} por ciento a la izquierda"
@@ -2349,10 +2491,18 @@ msgstr "{0} pestaña"
msgid "{0} {1}"
msgstr "{0} {1}"
#: internal/applicationoverrides/rogue/rogue.go:246
msgid "{0}, {1}"
msgstr "{0}, {1}"
#: internal/interaction/grid.go:39
msgid "{0}. row {1}, column {2}. {3} of {4}"
msgstr "{0}. fila {1}, columna {2}. {3} de {4}"
#: internal/applicationoverrides/override.go:30
msgid "{0}: {1}"
msgstr "{0}: {1}"
#: internal/app/tutorial.go:25
msgid ""
"{command_name}, Shortcuts {command_shortcuts}, Description "
+162 -14
View File
@@ -49,6 +49,10 @@ msgstr ""
msgid "All 10 live regions are set"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:284
msgid "Amulet"
msgstr ""
#: internal/emoji/catalog.go:23
msgid "Angry"
msgstr ""
@@ -57,11 +61,11 @@ msgstr ""
msgid "Apple"
msgstr ""
#: internal/app/application_overrides.go:325
#: internal/app/application_overrides.go:328
msgid "Application"
msgstr ""
#: internal/app/application_overrides.go:324
#: internal/app/application_overrides.go:327
msgid "Applications"
msgstr ""
@@ -69,6 +73,10 @@ msgstr ""
msgid "Argentina"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:144 internal/applicationoverrides/rogue/rogue.go:282
msgid "Armor"
msgstr ""
#: internal/config/config.go:155
msgid "Attribute format"
msgstr ""
@@ -153,7 +161,7 @@ msgstr ""
msgid "Canada"
msgstr ""
#: internal/app/application_overrides.go:326 internal/preferences/settings.go:93
#: internal/app/application_overrides.go:329 internal/preferences/settings.go:93
msgid "Cancel"
msgstr ""
@@ -277,11 +285,11 @@ msgstr ""
msgid "Could not check spelling: {0}"
msgstr ""
#: internal/app/application_overrides.go:278 internal/app/application_overrides.go:83
#: internal/app/application_overrides.go:281 internal/app/application_overrides.go:84
msgid "Could not load application settings: {0}"
msgstr ""
#: internal/app/application_overrides.go:329 internal/app/application_overrides.go:333
#: internal/app/application_overrides.go:332 internal/app/application_overrides.go:336
msgid "Could not open Applications: {0}"
msgstr ""
@@ -297,7 +305,7 @@ msgstr ""
msgid "Could not open Spellcheck Menu: {0}"
msgstr ""
#: internal/app/application_overrides.go:161 internal/app/application_overrides.go:296
#: internal/app/application_overrides.go:162 internal/app/application_overrides.go:299
msgid "Could not restore application settings: {0}"
msgstr ""
@@ -325,11 +333,11 @@ msgstr ""
msgid "Date format"
msgstr ""
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "Default"
msgstr ""
#: internal/app/application_overrides.go:186 internal/app/application_overrides.go:242
#: internal/app/application_overrides.go:187 internal/app/application_overrides.go:245
msgid "Default settings restored"
msgstr ""
@@ -365,10 +373,18 @@ msgstr ""
msgid "Donut"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:264
msgid "Door"
msgstr ""
#: internal/config/config.go:120 internal/config/config.go:127
msgid "Driver"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:143
msgid "Dungeon level"
msgstr ""
#: internal/config/config.go:142
msgid "Echo on CapsLock"
msgstr ""
@@ -409,6 +425,10 @@ msgstr ""
msgid "Exiting tutorial mode. To enter tutorial mode again press Fenrir+F1"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:144
msgid "Experience level"
msgstr ""
#: internal/emoji/catalog.go:30
msgid "Exploding head"
msgstr ""
@@ -457,11 +477,15 @@ msgstr ""
msgid "Flags"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:260
msgid "Floor"
msgstr ""
#: internal/emoji/catalog.go:105
msgid "Folded hands"
msgstr ""
#: internal/emoji/catalog.go
#: internal/applicationoverrides/rogue/rogue.go:278 internal/emoji/catalog.go
msgid "Food"
msgstr ""
@@ -485,6 +509,10 @@ msgstr ""
msgid "Gift"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:270
msgid "Gold"
msgstr ""
#: internal/emoji/catalog.go:127
msgid "Greece"
msgstr ""
@@ -501,6 +529,10 @@ msgstr ""
msgid "Hamburger"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:71
msgid "Health"
msgstr ""
#: internal/emoji/catalog.go:106
msgid "Heart"
msgstr ""
@@ -545,6 +577,10 @@ msgstr ""
msgid "India"
msgstr ""
#: internal/applicationoverrides/override.go:25
msgid "Information unavailable"
msgstr ""
#: internal/applicationoverrides/ninjam/ninjam.go:276
msgid "Input {0}"
msgstr ""
@@ -585,6 +621,10 @@ msgstr ""
msgid "Latest chat message"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:72
msgid "Latest message"
msgstr ""
#: internal/emoji/catalog.go:37
msgid "Laughing"
msgstr ""
@@ -617,7 +657,7 @@ msgstr ""
msgid "Live region {0} set"
msgstr ""
#: internal/reader/regions.go:245
#: internal/applicationoverrides/rogue/rogue.go:62 internal/reader/regions.go:245
msgid "Live region {0}: {1}"
msgstr ""
@@ -633,6 +673,10 @@ msgstr ""
msgid "Mage"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:276
msgid "Magic"
msgstr ""
#: internal/applicationoverrides/ninjam/ninjam.go:237
msgid "Master"
msgstr ""
@@ -653,6 +697,10 @@ msgstr ""
msgid "Moon"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:105
msgid "More; press Space"
msgstr ""
#: internal/command/descriptions.go:35
msgid "Move Review to the end of current line and display the content"
msgstr ""
@@ -701,7 +749,7 @@ msgstr ""
msgid "Netherlands"
msgstr ""
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "NetworkManager"
msgstr ""
@@ -709,7 +757,7 @@ msgstr ""
msgid "New channel"
msgstr ""
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "Ninjam"
msgstr ""
@@ -745,10 +793,18 @@ msgstr ""
msgid "No word"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:215
msgid "None visible"
msgstr ""
#: internal/emoji/catalog.go:135
msgid "Norway"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:153
msgid "Not hungry"
msgstr ""
#: internal/review/follow_cursor.go:26
msgid "Not in Review Mode"
msgstr ""
@@ -765,6 +821,10 @@ msgstr ""
msgid "One or two marks are needed"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:262
msgid "Passage"
msgstr ""
#: internal/emoji/catalog.go:109
msgid "Peace"
msgstr ""
@@ -805,6 +865,10 @@ msgstr ""
msgid "Portugal"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:272
msgid "Potion"
msgstr ""
#: internal/command/descriptions.go:52
msgid "Present the version of Fenrir currently in use."
msgstr ""
@@ -949,10 +1013,18 @@ msgstr ""
msgid "Repeated symbols minimum length"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:286
msgid "Ring"
msgstr ""
#: internal/emoji/catalog.go:110
msgid "Rock on"
msgstr ""
#: internal/app/application_overrides.go:321
msgid "Rogue"
msgstr ""
#: internal/emoji/catalog.go:41
msgid "Rolling laughing"
msgstr ""
@@ -1013,6 +1085,10 @@ msgstr ""
msgid "Script source is not a valid file"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:274
msgid "Scroll"
msgstr ""
#: internal/interaction/grid.go:71
msgid "Search cleared"
msgstr ""
@@ -1045,7 +1121,7 @@ msgstr ""
msgid "Set window begin and end marks"
msgstr ""
#: internal/app/application_overrides.go:171 internal/app/application_overrides.go:315 internal/app/commands.go:84
#: internal/app/application_overrides.go:172 internal/app/application_overrides.go:318 internal/app/commands.go:84
msgid "Settings are busy"
msgstr ""
@@ -1149,6 +1225,10 @@ msgstr ""
msgid "Spider"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:268
msgid "Stairs"
msgstr ""
#: internal/emoji/catalog.go:113
msgid "Star"
msgstr ""
@@ -1157,10 +1237,18 @@ msgstr ""
msgid "Start Fenrir"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:71
msgid "Status"
msgstr ""
#: internal/emoji/catalog.go:72
msgid "Strawberry"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:143
msgid "Strength"
msgstr ""
#: internal/app/spellcheck_menu.go:45 internal/app/spellcheck_menu.go:47
msgid "Suggestions"
msgstr ""
@@ -1173,6 +1261,10 @@ msgstr ""
msgid "Sunflower"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:72
msgid "Surroundings"
msgstr ""
#: internal/emoji/catalog.go:142
msgid "Sweden"
msgstr ""
@@ -1225,6 +1317,10 @@ msgstr ""
msgid "Tracking mode"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:266
msgid "Trap"
msgstr ""
#: internal/emoji/catalog.go:60
msgid "Tree"
msgstr ""
@@ -1261,10 +1357,22 @@ msgstr ""
msgid "United States"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:256
msgid "Unseen"
msgstr ""
#: internal/emoji/catalog.go:94
msgid "Vampire"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:73
msgid "Visible monsters"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:73
msgid "Visible objects and landmarks"
msgstr ""
#: internal/app/quick_settings.go:191 internal/app/synthesizer_preview.go:60
msgid "Voice test failed"
msgstr ""
@@ -1285,10 +1393,22 @@ msgstr ""
msgid "WTF?"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:258
msgid "Wall"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:288
msgid "Wand or staff"
msgstr ""
#: internal/app/tutorial.go:24
msgid "Warning: full keyboard capture is unavailable. Unbound keys may reach the active application."
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:280
msgid "Weapon"
msgstr ""
#: internal/emoji/catalog.go:95
msgid "Web"
msgstr ""
@@ -1545,6 +1665,10 @@ msgstr ""
msgid "dot"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:244
msgid "east {0}"
msgstr ""
#: internal/command/descriptions.go:69
msgid "enables or disables automatic reading of new text as it appears"
msgstr ""
@@ -1877,6 +2001,10 @@ msgstr ""
msgid "none"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:235
msgid "north {0}"
msgstr ""
#: internal/applicationoverrides/ninjam/ninjam.go:263
msgid "not receiving"
msgstr ""
@@ -2057,6 +2185,10 @@ msgstr ""
msgid "some"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:238
msgid "south {0}"
msgstr ""
#: config/punctuation/default.toml config/punctuation/en.toml config/punctuation/rhvoice-en.toml
msgid "space"
msgstr ""
@@ -2169,6 +2301,10 @@ msgstr ""
msgid "unmuted"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:241
msgid "west {0}"
msgstr ""
#: internal/presentation/attributes.go internal/presentation/attributes.go:27
msgid "white"
msgstr ""
@@ -2181,7 +2317,7 @@ msgstr ""
msgid "{0} added to dictionary"
msgstr ""
#: internal/app/application_overrides.go:207
#: internal/app/application_overrides.go:210
msgid "{0} application override selected"
msgstr ""
@@ -2217,6 +2353,10 @@ msgstr ""
msgid "{0} is already in dictionary"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:115
msgid "{0} of {1}"
msgstr ""
#: internal/applicationoverrides/ninjam/ninjam.go:313
msgid "{0} percent left"
msgstr ""
@@ -2237,10 +2377,18 @@ msgstr ""
msgid "{0} {1}"
msgstr ""
#: internal/applicationoverrides/rogue/rogue.go:246
msgid "{0}, {1}"
msgstr ""
#: internal/interaction/grid.go:39
msgid "{0}. row {1}, column {2}. {3} of {4}"
msgstr ""
#: internal/applicationoverrides/override.go:30
msgid "{0}: {1}"
msgstr ""
#: internal/app/tutorial.go:25
msgid "{command_name}, Shortcuts {command_shortcuts}, Description {command_description}"
msgstr ""
+168 -18
View File
@@ -60,6 +60,10 @@ msgstr "Wszystkie"
msgid "All 10 live regions are set"
msgstr "Ustawiono wszystkie 10 obszarów dynamicznych"
#: internal/applicationoverrides/rogue/rogue.go:284
msgid "Amulet"
msgstr "Amulet"
#: internal/emoji/catalog.go:23
msgid "Angry"
msgstr "Złość"
@@ -68,11 +72,11 @@ msgstr "Złość"
msgid "Apple"
msgstr "Jabłko"
#: internal/app/application_overrides.go:325
#: internal/app/application_overrides.go:328
msgid "Application"
msgstr "Aplikacja"
#: internal/app/application_overrides.go:324
#: internal/app/application_overrides.go:327
msgid "Applications"
msgstr "Aplikacje"
@@ -80,6 +84,11 @@ msgstr "Aplikacje"
msgid "Argentina"
msgstr "Argentyna"
#: internal/applicationoverrides/rogue/rogue.go:144
#: internal/applicationoverrides/rogue/rogue.go:282
msgid "Armor"
msgstr "Pancerz"
#: internal/config/config.go:155
msgid "Attribute format"
msgstr "Format atrybutów"
@@ -164,7 +173,7 @@ msgstr "Motyl"
msgid "Canada"
msgstr "Kanada"
#: internal/app/application_overrides.go:326
#: internal/app/application_overrides.go:329
#: internal/preferences/settings.go:93
msgid "Cancel"
msgstr "Anuluj"
@@ -290,13 +299,13 @@ msgstr "Wyluzowanie"
msgid "Could not check spelling: {0}"
msgstr "Nie można sprawdzić pisowni: {0}"
#: internal/app/application_overrides.go:278
#: internal/app/application_overrides.go:83
#: internal/app/application_overrides.go:281
#: internal/app/application_overrides.go:84
msgid "Could not load application settings: {0}"
msgstr "Nie można wczytać ustawień aplikacji: {0}"
#: internal/app/application_overrides.go:329
#: internal/app/application_overrides.go:333
#: internal/app/application_overrides.go:332
#: internal/app/application_overrides.go:336
msgid "Could not open Applications: {0}"
msgstr "Nie można otworzyć menu aplikacji: {0}"
@@ -313,8 +322,8 @@ msgstr "Nie można otworzyć menu Fenrira: {0}"
msgid "Could not open Spellcheck Menu: {0}"
msgstr "Nie można otworzyć menu sprawdzania pisowni: {0}"
#: internal/app/application_overrides.go:161
#: internal/app/application_overrides.go:296
#: internal/app/application_overrides.go:162
#: internal/app/application_overrides.go:299
msgid "Could not restore application settings: {0}"
msgstr "Nie można przywrócić ustawień aplikacji: {0}"
@@ -343,12 +352,12 @@ msgstr "Sztylet"
msgid "Date format"
msgstr "Format daty"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "Default"
msgstr "Domyślne"
#: internal/app/application_overrides.go:186
#: internal/app/application_overrides.go:242
#: internal/app/application_overrides.go:187
#: internal/app/application_overrides.go:245
msgid "Default settings restored"
msgstr "Przywrócono ustawienia domyślne"
@@ -384,10 +393,18 @@ msgstr "Pies"
msgid "Donut"
msgstr "Pączek"
#: internal/applicationoverrides/rogue/rogue.go:264
msgid "Door"
msgstr "Drzwi"
#: internal/config/config.go:120 internal/config/config.go:127
msgid "Driver"
msgstr "Sterownik"
#: internal/applicationoverrides/rogue/rogue.go:143
msgid "Dungeon level"
msgstr "Poziom lochu"
#: internal/config/config.go:142
msgid "Echo on CapsLock"
msgstr "Echo przy CapsLock"
@@ -438,6 +455,10 @@ msgstr "Wyjście z trybu przeglądu"
msgid "Exiting tutorial mode. To enter tutorial mode again press Fenrir+F1"
msgstr "Wyjście z trybu nauki. Aby ponownie go włączyć, naciśnij Fenrir+F1"
#: internal/applicationoverrides/rogue/rogue.go:144
msgid "Experience level"
msgstr "Poziom doświadczenia"
#: internal/emoji/catalog.go:30
msgid "Exploding head"
msgstr "Eksplodująca głowa"
@@ -487,11 +508,15 @@ msgstr "Pierwszy showek "
msgid "Flags"
msgstr "Flagi"
#: internal/applicationoverrides/rogue/rogue.go:260
msgid "Floor"
msgstr "Podłoga"
#: internal/emoji/catalog.go:105
msgid "Folded hands"
msgstr "Złożone dłonie"
#: internal/emoji/catalog.go
#: internal/applicationoverrides/rogue/rogue.go:278 internal/emoji/catalog.go
msgid "Food"
msgstr "Jedzenie"
@@ -515,6 +540,10 @@ msgstr "Duch"
msgid "Gift"
msgstr "Prezent"
#: internal/applicationoverrides/rogue/rogue.go:270
msgid "Gold"
msgstr "Złoto"
#: internal/emoji/catalog.go:127
msgid "Greece"
msgstr "Grecja"
@@ -531,6 +560,10 @@ msgstr "Uśmiech z kroplą potu"
msgid "Hamburger"
msgstr "Hamburger"
#: internal/applicationoverrides/rogue/rogue.go:71
msgid "Health"
msgstr "Zdrowie"
#: internal/emoji/catalog.go:106
msgid "Heart"
msgstr "Serce"
@@ -575,6 +608,10 @@ msgstr "Wcięcia"
msgid "India"
msgstr "Indie"
#: internal/applicationoverrides/override.go:25
msgid "Information unavailable"
msgstr "Informacje niedostępne"
#: internal/applicationoverrides/ninjam/ninjam.go:276
msgid "Input {0}"
msgstr "Wejście {0}"
@@ -615,6 +652,10 @@ msgstr "Ostatni showek "
msgid "Latest chat message"
msgstr "Ostatnia wiadomość czatu"
#: internal/applicationoverrides/rogue/rogue.go:72
msgid "Latest message"
msgstr "Ostatni komunikat"
#: internal/emoji/catalog.go:37
msgid "Laughing"
msgstr "Śmiech"
@@ -647,6 +688,7 @@ msgstr "Obszar dynamiczny {0} poza ekranem"
msgid "Live region {0} set"
msgstr "Ustawiono obszar dynamiczny {0}"
#: internal/applicationoverrides/rogue/rogue.go:62
#: internal/reader/regions.go:245
msgid "Live region {0}: {1}"
msgstr "Obszar dynamiczny {0}: {1}"
@@ -663,6 +705,10 @@ msgstr "Kanał lokalny {0}"
msgid "Mage"
msgstr "Mag"
#: internal/applicationoverrides/rogue/rogue.go:276
msgid "Magic"
msgstr "Magia"
#: internal/applicationoverrides/ninjam/ninjam.go:237
msgid "Master"
msgstr "Główne wyjście"
@@ -683,6 +729,10 @@ msgstr "Dźwięk błędu pisowni"
msgid "Moon"
msgstr "Księżyc"
#: internal/applicationoverrides/rogue/rogue.go:105
msgid "More; press Space"
msgstr "Więcej; naciśnij spację"
#: internal/command/descriptions.go:35
msgid "Move Review to the end of current line and display the content"
msgstr ""
@@ -735,7 +785,7 @@ msgstr "Nudności"
msgid "Netherlands"
msgstr "Holandia"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "NetworkManager"
msgstr "NetworkManager"
@@ -743,7 +793,7 @@ msgstr "NetworkManager"
msgid "New channel"
msgstr "Nowy kanał"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "Ninjam"
msgstr "Ninjam"
@@ -784,10 +834,18 @@ msgstr "Brak tekstu w schowku lub dostępnego ekranu"
msgid "No word"
msgstr "Brak słowa"
#: internal/applicationoverrides/rogue/rogue.go:215
msgid "None visible"
msgstr "Brak widocznych"
#: internal/emoji/catalog.go:135
msgid "Norway"
msgstr "Norwegia"
#: internal/applicationoverrides/rogue/rogue.go:153
msgid "Not hungry"
msgstr "Brak głodu"
#: internal/review/follow_cursor.go:26
msgid "Not in Review Mode"
msgstr "Poza trybem przeglądu"
@@ -804,6 +862,10 @@ msgstr "OK"
msgid "One or two marks are needed"
msgstr "Potrzebny jest jeden lub dwa znaczniki"
#: internal/applicationoverrides/rogue/rogue.go:262
msgid "Passage"
msgstr "Korytarz"
#: internal/emoji/catalog.go:109
msgid "Peace"
msgstr "Pokój"
@@ -844,6 +906,10 @@ msgstr "Kupa"
msgid "Portugal"
msgstr "Portugalia"
#: internal/applicationoverrides/rogue/rogue.go:272
msgid "Potion"
msgstr "Mikstura"
#: internal/command/descriptions.go:52
msgid "Present the version of Fenrir currently in use."
msgstr "Odczytaj używaną wersję Fenrira."
@@ -989,10 +1055,18 @@ msgstr "Powtarzane symbole"
msgid "Repeated symbols minimum length"
msgstr "Minimalna liczba powtarzanych symboli"
#: internal/applicationoverrides/rogue/rogue.go:286
msgid "Ring"
msgstr "Pierścień"
#: internal/emoji/catalog.go:110
msgid "Rock on"
msgstr "Gest rockowy"
#: internal/app/application_overrides.go:321
msgid "Rogue"
msgstr "Rogue"
#: internal/emoji/catalog.go:41
msgid "Rolling laughing"
msgstr "Tarzanie się ze śmiechu"
@@ -1053,6 +1127,10 @@ msgstr "Nie znaleziono pliku skryptu"
msgid "Script source is not a valid file"
msgstr "Źródło skryptu nie jest prawidłowym plikiem"
#: internal/applicationoverrides/rogue/rogue.go:274
msgid "Scroll"
msgstr "Zwój"
#: internal/interaction/grid.go:71
msgid "Search cleared"
msgstr "Wyszukiwanie wyczyszczone"
@@ -1085,8 +1163,8 @@ msgstr "Ustaw obszar dynamiczny za pomocą jednego lub dwóch znaczników"
msgid "Set window begin and end marks"
msgstr "Ustaw początek i koniec okna."
#: internal/app/application_overrides.go:171
#: internal/app/application_overrides.go:315 internal/app/commands.go:84
#: internal/app/application_overrides.go:172
#: internal/app/application_overrides.go:318 internal/app/commands.go:84
msgid "Settings are busy"
msgstr "Ustawienia są zajęte"
@@ -1190,6 +1268,10 @@ msgstr "Literuje bieżące słowo"
msgid "Spider"
msgstr "Pająk"
#: internal/applicationoverrides/rogue/rogue.go:268
msgid "Stairs"
msgstr "Schody"
#: internal/emoji/catalog.go:113
msgid "Star"
msgstr "Gwiazda"
@@ -1198,10 +1280,18 @@ msgstr "Gwiazda"
msgid "Start Fenrir"
msgstr "Uruchom Fenrir"
#: internal/applicationoverrides/rogue/rogue.go:71
msgid "Status"
msgstr "Stan"
#: internal/emoji/catalog.go:72
msgid "Strawberry"
msgstr "Truskawka"
#: internal/applicationoverrides/rogue/rogue.go:143
msgid "Strength"
msgstr "Siła"
#: internal/app/spellcheck_menu.go:45 internal/app/spellcheck_menu.go:47
msgid "Suggestions"
msgstr "Sugestie"
@@ -1214,6 +1304,10 @@ msgstr "Słońce"
msgid "Sunflower"
msgstr "Słonecznik"
#: internal/applicationoverrides/rogue/rogue.go:72
msgid "Surroundings"
msgstr "Otoczenie"
#: internal/emoji/catalog.go:142
msgid "Sweden"
msgstr "Szwecja"
@@ -1266,6 +1360,10 @@ msgstr "Góra."
msgid "Tracking mode"
msgstr "Tryb śledzenia"
#: internal/applicationoverrides/rogue/rogue.go:266
msgid "Trap"
msgstr "Pułapka"
#: internal/emoji/catalog.go:60
msgid "Tree"
msgstr "Drzewo"
@@ -1307,10 +1405,22 @@ msgstr "Wielka Brytania"
msgid "United States"
msgstr "Stany Zjednoczone"
#: internal/applicationoverrides/rogue/rogue.go:256
msgid "Unseen"
msgstr "Niewidoczne"
#: internal/emoji/catalog.go:94
msgid "Vampire"
msgstr "Wampir"
#: internal/applicationoverrides/rogue/rogue.go:73
msgid "Visible monsters"
msgstr "Widoczne potwory"
#: internal/applicationoverrides/rogue/rogue.go:73
msgid "Visible objects and landmarks"
msgstr "Widoczne przedmioty i punkty orientacyjne"
#: internal/app/quick_settings.go:191 internal/app/synthesizer_preview.go:60
msgid "Voice test failed"
msgstr "Test głosu nie powiódł się"
@@ -1331,6 +1441,14 @@ msgstr "Głośność i panorama {0}"
msgid "WTF?"
msgstr "Co do diabła?"
#: internal/applicationoverrides/rogue/rogue.go:258
msgid "Wall"
msgstr "Ściana"
#: internal/applicationoverrides/rogue/rogue.go:288
msgid "Wand or staff"
msgstr "Różdżka lub kostur"
#: internal/app/tutorial.go:24
msgid ""
"Warning: full keyboard capture is unavailable. Unbound keys may reach the "
@@ -1339,6 +1457,10 @@ msgstr ""
"Uwaga: pełne przechwytywanie klawiatury jest niedostępne. Nieprzypisane "
"klawisze mogą trafić do aktywnej aplikacji."
#: internal/applicationoverrides/rogue/rogue.go:280
msgid "Weapon"
msgstr "Broń"
#: internal/emoji/catalog.go:95
msgid "Web"
msgstr "Pajęczyna"
@@ -1615,6 +1737,10 @@ msgstr "dolar"
msgid "dot"
msgstr "kropka"
#: internal/applicationoverrides/rogue/rogue.go:244
msgid "east {0}"
msgstr "wschód {0}"
#: internal/command/descriptions.go:69
msgid "enables or disables automatic reading of new text as it appears"
msgstr "Włącza lub wyłącza informowanie o dynamicznych zmianach treści."
@@ -1960,6 +2086,10 @@ msgstr "brak konsoli tekstowej"
msgid "none"
msgstr "brak"
#: internal/applicationoverrides/rogue/rogue.go:235
msgid "north {0}"
msgstr "północ {0}"
#: internal/applicationoverrides/ninjam/ninjam.go:263
msgid "not receiving"
msgstr "odbiór wyłączony"
@@ -2157,6 +2287,10 @@ msgstr "uśmiech"
msgid "some"
msgstr "niektóre"
#: internal/applicationoverrides/rogue/rogue.go:238
msgid "south {0}"
msgstr "południe {0}"
#: config/punctuation/default.toml config/punctuation/en.toml
#: config/punctuation/rhvoice-en.toml
msgid "space"
@@ -2273,6 +2407,10 @@ msgstr "podkreślenie"
msgid "unmuted"
msgstr "niewyciszony"
#: internal/applicationoverrides/rogue/rogue.go:241
msgid "west {0}"
msgstr "zachód {0}"
#: internal/presentation/attributes.go internal/presentation/attributes.go:27
msgid "white"
msgstr "Biały"
@@ -2285,7 +2423,7 @@ msgstr "mrugnięcie"
msgid "{0} added to dictionary"
msgstr "Dodano {0} do słownika"
#: internal/app/application_overrides.go:207
#: internal/app/application_overrides.go:210
msgid "{0} application override selected"
msgstr "Wybrano ustawienia aplikacji {0}"
@@ -2321,6 +2459,10 @@ msgstr "{0} siatka. {1}"
msgid "{0} is already in dictionary"
msgstr "{0} jest już w słowniku"
#: internal/applicationoverrides/rogue/rogue.go:115
msgid "{0} of {1}"
msgstr "{0} z {1}"
#: internal/applicationoverrides/ninjam/ninjam.go:313
msgid "{0} percent left"
msgstr "{0} procent w lewo"
@@ -2341,10 +2483,18 @@ msgstr "{0} zakładka"
msgid "{0} {1}"
msgstr "{0} {1}"
#: internal/applicationoverrides/rogue/rogue.go:246
msgid "{0}, {1}"
msgstr "{0}, {1}"
#: internal/interaction/grid.go:39
msgid "{0}. row {1}, column {2}. {3} of {4}"
msgstr "{0}. wiersz {1}, kolumna {2}. {3} z {4}"
#: internal/applicationoverrides/override.go:30
msgid "{0}: {1}"
msgstr "{0}: {1}"
#: internal/app/tutorial.go:25
msgid ""
"{command_name}, Shortcuts {command_shortcuts}, Description "
+168 -18
View File
@@ -58,6 +58,10 @@ msgstr "Todos"
msgid "All 10 live regions are set"
msgstr "Todas as 10 regiões dinâmicas estão definidas"
#: internal/applicationoverrides/rogue/rogue.go:284
msgid "Amulet"
msgstr "Amuleto"
#: internal/emoji/catalog.go:23
msgid "Angry"
msgstr "Zangado"
@@ -66,11 +70,11 @@ msgstr "Zangado"
msgid "Apple"
msgstr "Maçã"
#: internal/app/application_overrides.go:325
#: internal/app/application_overrides.go:328
msgid "Application"
msgstr "Aplicativo"
#: internal/app/application_overrides.go:324
#: internal/app/application_overrides.go:327
msgid "Applications"
msgstr "Aplicativos"
@@ -78,6 +82,11 @@ msgstr "Aplicativos"
msgid "Argentina"
msgstr "Argentina"
#: internal/applicationoverrides/rogue/rogue.go:144
#: internal/applicationoverrides/rogue/rogue.go:282
msgid "Armor"
msgstr "Armadura"
#: internal/config/config.go:155
msgid "Attribute format"
msgstr "Formato dos atributos"
@@ -162,7 +171,7 @@ msgstr "Borboleta"
msgid "Canada"
msgstr "Canadá"
#: internal/app/application_overrides.go:326
#: internal/app/application_overrides.go:329
#: internal/preferences/settings.go:93
msgid "Cancel"
msgstr "Cancelar"
@@ -288,13 +297,13 @@ msgstr "Legal"
msgid "Could not check spelling: {0}"
msgstr "Não foi possível verificar a ortografia: {0}"
#: internal/app/application_overrides.go:278
#: internal/app/application_overrides.go:83
#: internal/app/application_overrides.go:281
#: internal/app/application_overrides.go:84
msgid "Could not load application settings: {0}"
msgstr "Não foi possível carregar as configurações do aplicativo: {0}"
#: internal/app/application_overrides.go:329
#: internal/app/application_overrides.go:333
#: internal/app/application_overrides.go:332
#: internal/app/application_overrides.go:336
msgid "Could not open Applications: {0}"
msgstr "Não foi possível abrir Aplicativos: {0}"
@@ -311,8 +320,8 @@ msgstr "Não foi possível abrir o menu do Fenrir: {0}"
msgid "Could not open Spellcheck Menu: {0}"
msgstr "Não foi possível abrir o menu de ortografia: {0}"
#: internal/app/application_overrides.go:161
#: internal/app/application_overrides.go:296
#: internal/app/application_overrides.go:162
#: internal/app/application_overrides.go:299
msgid "Could not restore application settings: {0}"
msgstr "Não foi possível restaurar as configurações do aplicativo: {0}"
@@ -341,12 +350,12 @@ msgstr "Adaga"
msgid "Date format"
msgstr "Formato da data"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "Default"
msgstr "Padrão"
#: internal/app/application_overrides.go:186
#: internal/app/application_overrides.go:242
#: internal/app/application_overrides.go:187
#: internal/app/application_overrides.go:245
msgid "Default settings restored"
msgstr "Configurações padrão restauradas"
@@ -382,10 +391,18 @@ msgstr "Cachorro"
msgid "Donut"
msgstr "Rosquinha"
#: internal/applicationoverrides/rogue/rogue.go:264
msgid "Door"
msgstr "Porta"
#: internal/config/config.go:120 internal/config/config.go:127
msgid "Driver"
msgstr "Controlador"
#: internal/applicationoverrides/rogue/rogue.go:143
msgid "Dungeon level"
msgstr "Nível da masmorra"
#: internal/config/config.go:142
msgid "Echo on CapsLock"
msgstr "Eco com CapsLock"
@@ -437,6 +454,10 @@ msgid "Exiting tutorial mode. To enter tutorial mode again press Fenrir+F1"
msgstr ""
"Saindo do modo de aprendizado. Para entrar novamente, pressione Fenrir+F1"
#: internal/applicationoverrides/rogue/rogue.go:144
msgid "Experience level"
msgstr "Nível de experiência"
#: internal/emoji/catalog.go:30
msgid "Exploding head"
msgstr "Cabeça explodindo"
@@ -487,11 +508,15 @@ msgstr "Primeira área de transferência "
msgid "Flags"
msgstr "Bandeiras"
#: internal/applicationoverrides/rogue/rogue.go:260
msgid "Floor"
msgstr "Chão"
#: internal/emoji/catalog.go:105
msgid "Folded hands"
msgstr "Mãos juntas"
#: internal/emoji/catalog.go
#: internal/applicationoverrides/rogue/rogue.go:278 internal/emoji/catalog.go
msgid "Food"
msgstr "Comida"
@@ -515,6 +540,10 @@ msgstr "Fantasma"
msgid "Gift"
msgstr "Presente"
#: internal/applicationoverrides/rogue/rogue.go:270
msgid "Gold"
msgstr "Ouro"
#: internal/emoji/catalog.go:127
msgid "Greece"
msgstr "Grécia"
@@ -531,6 +560,10 @@ msgstr "Sorriso com suor"
msgid "Hamburger"
msgstr "Hambúrguer"
#: internal/applicationoverrides/rogue/rogue.go:71
msgid "Health"
msgstr "Saúde"
#: internal/emoji/catalog.go:106
msgid "Heart"
msgstr "Coração"
@@ -575,6 +608,10 @@ msgstr "Recuo"
msgid "India"
msgstr "Índia"
#: internal/applicationoverrides/override.go:25
msgid "Information unavailable"
msgstr "Informação indisponível"
#: internal/applicationoverrides/ninjam/ninjam.go:276
msgid "Input {0}"
msgstr "Entrada {0}"
@@ -615,6 +652,10 @@ msgstr "Última área de transferência "
msgid "Latest chat message"
msgstr "Última mensagem do chat"
#: internal/applicationoverrides/rogue/rogue.go:72
msgid "Latest message"
msgstr "Última mensagem"
#: internal/emoji/catalog.go:37
msgid "Laughing"
msgstr "Rindo"
@@ -647,6 +688,7 @@ msgstr "Região dinâmica {0} fora da tela"
msgid "Live region {0} set"
msgstr "Região dinâmica {0} definida"
#: internal/applicationoverrides/rogue/rogue.go:62
#: internal/reader/regions.go:245
msgid "Live region {0}: {1}"
msgstr "Região dinâmica {0}: {1}"
@@ -663,6 +705,10 @@ msgstr "Canal local {0}"
msgid "Mage"
msgstr "Mago"
#: internal/applicationoverrides/rogue/rogue.go:276
msgid "Magic"
msgstr "Magia"
#: internal/applicationoverrides/ninjam/ninjam.go:237
msgid "Master"
msgstr "Principal"
@@ -683,6 +729,10 @@ msgstr "Som de erro ortográfico"
msgid "Moon"
msgstr "Lua"
#: internal/applicationoverrides/rogue/rogue.go:105
msgid "More; press Space"
msgstr "Mais; pressione Espaço"
#: internal/command/descriptions.go:35
msgid "Move Review to the end of current line and display the content"
msgstr ""
@@ -737,7 +787,7 @@ msgstr "Enjoado"
msgid "Netherlands"
msgstr "Países Baixos"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "NetworkManager"
msgstr "NetworkManager"
@@ -745,7 +795,7 @@ msgstr "NetworkManager"
msgid "New channel"
msgstr "Novo canal"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "Ninjam"
msgstr "Ninjam"
@@ -787,10 +837,18 @@ msgstr ""
msgid "No word"
msgstr "Nenhuma palavra"
#: internal/applicationoverrides/rogue/rogue.go:215
msgid "None visible"
msgstr "Nenhum visível"
#: internal/emoji/catalog.go:135
msgid "Norway"
msgstr "Noruega"
#: internal/applicationoverrides/rogue/rogue.go:153
msgid "Not hungry"
msgstr "Sem fome"
#: internal/review/follow_cursor.go:26
msgid "Not in Review Mode"
msgstr "Fora do modo de revisão"
@@ -807,6 +865,10 @@ msgstr "OK"
msgid "One or two marks are needed"
msgstr "São necessárias uma ou duas marcas"
#: internal/applicationoverrides/rogue/rogue.go:262
msgid "Passage"
msgstr "Passagem"
#: internal/emoji/catalog.go:109
msgid "Peace"
msgstr "Paz"
@@ -847,6 +909,10 @@ msgstr "Cocô"
msgid "Portugal"
msgstr "Portugal"
#: internal/applicationoverrides/rogue/rogue.go:272
msgid "Potion"
msgstr "Poção"
#: internal/command/descriptions.go:52
msgid "Present the version of Fenrir currently in use."
msgstr "Anunciar a versão do Fenrir em uso."
@@ -993,10 +1059,18 @@ msgstr "Símbolos repetidos"
msgid "Repeated symbols minimum length"
msgstr "Quantidade mínima de símbolos repetidos"
#: internal/applicationoverrides/rogue/rogue.go:286
msgid "Ring"
msgstr "Anel"
#: internal/emoji/catalog.go:110
msgid "Rock on"
msgstr "Gesto de rock"
#: internal/app/application_overrides.go:321
msgid "Rogue"
msgstr "Rogue"
#: internal/emoji/catalog.go:41
msgid "Rolling laughing"
msgstr "Rolando de rir"
@@ -1057,6 +1131,10 @@ msgstr "Arquivo de script não encontrado"
msgid "Script source is not a valid file"
msgstr "A origem do script não é um arquivo válido"
#: internal/applicationoverrides/rogue/rogue.go:274
msgid "Scroll"
msgstr "Pergaminho"
#: internal/interaction/grid.go:71
msgid "Search cleared"
msgstr "Pesquisa limpa"
@@ -1089,8 +1167,8 @@ msgstr "Definir uma região dinâmica a partir de uma ou duas marcas"
msgid "Set window begin and end marks"
msgstr "Definir marcas de início e fim da janela"
#: internal/app/application_overrides.go:171
#: internal/app/application_overrides.go:315 internal/app/commands.go:84
#: internal/app/application_overrides.go:172
#: internal/app/application_overrides.go:318 internal/app/commands.go:84
msgid "Settings are busy"
msgstr "As configurações estão ocupadas"
@@ -1194,6 +1272,10 @@ msgstr "Soletra a palavra atual"
msgid "Spider"
msgstr "Aranha"
#: internal/applicationoverrides/rogue/rogue.go:268
msgid "Stairs"
msgstr "Escadas"
#: internal/emoji/catalog.go:113
msgid "Star"
msgstr "Estrela"
@@ -1202,10 +1284,18 @@ msgstr "Estrela"
msgid "Start Fenrir"
msgstr "Iniciar o Fenrir"
#: internal/applicationoverrides/rogue/rogue.go:71
msgid "Status"
msgstr "Estado"
#: internal/emoji/catalog.go:72
msgid "Strawberry"
msgstr "Morango"
#: internal/applicationoverrides/rogue/rogue.go:143
msgid "Strength"
msgstr "Força"
#: internal/app/spellcheck_menu.go:45 internal/app/spellcheck_menu.go:47
msgid "Suggestions"
msgstr "Sugestões"
@@ -1218,6 +1308,10 @@ msgstr "Sol"
msgid "Sunflower"
msgstr "Girassol"
#: internal/applicationoverrides/rogue/rogue.go:72
msgid "Surroundings"
msgstr "Arredores"
#: internal/emoji/catalog.go:142
msgid "Sweden"
msgstr "Suécia"
@@ -1270,6 +1364,10 @@ msgstr "Topo"
msgid "Tracking mode"
msgstr "Modo de acompanhamento"
#: internal/applicationoverrides/rogue/rogue.go:266
msgid "Trap"
msgstr "Armadilha"
#: internal/emoji/catalog.go:60
msgid "Tree"
msgstr "Árvore"
@@ -1311,10 +1409,22 @@ msgstr "Reino Unido"
msgid "United States"
msgstr "Estados Unidos"
#: internal/applicationoverrides/rogue/rogue.go:256
msgid "Unseen"
msgstr "Não visível"
#: internal/emoji/catalog.go:94
msgid "Vampire"
msgstr "Vampiro"
#: internal/applicationoverrides/rogue/rogue.go:73
msgid "Visible monsters"
msgstr "Monstros visíveis"
#: internal/applicationoverrides/rogue/rogue.go:73
msgid "Visible objects and landmarks"
msgstr "Objetos e pontos de referência visíveis"
#: internal/app/quick_settings.go:191 internal/app/synthesizer_preview.go:60
msgid "Voice test failed"
msgstr "O teste de voz falhou"
@@ -1336,6 +1446,14 @@ msgstr "Volume e panorama {0}"
msgid "WTF?"
msgstr "Mas que diabos?"
#: internal/applicationoverrides/rogue/rogue.go:258
msgid "Wall"
msgstr "Parede"
#: internal/applicationoverrides/rogue/rogue.go:288
msgid "Wand or staff"
msgstr "Varinha ou cajado"
#: internal/app/tutorial.go:24
msgid ""
"Warning: full keyboard capture is unavailable. Unbound keys may reach the "
@@ -1344,6 +1462,10 @@ msgstr ""
"Aviso: a captura completa do teclado não está disponível. Teclas sem atalho "
"podem chegar ao aplicativo ativo."
#: internal/applicationoverrides/rogue/rogue.go:280
msgid "Weapon"
msgstr "Arma"
#: internal/emoji/catalog.go:95
msgid "Web"
msgstr "Teia"
@@ -1621,6 +1743,10 @@ msgstr "cifrão"
msgid "dot"
msgstr "ponto"
#: internal/applicationoverrides/rogue/rogue.go:244
msgid "east {0}"
msgstr "leste {0}"
#: internal/command/descriptions.go:69
msgid "enables or disables automatic reading of new text as it appears"
msgstr "ativa ou desativa a leitura automática de novo texto como aparece"
@@ -1971,6 +2097,10 @@ msgstr "nenhum console de texto"
msgid "none"
msgstr "nenhum"
#: internal/applicationoverrides/rogue/rogue.go:235
msgid "north {0}"
msgstr "norte {0}"
#: internal/applicationoverrides/ninjam/ninjam.go:263
msgid "not receiving"
msgstr "não recebendo"
@@ -2170,6 +2300,10 @@ msgstr "sorriso"
msgid "some"
msgstr "alguns"
#: internal/applicationoverrides/rogue/rogue.go:238
msgid "south {0}"
msgstr "sul {0}"
#: config/punctuation/default.toml config/punctuation/en.toml
#: config/punctuation/rhvoice-en.toml
msgid "space"
@@ -2286,6 +2420,10 @@ msgstr "sublinhado"
msgid "unmuted"
msgstr "não silenciado"
#: internal/applicationoverrides/rogue/rogue.go:241
msgid "west {0}"
msgstr "oeste {0}"
#: internal/presentation/attributes.go internal/presentation/attributes.go:27
msgid "white"
msgstr "branco"
@@ -2298,7 +2436,7 @@ msgstr "piscadela"
msgid "{0} added to dictionary"
msgstr "{0} adicionado ao dicionário"
#: internal/app/application_overrides.go:207
#: internal/app/application_overrides.go:210
msgid "{0} application override selected"
msgstr "Configurações do aplicativo {0} selecionadas"
@@ -2334,6 +2472,10 @@ msgstr "{0} grade. {1}"
msgid "{0} is already in dictionary"
msgstr "{0} já está no dicionário"
#: internal/applicationoverrides/rogue/rogue.go:115
msgid "{0} of {1}"
msgstr "{0} de {1}"
#: internal/applicationoverrides/ninjam/ninjam.go:313
msgid "{0} percent left"
msgstr "{0} por cento à esquerda"
@@ -2354,10 +2496,18 @@ msgstr "{0} aba"
msgid "{0} {1}"
msgstr "{0} {1}"
#: internal/applicationoverrides/rogue/rogue.go:246
msgid "{0}, {1}"
msgstr "{0}, {1}"
#: internal/interaction/grid.go:39
msgid "{0}. row {1}, column {2}. {3} of {4}"
msgstr "{0}. linha {1}, coluna {2}. {3} de {4}"
#: internal/applicationoverrides/override.go:30
msgid "{0}: {1}"
msgstr "{0}: {1}"
#: internal/app/tutorial.go:25
msgid ""
"{command_name}, Shortcuts {command_shortcuts}, Description "
+168 -18
View File
@@ -57,6 +57,10 @@ msgstr "Все"
msgid "All 10 live regions are set"
msgstr "Все 10 динамических областей заданы"
#: internal/applicationoverrides/rogue/rogue.go:284
msgid "Amulet"
msgstr "Амулет"
#: internal/emoji/catalog.go:23
msgid "Angry"
msgstr "Злость"
@@ -65,11 +69,11 @@ msgstr "Злость"
msgid "Apple"
msgstr "Яблоко"
#: internal/app/application_overrides.go:325
#: internal/app/application_overrides.go:328
msgid "Application"
msgstr "Приложение"
#: internal/app/application_overrides.go:324
#: internal/app/application_overrides.go:327
msgid "Applications"
msgstr "Приложения"
@@ -77,6 +81,11 @@ msgstr "Приложения"
msgid "Argentina"
msgstr "Аргентина"
#: internal/applicationoverrides/rogue/rogue.go:144
#: internal/applicationoverrides/rogue/rogue.go:282
msgid "Armor"
msgstr "Броня"
#: internal/config/config.go:155
msgid "Attribute format"
msgstr "Формат атрибутов"
@@ -161,7 +170,7 @@ msgstr "Бабочка"
msgid "Canada"
msgstr "Канада"
#: internal/app/application_overrides.go:326
#: internal/app/application_overrides.go:329
#: internal/preferences/settings.go:93
msgid "Cancel"
msgstr "Отмена"
@@ -287,13 +296,13 @@ msgstr "Круто"
msgid "Could not check spelling: {0}"
msgstr "Не удалось проверить правописание: {0}"
#: internal/app/application_overrides.go:278
#: internal/app/application_overrides.go:83
#: internal/app/application_overrides.go:281
#: internal/app/application_overrides.go:84
msgid "Could not load application settings: {0}"
msgstr "Не удалось загрузить настройки приложения: {0}"
#: internal/app/application_overrides.go:329
#: internal/app/application_overrides.go:333
#: internal/app/application_overrides.go:332
#: internal/app/application_overrides.go:336
msgid "Could not open Applications: {0}"
msgstr "Не удалось открыть меню приложений: {0}"
@@ -310,8 +319,8 @@ msgstr "Не удалось открыть меню Fenrir: {0}"
msgid "Could not open Spellcheck Menu: {0}"
msgstr "Не удалось открыть меню проверки правописания: {0}"
#: internal/app/application_overrides.go:161
#: internal/app/application_overrides.go:296
#: internal/app/application_overrides.go:162
#: internal/app/application_overrides.go:299
msgid "Could not restore application settings: {0}"
msgstr "Не удалось восстановить настройки приложения: {0}"
@@ -340,12 +349,12 @@ msgstr "Кинжал"
msgid "Date format"
msgstr "Формат даты"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "Default"
msgstr "По умолчанию"
#: internal/app/application_overrides.go:186
#: internal/app/application_overrides.go:242
#: internal/app/application_overrides.go:187
#: internal/app/application_overrides.go:245
msgid "Default settings restored"
msgstr "Настройки по умолчанию восстановлены"
@@ -381,10 +390,18 @@ msgstr "Собака"
msgid "Donut"
msgstr "Пончик"
#: internal/applicationoverrides/rogue/rogue.go:264
msgid "Door"
msgstr "Дверь"
#: internal/config/config.go:120 internal/config/config.go:127
msgid "Driver"
msgstr "Драйвер"
#: internal/applicationoverrides/rogue/rogue.go:143
msgid "Dungeon level"
msgstr "Уровень подземелья"
#: internal/config/config.go:142
msgid "Echo on CapsLock"
msgstr "Эхо при CapsLock"
@@ -435,6 +452,10 @@ msgstr "Закрытие режима просмотра."
msgid "Exiting tutorial mode. To enter tutorial mode again press Fenrir+F1"
msgstr "Выход из режима обучения. Для повторного входа нажмите Fenrir+F1"
#: internal/applicationoverrides/rogue/rogue.go:144
msgid "Experience level"
msgstr "Уровень опыта"
#: internal/emoji/catalog.go:30
msgid "Exploding head"
msgstr "Взрывающаяся голова"
@@ -483,11 +504,15 @@ msgstr "Первый буфер обмена. "
msgid "Flags"
msgstr "Флаги"
#: internal/applicationoverrides/rogue/rogue.go:260
msgid "Floor"
msgstr "Пол"
#: internal/emoji/catalog.go:105
msgid "Folded hands"
msgstr "Сложенные ладони"
#: internal/emoji/catalog.go
#: internal/applicationoverrides/rogue/rogue.go:278 internal/emoji/catalog.go
msgid "Food"
msgstr "Еда"
@@ -511,6 +536,10 @@ msgstr "Привидение"
msgid "Gift"
msgstr "Подарок"
#: internal/applicationoverrides/rogue/rogue.go:270
msgid "Gold"
msgstr "Золото"
#: internal/emoji/catalog.go:127
msgid "Greece"
msgstr "Греция"
@@ -527,6 +556,10 @@ msgstr "Улыбка с каплей пота"
msgid "Hamburger"
msgstr "Гамбургер"
#: internal/applicationoverrides/rogue/rogue.go:71
msgid "Health"
msgstr "Здоровье"
#: internal/emoji/catalog.go:106
msgid "Heart"
msgstr "Сердце"
@@ -571,6 +604,10 @@ msgstr "Отступы"
msgid "India"
msgstr "Индия"
#: internal/applicationoverrides/override.go:25
msgid "Information unavailable"
msgstr "Информация недоступна"
#: internal/applicationoverrides/ninjam/ninjam.go:276
msgid "Input {0}"
msgstr "Вход {0}"
@@ -611,6 +648,10 @@ msgstr "Последний буфер обмена. "
msgid "Latest chat message"
msgstr "Последнее сообщение чата"
#: internal/applicationoverrides/rogue/rogue.go:72
msgid "Latest message"
msgstr "Последнее сообщение"
#: internal/emoji/catalog.go:37
msgid "Laughing"
msgstr "Смех"
@@ -643,6 +684,7 @@ msgstr "Динамическая область {0} за пределами эк
msgid "Live region {0} set"
msgstr "Динамическая область {0} задана"
#: internal/applicationoverrides/rogue/rogue.go:62
#: internal/reader/regions.go:245
msgid "Live region {0}: {1}"
msgstr "Динамическая область {0}: {1}"
@@ -659,6 +701,10 @@ msgstr "Локальный канал {0}"
msgid "Mage"
msgstr "Маг"
#: internal/applicationoverrides/rogue/rogue.go:276
msgid "Magic"
msgstr "Магия"
#: internal/applicationoverrides/ninjam/ninjam.go:237
msgid "Master"
msgstr "Основной выход"
@@ -679,6 +725,10 @@ msgstr "Звук ошибки правописания"
msgid "Moon"
msgstr "Луна"
#: internal/applicationoverrides/rogue/rogue.go:105
msgid "More; press Space"
msgstr "Далее; нажмите пробел"
#: internal/command/descriptions.go:35
msgid "Move Review to the end of current line and display the content"
msgstr ""
@@ -730,7 +780,7 @@ msgstr "Тошнота"
msgid "Netherlands"
msgstr "Нидерланды"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "NetworkManager"
msgstr "NetworkManager"
@@ -738,7 +788,7 @@ msgstr "NetworkManager"
msgid "New channel"
msgstr "Новый канал"
#: internal/app/application_overrides.go:318
#: internal/app/application_overrides.go:321
msgid "Ninjam"
msgstr "Ninjam"
@@ -779,10 +829,18 @@ msgstr "В буфере обмена нет текста или нет дост
msgid "No word"
msgstr "Нет слова"
#: internal/applicationoverrides/rogue/rogue.go:215
msgid "None visible"
msgstr "Ничего не видно"
#: internal/emoji/catalog.go:135
msgid "Norway"
msgstr "Норвегия"
#: internal/applicationoverrides/rogue/rogue.go:153
msgid "Not hungry"
msgstr "Не голоден"
#: internal/review/follow_cursor.go:26
msgid "Not in Review Mode"
msgstr "Нет в режиме просмотра."
@@ -799,6 +857,10 @@ msgstr "ОК"
msgid "One or two marks are needed"
msgstr "Необходимы одна или две ментки."
#: internal/applicationoverrides/rogue/rogue.go:262
msgid "Passage"
msgstr "Проход"
#: internal/emoji/catalog.go:109
msgid "Peace"
msgstr "Мир"
@@ -839,6 +901,10 @@ msgstr "Какашка"
msgid "Portugal"
msgstr "Португалия"
#: internal/applicationoverrides/rogue/rogue.go:272
msgid "Potion"
msgstr "Зелье"
#: internal/command/descriptions.go:52
msgid "Present the version of Fenrir currently in use."
msgstr "Назвать используемую версию Fenrir."
@@ -985,10 +1051,18 @@ msgstr "Повторяющиеся символы"
msgid "Repeated symbols minimum length"
msgstr "Минимальное число повторяющихся символов"
#: internal/applicationoverrides/rogue/rogue.go:286
msgid "Ring"
msgstr "Кольцо"
#: internal/emoji/catalog.go:110
msgid "Rock on"
msgstr "Рокерский жест"
#: internal/app/application_overrides.go:321
msgid "Rogue"
msgstr "Rogue"
#: internal/emoji/catalog.go:41
msgid "Rolling laughing"
msgstr "Катается от смеха"
@@ -1049,6 +1123,10 @@ msgstr "Скрипт не найден"
msgid "Script source is not a valid file"
msgstr "Исходник скрипта неправильный файл"
#: internal/applicationoverrides/rogue/rogue.go:274
msgid "Scroll"
msgstr "Свиток"
#: internal/interaction/grid.go:71
msgid "Search cleared"
msgstr "Поиск очищен"
@@ -1081,8 +1159,8 @@ msgstr "Задать динамическую область по одной и
msgid "Set window begin and end marks"
msgstr "Установка начала и конца окна"
#: internal/app/application_overrides.go:171
#: internal/app/application_overrides.go:315 internal/app/commands.go:84
#: internal/app/application_overrides.go:172
#: internal/app/application_overrides.go:318 internal/app/commands.go:84
msgid "Settings are busy"
msgstr "Настройки заняты"
@@ -1186,6 +1264,10 @@ msgstr "Произносит текущее слово по буквам"
msgid "Spider"
msgstr "Паук"
#: internal/applicationoverrides/rogue/rogue.go:268
msgid "Stairs"
msgstr "Лестница"
#: internal/emoji/catalog.go:113
msgid "Star"
msgstr "Звезда"
@@ -1194,10 +1276,18 @@ msgstr "Звезда"
msgid "Start Fenrir"
msgstr "fenrir запущен"
#: internal/applicationoverrides/rogue/rogue.go:71
msgid "Status"
msgstr "Состояние"
#: internal/emoji/catalog.go:72
msgid "Strawberry"
msgstr "Клубника"
#: internal/applicationoverrides/rogue/rogue.go:143
msgid "Strength"
msgstr "Сила"
#: internal/app/spellcheck_menu.go:45 internal/app/spellcheck_menu.go:47
msgid "Suggestions"
msgstr "Предложения"
@@ -1210,6 +1300,10 @@ msgstr "Солнце"
msgid "Sunflower"
msgstr "Подсолнух"
#: internal/applicationoverrides/rogue/rogue.go:72
msgid "Surroundings"
msgstr "Окружение"
#: internal/emoji/catalog.go:142
msgid "Sweden"
msgstr "Швеция"
@@ -1262,6 +1356,10 @@ msgstr "Начало"
msgid "Tracking mode"
msgstr "Режим отслеживания"
#: internal/applicationoverrides/rogue/rogue.go:266
msgid "Trap"
msgstr "Ловушка"
#: internal/emoji/catalog.go:60
msgid "Tree"
msgstr "Дерево"
@@ -1303,10 +1401,22 @@ msgstr "Великобритания"
msgid "United States"
msgstr "Соединённые Штаты"
#: internal/applicationoverrides/rogue/rogue.go:256
msgid "Unseen"
msgstr "Не видно"
#: internal/emoji/catalog.go:94
msgid "Vampire"
msgstr "Вампир"
#: internal/applicationoverrides/rogue/rogue.go:73
msgid "Visible monsters"
msgstr "Видимые монстры"
#: internal/applicationoverrides/rogue/rogue.go:73
msgid "Visible objects and landmarks"
msgstr "Видимые предметы и ориентиры"
#: internal/app/quick_settings.go:191 internal/app/synthesizer_preview.go:60
msgid "Voice test failed"
msgstr "Не удалось проверить голос"
@@ -1328,6 +1438,14 @@ msgstr "Громкость и панорама {0}"
msgid "WTF?"
msgstr "Какого чёрта?"
#: internal/applicationoverrides/rogue/rogue.go:258
msgid "Wall"
msgstr "Стена"
#: internal/applicationoverrides/rogue/rogue.go:288
msgid "Wand or staff"
msgstr "Волшебная палочка или посох"
#: internal/app/tutorial.go:24
msgid ""
"Warning: full keyboard capture is unavailable. Unbound keys may reach the "
@@ -1336,6 +1454,10 @@ msgstr ""
"Предупреждение: полный захват клавиатуры недоступен. Неназначенные клавиши "
"могут передаваться активному приложению."
#: internal/applicationoverrides/rogue/rogue.go:280
msgid "Weapon"
msgstr "Оружие"
#: internal/emoji/catalog.go:95
msgid "Web"
msgstr "Паутина"
@@ -1612,6 +1734,10 @@ msgstr "доллар"
msgid "dot"
msgstr "точка"
#: internal/applicationoverrides/rogue/rogue.go:244
msgid "east {0}"
msgstr "восток {0}"
#: internal/command/descriptions.go:69
msgid "enables or disables automatic reading of new text as it appears"
msgstr "включить или отключить чтения нового текста"
@@ -1956,6 +2082,10 @@ msgstr "нет текстовой консоли"
msgid "none"
msgstr "нет"
#: internal/applicationoverrides/rogue/rogue.go:235
msgid "north {0}"
msgstr "север {0}"
#: internal/applicationoverrides/ninjam/ninjam.go:263
msgid "not receiving"
msgstr "приём выключен"
@@ -2154,6 +2284,10 @@ msgstr "улыбка"
msgid "some"
msgstr "некоторые"
#: internal/applicationoverrides/rogue/rogue.go:238
msgid "south {0}"
msgstr "юг {0}"
#: config/punctuation/default.toml config/punctuation/en.toml
#: config/punctuation/rhvoice-en.toml
msgid "space"
@@ -2270,6 +2404,10 @@ msgstr "Подчеркнутый"
msgid "unmuted"
msgstr "звук включён"
#: internal/applicationoverrides/rogue/rogue.go:241
msgid "west {0}"
msgstr "запад {0}"
#: internal/presentation/attributes.go internal/presentation/attributes.go:27
msgid "white"
msgstr "белый"
@@ -2282,7 +2420,7 @@ msgstr "подмигивание"
msgid "{0} added to dictionary"
msgstr "{0} добавлено в словарь"
#: internal/app/application_overrides.go:207
#: internal/app/application_overrides.go:210
msgid "{0} application override selected"
msgstr "Выбраны настройки приложения {0}"
@@ -2318,6 +2456,10 @@ msgstr "{0}, сетка. {1}"
msgid "{0} is already in dictionary"
msgstr "{0} уже находится в словаре"
#: internal/applicationoverrides/rogue/rogue.go:115
msgid "{0} of {1}"
msgstr "{0} из {1}"
#: internal/applicationoverrides/ninjam/ninjam.go:313
msgid "{0} percent left"
msgstr "{0} процентов влево"
@@ -2338,10 +2480,18 @@ msgstr "{0}, вкладка"
msgid "{0} {1}"
msgstr "{0} {1}"
#: internal/applicationoverrides/rogue/rogue.go:246
msgid "{0}, {1}"
msgstr "{0}, {1}"
#: internal/interaction/grid.go:39
msgid "{0}. row {1}, column {2}. {3} of {4}"
msgstr "{0}. строка {1}, столбец {2}. {3} из {4}"
#: internal/applicationoverrides/override.go:30
msgid "{0}: {1}"
msgstr "{0}: {1}"
#: internal/app/tutorial.go:25
msgid ""
"{command_name}, Shortcuts {command_shortcuts}, Description "
+194
View File
@@ -0,0 +1,194 @@
// Copyright (c) 2026 Storm Dragon
// SPDX-License-Identifier: GPL-3.0-or-later
//go:build linux && cgo
package terminal
import (
"errors"
"fmt"
"os"
"os/exec"
"strings"
"syscall"
"testing"
"time"
"git.stormux.org/storm/fenrir/internal/applicationoverrides"
"git.stormux.org/storm/fenrir/internal/applicationoverrides/rogue"
"git.stormux.org/storm/fenrir/internal/command"
"git.stormux.org/storm/fenrir/internal/reader"
)
// Opt in with FENRIR_ROGUE_TEST_BINARY=/usr/bin/rogue. Each game has a private
// PTY and working/save directory. SEED disables scoring in classic Rogue.
// This exercises real ncurses output, without touching the active reader.
func TestRogueLiveOverride(t *testing.T) {
program := os.Getenv("FENRIR_ROGUE_TEST_BINARY")
if program == "" {
t.Skip("set FENRIR_ROGUE_TEST_BINARY to a classic Rogue executable")
}
for _, rows := range []int{24, 32} {
for _, style := range []string{"Clear", "Overwrite", "Slow"} {
t.Run(fmt.Sprintf("%d/%s", rows, style), func(t *testing.T) {
cols := 80
if rows > 24 {
cols = 100
}
master, slave, err := open_pty(rows, cols)
if err != nil {
t.Fatal(err)
}
defer syscall.Close(master)
slaveFile := os.NewFile(uintptr(slave), "private Rogue PTY")
defer slaveFile.Close()
child := exec.Command(program)
child.Dir = t.TempDir()
child.Env = append(os.Environ(), "HOME="+child.Dir, "TERM=xterm-256color", "LANG=C", "LC_ALL=C", "SEED=1234", "ROGUEOPTS=name=FenrirFixture,noterse,inven="+style)
child.Stdin, child.Stdout, child.Stderr = slaveFile, slaveFile, slaveFile
child.SysProcAttr = &syscall.SysProcAttr{Setsid: true, Setctty: true, Ctty: 0}
if err := child.Start(); err != nil {
t.Fatal(err)
}
defer func() { _ = child.Process.Kill(); _ = child.Wait() }()
if err := syscall.SetNonblock(master, true); err != nil {
t.Fatal(err)
}
e, err := new_emulator(rows, cols)
if err != nil {
t.Fatal(err)
}
defer e.close()
a, r := &rogue.Adapter{}, reader.New()
active := false
var frame applicationoverrides.Frame
var output []string
pump := func() {
var buffer [32768]byte
for total := 0; total < 131072; {
n, err := syscall.Read(master, buffer[:])
if n > 0 {
total += n
e.feed(buffer[:n])
}
if errors.Is(err, syscall.EAGAIN) || errors.Is(err, syscall.EIO) || n == 0 {
break
}
if err != nil && !errors.Is(err, syscall.EINTR) {
t.Fatal(err)
}
}
if active {
s := e.snapshot(true, false)
frame = a.Observe(s)
for _, message := range r.Update_application(s, frame) {
if message.Text != "" {
output = append(output, message.Text)
}
}
}
}
screenText := func() string { return string(e.snapshot(true, false).Cells) }
waitFor := func(label string, predicate func() bool) {
t.Helper()
deadline := time.Now().Add(3 * time.Second)
for time.Now().Before(deadline) {
pump()
if predicate() {
return
}
time.Sleep(10 * time.Millisecond)
}
t.Fatalf("%s not observed; screen=%q; speech=%q", label, screenText(), output)
}
send := func(text string) {
t.Helper()
r.Note_input(true, false, false)
if _, err := syscall.Write(master, []byte(text)); err != nil {
t.Fatal(err)
}
}
waitFor("initial game", func() bool { return strings.Contains(screenText(), "Hp:") && strings.Contains(screenText(), "@") })
active = true
pump()
if !frame.Recognized || !frame.OwnsPresentation {
t.Fatal("real game not recognized", screenText())
}
for index, id := range []command.ID{command.ReadLiveRegion1, command.ReadLiveRegion2, command.ReadLiveRegion3, command.ReadLiveRegion4, command.ReadLiveRegion5, command.ReadLiveRegion6} {
result, handled := a.Command(id)
if !handled || !strings.HasPrefix(result.Text, frame.Regions[index].Name+": ") {
t.Fatal("unnamed region", result)
}
}
initialHealth, _ := a.Command(command.ReadLiveRegion1)
send("i")
if style == "Slow" {
waitFor("slow inventory", func() bool { return strings.Contains(e.snapshot(true, false).Text(0), "a)") })
// Five initial items; each intervening message waits for Space.
for _, letter := range []string{"b)", "c)", "d)", "e)"} {
send(" ")
waitFor("next inventory item", func() bool { return strings.Contains(e.snapshot(true, false).Text(0), letter) })
}
} else {
waitFor("inventory page", func() bool { return strings.Contains(screenText(), "--Press space to continue--") })
if !frame.Recognized || frame.OwnsPresentation {
t.Fatal("inventory interpreted as dungeon")
}
send(" ")
waitFor("return from inventory", func() bool {
return frame.OwnsPresentation && !strings.Contains(screenText(), "--Press space to continue--")
})
}
send("?")
waitFor("help prompt", func() bool { return strings.Contains(e.snapshot(true, false).Text(0), "Character you want help for") })
send("*")
waitFor("help page", func() bool { return strings.Contains(screenText(), "--Press space to continue--") })
if !frame.Recognized || frame.OwnsPresentation {
t.Fatal("help not readable")
}
send(" ")
waitFor("return from help", func() bool { return frame.OwnsPresentation })
send("o")
waitFor("options", func() bool { return strings.Contains(screenText(), `Terse output ("terse"):`) })
if !frame.Recognized || frame.OwnsPresentation {
t.Fatal("options not readable")
}
send("\x1b")
waitFor("options exit prompt", func() bool { return strings.Contains(screenText(), "--Press space to continue--") })
send(" ")
waitFor("return from options", func() bool { return frame.OwnsPresentation })
start := len(output)
send("v")
waitFor("version announcement", func() bool { return strings.Contains(strings.Join(output[start:], " "), "Version 5.4") })
t.Log(initialHealth.Text, strings.Join(output[start:], " "))
// Move onto an empty adjacent floor cell. Keystrokes must not be
// echoed as letters, and the moving @ must not read out a map row.
s := e.snapshot(true, false)
moved := false
for _, step := range []struct {
dx, dy int
key string
}{{1, 0, "l"}, {-1, 0, "h"}, {0, 1, "j"}, {0, -1, "k"}} {
x, y := s.X+step.dx, s.Y+step.dy
if x < 0 || x >= 80 || y < 1 || y > 22 || s.Line(y)[x] != '.' {
continue
}
start = len(output)
send(step.key)
waitFor("player movement", func() bool { current := e.snapshot(true, false); return current.X == x && current.Y == y })
for _, text := range output[start:] {
if text == step.key || strings.Contains(text, "@") {
t.Fatal("map or key chatter", text)
}
}
moved = true
break
}
if !moved {
t.Fatal("fixture has no adjacent empty floor")
}
})
}
}
}