Skip to content

Commit

Permalink
add a scaled font accessibility option
Browse files Browse the repository at this point in the history
  • Loading branch information
quasilyte committed Apr 5, 2024
1 parent b143ef9 commit 9d57763
Show file tree
Hide file tree
Showing 62 changed files with 892 additions and 300 deletions.
4 changes: 3 additions & 1 deletion src/assets/_data/raw/en.txt
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ Schemas can be used to save and load your favorite drone build.
##menu.options.sound : Sound
##menu.options.graphics : Graphics
##menu.options.extra : Extra
##menu.options.accessibility : Accessibility
##menu.options.controls : Controls

##menu.options.music_player : Music player
Expand Down Expand Up @@ -179,6 +180,7 @@ Schemas can be used to save and load your favorite drone build.
##menu.options.scroll_speed : Scroll speed
##menu.options.edge_scroll_range : Edge scroll range
##menu.options.large_diodes : Large diodes
##menu.options.larger_font : Larger font
##menu.options.show_fps : Show FPS
##menu.options.show_timer : Show timer
##menu.options.splash_screen : Splash screen
Expand Down Expand Up @@ -536,7 +538,7 @@ Win by surviving for 20 waves.
Split-screen multiplayer: cooperative.

##menu.overview.inf_arena
Infinite arena mode (est. time: 90 minutes)
Inf arena mode (est. time: 90 minutes)

Stand the ground for as long as possible.

Expand Down
32 changes: 16 additions & 16 deletions src/assets/_data/raw/en_drones.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
##core.ability.weapons : Can attack flying targets
##core.ability.ground_weapons : Can attack ground targets
##core.ability.robust : Highly resistant to damage
##core.ability.cheap_drones : Drone production takes less resources
##core.ability.cheap_drones : Cheaper drone production

##drone.kind.worker : worker
##drone.kind.military : combat
Expand Down Expand Up @@ -80,38 +80,38 @@

##drone.ability.self_repair : Repairs itself over time
##drone.ability.extra_payload : Increased max payload
##drone.ability.aggro : Forces the target to attack this drone
##drone.ability.aggro : Attracts the target's aggro
##drone.ability.disarm : May disable the target's weapon
##drone.ability.slow : Slows targets down
##drone.ability.cloak_hide : Cloaks itself when heavily damaged
##drone.ability.cloak_scavenge : Cloaks itself when harvesting scraps

##drone.ability.energy_regen : Very high energy regen rate
##drone.ability.cloning : Performs cloning of non-elite drones
##drone.ability.cloning : Performs drone cloning
##drone.ability.repair : Repairs damaged drones
##drone.ability.recharge : Recovers the energy of the nearby drones
##drone.ability.recharge : Recovers the energy of drones
##drone.ability.red_oil_scavenge : Can harvest a red oil resource
##drone.ability.colony_speed : Makes the colony move faster
##drone.ability.colony_jump : Increases colony max jump distance
##drone.ability.discharged_speed : Moves fast even when low on energy
##drone.ability.scrap_scavenge : Can harvest scraps
##drone.ability.courier : Distributes the resources between colonies
##drone.ability.courier : Redistributes colony resources
##drone.ability.zero_upkeep : Zero upkeep cost
##drone.ability.upkeep_decrease : Decreases the total upkeep costs
##drone.ability.ground : The only ground drone
##drone.ability.map_patrol : Patrols the map and guards turrets
##drone.ability.discharged_after_attack : Completely discharges after firing its weapon
##drone.ability.group_command : Takes command of several combat drones
##drone.ability.group_buff : Improves the firing accuracy of its group
##drone.ability.group_buff_def : Improves the durability of its group
##drone.ability.target_marking : Makes targets attackable from a longer distance
##drone.ability.kamikaze : Becomes a kamikaze drone if heavily damaged
##drone.ability.prism_reflect : Combines attacks with nearby prisms
##drone.ability.scarab_potential : Has the potential to become something more
##drone.ability.consume_for_heal : Consumes tier 1 workers to repair itself
##drone.ability.consume_for_power : Gets permanent power when consuming a drone
##drone.ability.discharged_after_attack : Discharges after firing once
##drone.ability.group_command : Followed by other drones
##drone.ability.group_buff : Improves the group's accuracy
##drone.ability.group_buff_def : Improves the group's durability
##drone.ability.target_marking : Increases range by marking targets
##drone.ability.kamikaze : Can perform a kamikaze attack
##drone.ability.prism_reflect : Prisms combine their attacks
##drone.ability.scarab_potential : Greatly evolves over time
##drone.ability.consume_for_heal : Consumes t1 workers to repair itself
##drone.ability.consume_for_power : Gets power when consuming a drone
##drone.ability.bomb_attack : Attacks only when ordered
##drone.ability.bomb_aoe : The bombs deal massive area of effect damage
##drone.ability.bomb_aoe : The bombs deal area of effect damage
##drone.ability.more_building_damage_f : %d%% more damage against buildings
##drone.ability.less_building_damage_f : %d%% less damage against buildings

Expand Down
12 changes: 7 additions & 5 deletions src/assets/_data/raw/ru.txt
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@
##menu.options.sound : Звук
##menu.options.graphics : Графика
##menu.options.extra : Дополнительно
##menu.options.accessibility : Доступность
##menu.options.controls : Управление

##menu.options.music_player : Формат музыки
Expand Down Expand Up @@ -180,6 +181,7 @@
##menu.options.scroll_speed : Скорость скроллинга
##menu.options.edge_scroll_range : Ширина границы прокрутки
##menu.options.large_diodes : Крупные диоды
##menu.options.larger_font : Крупный текст
##menu.options.show_fps : Отображать FPS
##menu.options.show_timer : Отображать таймер
##menu.options.splash_screen : Экран заставки
Expand Down Expand Up @@ -504,14 +506,14 @@ x1.5 означает, что игра будет работать на 50% бы
Показать подсказку | Длительное касание на точке интереса

##menu.overview.intro_mission
Вступительная миссия (время прохождения: ~15 минут)
Вступительная миссия (~15 минут)

Режим с подсказками и постановочными ситуациями. Он позволит изучить основы геймплея и научиться защищать свою колонию.

Выполнение этой миссии откроет доступ к классическому режиму (альтернатива: 1-2 победы в Блиц режиме).

##menu.overview.classic
Классический режим (время прохождения: ~30 минут)
Классический режим (~30 минут)

Победа в этом режиме достигается путём уничтожения вражеского флагмана - дредноута. Это основной режим игры.

Expand All @@ -520,7 +522,7 @@ x1.5 означает, что игра будет работать на 50% бы
Мультиплеер с разделённым экраном: кооперативный.

##menu.overview.blitz
Блиц режим (время прохождения: ~15 минут)
Блиц режим (~15 минут)

Уничтожьте все постройки, производящие вражеских юнитов. Этот режим больше подходит для новичков, чем Классический.

Expand All @@ -529,7 +531,7 @@ x1.5 означает, что игра будет работать на 50% бы
Мультиплеер с разделённым экраном: кооперативный.

##menu.overview.arena
Режим арены (время прохождения: 60 минут)
Режим арены (60 минут)

Выдержите 20 волн атак.

Expand All @@ -545,7 +547,7 @@ x1.5 означает, что игра будет работать на 50% бы
Мультиплеер с разделённым экраном: кооперативный.

##menu.overview.reverse
Реверсивный режим (время прохождения: ~40 минут)
Реверсивный режим (~40 минут)

Поменяйтесь местами и сыграйте за дредноута.

Expand Down
62 changes: 31 additions & 31 deletions src/assets/_data/raw/ru_drones.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,21 @@
##core.tank : Бастион
##core.hive : Улий

##core.mobility_rating : Рейтинг мобильности
##core.unit_limit_rating : Рейтинг количества дронов
##core.capacity_rating : Рейтинг вместимости ресурсов
##core.mobility_rating : Мобильность
##core.unit_limit_rating : Количество дронов
##core.capacity_rating : Вместимость

##core.ability.crush : Может разрушать наземных юнитов при посадке
##core.ability.build_discount : Тратит на 50% меньше ресурсов на строительство
##core.ability.crush : Посадка разрушает наземных юнитов
##core.ability.build_discount : Строительство на 50% дешевле
##core.ability.flying : Воздушная колония
##core.ability.no_teleporters : Не может использовать телепортеры
##core.ability.cant_fly : Не может летать
##core.ability.cant_move : Не может перемещаться
##core.ability.drone_control : Может устанавливать точки сбора дронов
##core.ability.drone_control : Задаёт точки сбора дронов
##core.ability.weapons : Атакует воздушные цели
##core.ability.ground_weapons : Атакует наземные цели
##core.ability.robust : Блокирует часть наносимого урона
##core.ability.cheap_drones : Производство дронов требует меньше ресурсов
##core.ability.cheap_drones : Дешёвое производство дронов

##drone.kind.worker : рабочий
##drone.kind.military : военный
Expand Down Expand Up @@ -71,46 +71,46 @@

##drone.attack_rating_multi : на 1 цель
##drone.ability.num_targets_f : Атакует до %d целей
##drone.ability.num_targets_alt_f : До %d дополнительных целей вокруг основной
##drone.ability.num_targets_alt_f : До %d доп целей вокруг основной

##drone.dps_rating : Рейтинг урона в секунду
##drone.attack_range_rating : Рейтинг дальности атаки
##drone.defense_rating : Рейтинг защиты
##drone.attack_rating : Рейтинг вооружения
##drone.dps_rating : Атака
##drone.attack_range_rating : Дальности атаки
##drone.defense_rating : Защита
##drone.attack_rating : Вооружение
##drone.upkeep_cost : Цена обслуживания

##drone.ability.self_repair : Имеет функцию саморемонта
##drone.ability.extra_payload : Увеличенный трюм
##drone.ability.aggro : Заставляет целей атаковать этого дрона
##drone.ability.aggro : Заставляет целей атаковать себя
##drone.ability.disarm : Может отключать оружие своих целей
##drone.ability.slow : Замедляет цели
##drone.ability.cloak_hide : Уходит в невидимость при высокой опасности
##drone.ability.cloak_hide : Защитная невидимость
##drone.ability.cloak_scavenge : Добывает ресурсы в невидимости

##drone.ability.energy_regen : Высокая скорость восстановления энергии
##drone.ability.cloning : Клонирует других дронов (кроме элитных)
##drone.ability.energy_regen : Почти бесконечная энергия
##drone.ability.cloning : Клонирует других дронов
##drone.ability.repair : Чинит повреждённых дронов
##drone.ability.recharge : Восстанавливает энергию ближайшим дронам
##drone.ability.recharge : Восстанавливает энергию дронам
##drone.ability.red_oil_scavenge : Может добывать алую нефть
##drone.ability.colony_speed : Ускоряет колонию
##drone.ability.colony_jump : Увеличивает дальность прыжка колонии
##drone.ability.discharged_speed : Быстро перемещается даже при низком заряде
##drone.ability.colony_jump : Увеличивает радиус прыжка колонии
##drone.ability.discharged_speed : Не замедляется от разрядки
##drone.ability.scrap_scavenge : Может собирать обломки
##drone.ability.courier : Перераспределяет ресурсы между колониями
##drone.ability.courier : Распределяет ресурсы между базами
##drone.ability.zero_upkeep : Нулевая цена обслужевания
##drone.ability.upkeep_decrease : Снижает расходы на обслуживание дронов колонии
##drone.ability.upkeep_decrease : Понижает расходы колонии
##drone.ability.ground : Единственный наземный дрон
##drone.ability.map_patrol : Патрулирует карту, охраняет турели
##drone.ability.discharged_after_attack : Разряжается после использования оружия
##drone.ability.group_command : Берёт под контроль несколько боевых дронов
##drone.ability.group_buff : Улучшает меткость стрельбы своей группы
##drone.ability.group_buff_def : Увеличивает прочность дронов группы
##drone.ability.target_marking : Размеченные им цели можно атаковать издалека
##drone.ability.kamikaze : Перед смертью бросается в последний рывок
##drone.ability.prism_reflect : Атаки близкостоящих призм объединяются
##drone.ability.scarab_potential : Имеет потенциал стать чем-то более сильным
##drone.ability.consume_for_heal : Поглощает рабочих 1 тира для саморемонта
##drone.ability.consume_for_power : Получает постоянные бонусы при таком поглощении
##drone.ability.discharged_after_attack : Разряжается после выстрела
##drone.ability.group_command : Управляет группой дронов
##drone.ability.group_buff : Улучшает меткость стрельбы группы
##drone.ability.group_buff_def : Увеличивает прочность группы
##drone.ability.target_marking : Размечает цели для дальней атаки
##drone.ability.kamikaze : Умирая, выполняет финальную атаку
##drone.ability.prism_reflect : Атаки призм объединяются
##drone.ability.scarab_potential : Усиливается со временем
##drone.ability.consume_for_heal : Поглощает т1 рабочих для ремонта
##drone.ability.consume_for_power : Получает бонусы при поглощении
##drone.ability.bomb_attack : Атакует только по приказу
##drone.ability.bomb_aoe : Бомбы наносят высокий урон по области
##drone.ability.more_building_damage_f : На %d%% больше урона по зданиям
Expand Down
108 changes: 6 additions & 102 deletions src/assets/font.go
Original file line number Diff line number Diff line change
@@ -1,109 +1,13 @@
package assets

import (
"image"
"image/color"

"github.com/hajimehoshi/bitmapfont/v3"
"golang.org/x/image/font"
"golang.org/x/image/math/fixed"
"github.com/quasilyte/roboden-game/assets/monofont"
)

var (
BitmapFont1 = bitmapfont.Face
BitmapFont2 = scaleFont(BitmapFont1, 2)
BitmapFont3 = scaleFont(BitmapFont1, 3)
)

func euclidianDiv(x, y int) int {
if x < 0 {
x -= y - 1
}
return x / y
}

type scaledImage struct {
image image.Image
scale int
}

func (s *scaledImage) ColorModel() color.Model {
return s.image.ColorModel()
}

func (s *scaledImage) Bounds() image.Rectangle {
b := s.image.Bounds()
b.Min = b.Min.Mul(s.scale)
b.Max = b.Max.Mul(s.scale)
return b
}

func (s *scaledImage) At(x, y int) color.Color {
x = euclidianDiv(x, s.scale)
y = euclidianDiv(y, s.scale)
return s.image.At(x, y)
}

func scaleFont(f font.Face, scale int) font.Face {
if scale == 1 {
return f
}
return &scaledFont{f, scale}
}
Font1 = monofont.New1()
Font2 = monofont.Scale(Font1, 2)
Font3 = monofont.Scale(Font1, 3)

type scaledFont struct {
font font.Face
scale int
}

func (s *scaledFont) Close() error {
return s.font.Close()
}

func (s *scaledFont) Glyph(dot fixed.Point26_6, r rune) (dr image.Rectangle, mask image.Image, maskp image.Point, advance fixed.Int26_6, ok bool) {
dr, mask, maskp, advance, ok = s.font.Glyph(dot, r)
if !ok {
return
}
d := image.Pt(dot.X.Floor(), dot.Y.Floor())
dr.Min = dr.Min.Sub(d).Mul(s.scale).Add(d)
dr.Max = dr.Max.Sub(d).Mul(s.scale).Add(d)
maskp = maskp.Mul(s.scale)
advance *= fixed.Int26_6(s.scale)
return dr, &scaledImage{mask, s.scale}, maskp, advance, ok
}

func (s *scaledFont) GlyphBounds(r rune) (bounds fixed.Rectangle26_6, advance fixed.Int26_6, ok bool) {
bounds, advance, ok = s.font.GlyphBounds(r)
if !ok {
return
}
bounds.Min.X *= fixed.Int26_6(s.scale)
bounds.Min.Y *= fixed.Int26_6(s.scale)
bounds.Max.X *= fixed.Int26_6(s.scale)
bounds.Max.Y *= fixed.Int26_6(s.scale)
advance *= fixed.Int26_6(s.scale)
return
}

func (s *scaledFont) GlyphAdvance(r rune) (advance fixed.Int26_6, ok bool) {
advance, ok = s.font.GlyphAdvance(r)
if !ok {
return
}
advance *= fixed.Int26_6(s.scale)
return
}

func (s *scaledFont) Kern(r0, r1 rune) fixed.Int26_6 {
return s.font.Kern(r0, r1) * fixed.Int26_6(s.scale)
}

func (s *scaledFont) Metrics() font.Metrics {
m := s.font.Metrics()
return font.Metrics{
Height: m.Height * fixed.Int26_6(s.scale),
Ascent: m.Ascent * fixed.Int26_6(s.scale),
Descent: m.Descent * fixed.Int26_6(s.scale),
}
}
Font1_3 = monofont.New1_3()
)
Binary file added src/assets/monofont/1_00.data.gz
Binary file not shown.
Binary file added src/assets/monofont/1_30.data.gz
Binary file not shown.
Loading

0 comments on commit 9d57763

Please sign in to comment.