init
@@ -0,0 +1,37 @@
|
|||||||
|
# Godot 4.x
|
||||||
|
.godot/
|
||||||
|
.idea/
|
||||||
|
sdk/
|
||||||
|
bin/
|
||||||
|
obj/
|
||||||
|
|
||||||
|
#ai
|
||||||
|
.omo/
|
||||||
|
.opencode/
|
||||||
|
|
||||||
|
gen/
|
||||||
|
obj/
|
||||||
|
bin/
|
||||||
|
|
||||||
|
*.tres~
|
||||||
|
*.tscn~
|
||||||
|
|
||||||
|
# GDScript LSP
|
||||||
|
.godot/
|
||||||
|
|
||||||
|
# Export
|
||||||
|
*.exe
|
||||||
|
*.dmg
|
||||||
|
*.apk
|
||||||
|
*.aab
|
||||||
|
*.pck
|
||||||
|
*.zip
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Editor
|
||||||
|
*.import
|
||||||
|
*.godot.uid
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
# --- scenes/battle/winground.tscn ---
|
||||||
|
mod_interface_name = Interface
|
||||||
|
mod_interface_desc = Game interface
|
||||||
|
ui/battle/victory = Victory
|
||||||
|
ui/battle/victory/return = Continue
|
||||||
|
ui/battle/victory/loot_title = Loot:
|
||||||
|
|
||||||
|
# --- scenes/battle/deadground.tscn ---
|
||||||
|
ui/battle/defeat = Defeat
|
||||||
|
ui/battle/endgame/to_main_menu = Main menu
|
||||||
|
|
||||||
|
# --- scenes/battle/battle.tscn ---
|
||||||
|
ui/battle/next = End turn
|
||||||
|
|
||||||
|
# --- scenes/menu/main_menu.tscn ---
|
||||||
|
menu/newgame = New Game
|
||||||
|
ui/menu/load = Load
|
||||||
|
menu/settings = Settings
|
||||||
|
menu/exit = Exit
|
||||||
|
menu/tools = Tools
|
||||||
|
|
||||||
|
# --- Mods Menu ---
|
||||||
|
menu/mods = Mods
|
||||||
|
mods/title = Mods
|
||||||
|
mods/enable = Enable
|
||||||
|
mods/disable = Disable
|
||||||
|
mods/enabled = Enabled
|
||||||
|
mods/disabled = Disabled
|
||||||
|
mods/disabled_reason = Disabled
|
||||||
|
mods/dep_disabled_reason = Dependency "{0}" is disabled
|
||||||
|
mods/dependency_disabled = Dependency disabled
|
||||||
|
mods/invalid_dep_format = Invalid dependency format: "{0}"
|
||||||
|
mods/required_mod_not_loaded = Required mod "{0}" is not loaded
|
||||||
|
mods/version_mismatch = Version mismatch: requires {0}, found {1}
|
||||||
|
mods/restart_required = Restart required for changes to take effect
|
||||||
|
mods/back = Back
|
||||||
|
mods/author = Author
|
||||||
|
mods/version = Version
|
||||||
|
mods/depends = Dependencies
|
||||||
|
mods/used_by = Used by
|
||||||
|
mods/overrides_title = Overrides
|
||||||
|
mods/reset_order = Reset Order
|
||||||
|
mods/reset_order_title = Reset Order
|
||||||
|
mods/reset_order_text = Are you sure you want to reset the mod order? It will be recalculated automatically
|
||||||
|
mods/reset_order_confirm = Yes
|
||||||
|
mods/reset_order_cancel = Cancel
|
||||||
|
mods/tab_device = Device
|
||||||
|
mods/tab_network = Network
|
||||||
|
mods/network_refresh = Refresh
|
||||||
|
mods/network_loading = Loading catalog...
|
||||||
|
mods/network_ready = Catalog loaded
|
||||||
|
mods/network_empty = No mods in catalog
|
||||||
|
mods/network_error = Failed to load catalog
|
||||||
|
mods/network_no_urls = No catalog URLs configured
|
||||||
|
mods/status_installed = Installed
|
||||||
|
mods/status_update_available = Update available
|
||||||
|
mods/status_not_installed = Not installed
|
||||||
|
mods/status_modified = Modified locally
|
||||||
|
mods/catalog_export = Export to Catalog
|
||||||
|
mods/catalog_title = Export Catalog Entry
|
||||||
|
mods/catalog_download_url = Download URL
|
||||||
|
mods/catalog_category = Category
|
||||||
|
mods/category_story = Story
|
||||||
|
mods/category_characters = Characters
|
||||||
|
mods/category_gameplay = Gameplay
|
||||||
|
mods/category_visual = Visual
|
||||||
|
mods/category_audio = Audio
|
||||||
|
mods/category_ui = UI
|
||||||
|
mods/category_locale = Locale
|
||||||
|
mods/category_library = Library
|
||||||
|
mods/category_overhaul = Overhaul
|
||||||
|
mods/category_other = Other
|
||||||
|
mods/catalog_tags = Tags (comma-separated)
|
||||||
|
mods/catalog_changelog = Changelog
|
||||||
|
mods/catalog_status = Status
|
||||||
|
mods/catalog_min_game_version = Min Game Version
|
||||||
|
mods/catalog_icon_url = Icon URL
|
||||||
|
mods/catalog_copy = Copy JSON
|
||||||
|
mods/catalog_export_file = Export to File
|
||||||
|
mods/catalog_close = Close
|
||||||
|
mods/install_button = Install
|
||||||
|
mods/update_button = Update
|
||||||
|
mods/overwrite_button = Overwrite
|
||||||
|
mods/downgrade_button = Downgrade
|
||||||
|
mods/restart_button = Restart required
|
||||||
|
mods/installing = Installing...
|
||||||
|
mods/install_complete = Install complete. Restart required.
|
||||||
|
mods/install_failed = Install failed. Check log for details.
|
||||||
|
|
||||||
|
# --- Save/Load ---
|
||||||
|
ui/load/title = Load
|
||||||
|
ui/save/title = Save
|
||||||
|
ui/save/empty = Empty
|
||||||
|
ui/save/overwrite_title = Overwrite save
|
||||||
|
ui/save/overwrite_text = A save already exists in this slot. Overwrite?
|
||||||
|
ui/save/save_button = Overwrite
|
||||||
|
ui/save/cancel_button = Cancel
|
||||||
|
ui/save/game_day = Day {day}, {time}
|
||||||
|
ui/save/party_size = Party: {count}
|
||||||
|
|
||||||
|
# --- GameMenu ---
|
||||||
|
menu/resume = Resume
|
||||||
|
menu/save = Save
|
||||||
|
menu/load = Load
|
||||||
|
menu/main_menu = Main menu
|
||||||
|
|
||||||
|
# --- Character Panel ---
|
||||||
|
ui/character_panel/title = Character Actions
|
||||||
|
ui/character_panel/reset = Reset
|
||||||
|
ui/character_panel/close = Close
|
||||||
|
ui/character_panel/reset_title = Reset Action Assignments
|
||||||
|
ui/character_panel/reset_text = Are you sure you want to reset all action assignments? Character actions will return to defaults, collected actions will stay in the pool.
|
||||||
|
ui/character_panel/reset_ok = Reset
|
||||||
|
ui/character_panel/reset_cancel = Cancel
|
||||||
|
|
||||||
|
# --- Inventory ---
|
||||||
|
ui/inventory/title = Inventory
|
||||||
|
ui/inventory/use = Use
|
||||||
|
ui/inventory/drop = Drop
|
||||||
|
ui/inventory/drop_all = All
|
||||||
|
ui/inventory/drop_confirm = Drop
|
||||||
|
ui/inventory/drop_quantity = Drop
|
||||||
|
ui/inventory/close = Close
|
||||||
|
ui/inventory/no_ap = Not enough AP
|
||||||
|
ui/inventory/select_target = Select target
|
||||||
|
ui/inventory/cancel = Cancel
|
||||||
|
|
||||||
|
# --- Map ---
|
||||||
|
ui/map/close = Close
|
||||||
|
|
||||||
|
# --- Quest Journal ---
|
||||||
|
ui/journal/title = Journal
|
||||||
|
ui/journal/active = Active
|
||||||
|
ui/journal/completed = Completed
|
||||||
|
ui/journal/close = Close
|
||||||
|
ui/journal/empty = No quests
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
# --- scenes/battle/winground.tscn ---
|
||||||
|
ui/battle/victory = Победа
|
||||||
|
ui/battle/victory/return = Продолжить
|
||||||
|
ui/battle/victory/loot_title = Добыча:
|
||||||
|
|
||||||
|
# --- scenes/battle/deadground.tscn ---
|
||||||
|
ui/battle/defeat = Поражение
|
||||||
|
ui/battle/endgame/to_main_menu = Главное меню
|
||||||
|
|
||||||
|
# --- scenes/battle/battle.tscn ---
|
||||||
|
ui/battle/next = Конец хода
|
||||||
|
|
||||||
|
# --- scenes/menu/main_menu.tscn ---
|
||||||
|
menu/newgame = Новая игра
|
||||||
|
ui/menu/load = Загрузить
|
||||||
|
menu/settings = Настройки
|
||||||
|
menu/exit = Выход
|
||||||
|
menu/tools = Инструменты
|
||||||
|
|
||||||
|
# --- Mods Menu ---
|
||||||
|
menu/mods = Моды
|
||||||
|
mods/title = Моды
|
||||||
|
mods/enable = Включить
|
||||||
|
mods/disable = Выключить
|
||||||
|
mods/enabled = Включён
|
||||||
|
mods/disabled = Выключен
|
||||||
|
mods/disabled_reason = Выключен
|
||||||
|
mods/dep_disabled_reason = Зависимость "{0}" выключена
|
||||||
|
mods/dependency_disabled = Зависимость отключена
|
||||||
|
mods/invalid_dep_format = Неверный формат зависимости: "{0}"
|
||||||
|
mods/required_mod_not_loaded = Требуемый мод "{0}" не загружен
|
||||||
|
mods/version_mismatch = Несовпадение версий: требуется {0}, найдена {1}
|
||||||
|
mods/restart_required = Перезапустите игру для применения изменений
|
||||||
|
mods/back = Назад
|
||||||
|
mods/author = Автор
|
||||||
|
mods/version = Версия
|
||||||
|
mods/depends = Зависимости
|
||||||
|
mods/used_by = Используется
|
||||||
|
mods/overrides_title = Переопределения
|
||||||
|
mods/reset_order = Сбросить порядок
|
||||||
|
mods/reset_order_title = Сброс порядка
|
||||||
|
mods/reset_order_text = Вы действительно хотите сбросить порядок модов? Он будет рассчитан автоматически заново
|
||||||
|
mods/reset_order_confirm = Да
|
||||||
|
mods/reset_order_cancel = Отмена
|
||||||
|
mods/tab_device = Устройство
|
||||||
|
mods/tab_network = Сеть
|
||||||
|
mods/network_refresh = Обновить
|
||||||
|
mods/network_loading = Загрузка каталога...
|
||||||
|
mods/network_ready = Каталог загружен
|
||||||
|
mods/network_empty = В каталоге нет модов
|
||||||
|
mods/network_error = Ошибка загрузки каталога
|
||||||
|
mods/network_no_urls = Не настроены URL каталогов
|
||||||
|
mods/status_installed = Установлен
|
||||||
|
mods/status_update_available = Доступно обновление
|
||||||
|
mods/status_not_installed = Не установлен
|
||||||
|
mods/status_modified = Изменён локально
|
||||||
|
mods/catalog_export = Экспорт в каталог
|
||||||
|
mods/catalog_title = Экспорт записи каталога
|
||||||
|
mods/catalog_download_url = URL скачивания
|
||||||
|
mods/catalog_category = Категория
|
||||||
|
mods/category_story = Сюжет
|
||||||
|
mods/category_characters = Персонажи
|
||||||
|
mods/category_gameplay = Геймплей
|
||||||
|
mods/category_visual = Визуал
|
||||||
|
mods/category_audio = Аудио
|
||||||
|
mods/category_ui = Интерфейс
|
||||||
|
mods/category_locale = Перевод
|
||||||
|
mods/category_library = Библиотека
|
||||||
|
mods/category_overhaul = Тотальная конверсия
|
||||||
|
mods/category_other = Прочее
|
||||||
|
mods/catalog_tags = Теги (через запятую)
|
||||||
|
mods/catalog_changelog = Список изменений
|
||||||
|
mods/catalog_status = Статус
|
||||||
|
mods/catalog_min_game_version = Мин. версия игры
|
||||||
|
mods/catalog_icon_url = URL иконки
|
||||||
|
mods/catalog_copy = Копировать JSON
|
||||||
|
mods/catalog_export_file = Экспорт в файл
|
||||||
|
mods/catalog_close = Закрыть
|
||||||
|
mods/install_button = Установить
|
||||||
|
mods/update_button = Обновить
|
||||||
|
mods/overwrite_button = Перезаписать
|
||||||
|
mods/downgrade_button = Даунгрейд
|
||||||
|
mods/restart_button = Перезапуск
|
||||||
|
mods/installing = Установка...
|
||||||
|
mods/install_complete = Установка завершена. Требуется перезапуск.
|
||||||
|
mods/install_failed = Ошибка установки. Подробности в логе.
|
||||||
|
|
||||||
|
# --- Save/Load ---
|
||||||
|
ui/load/title = Загрузка
|
||||||
|
ui/save/title = Сохранение
|
||||||
|
ui/save/empty = Пусто
|
||||||
|
ui/save/overwrite_title = Перезаписать сохранение
|
||||||
|
ui/save/overwrite_text = Сохранение в этом слоте уже существует. Перезаписать?
|
||||||
|
ui/save/save_button = Перезаписать
|
||||||
|
ui/save/cancel_button = Отмена
|
||||||
|
ui/save/game_day = День {day}, {time}
|
||||||
|
ui/save/party_size = Отряд: {count}
|
||||||
|
|
||||||
|
# --- GameMenu ---
|
||||||
|
menu/resume = Вернуться
|
||||||
|
menu/save = Сохранить
|
||||||
|
menu/load = Загрузить
|
||||||
|
menu/main_menu = Главное меню
|
||||||
|
|
||||||
|
# --- Character Panel ---
|
||||||
|
ui/character_panel/title = Действия персонажей
|
||||||
|
ui/character_panel/reset = Сброс
|
||||||
|
ui/character_panel/close = Закрыть
|
||||||
|
ui/character_panel/reset_title = Сбросить распределение действий
|
||||||
|
ui/character_panel/reset_text = Вы уверены, что хотите сбросить распределение всех действий? Действия персонажей вернутся к исходным, собранные действия останутся в пуле.
|
||||||
|
ui/character_panel/reset_ok = Сбросить
|
||||||
|
ui/character_panel/reset_cancel = Отмена
|
||||||
|
|
||||||
|
# --- Inventory ---
|
||||||
|
ui/inventory/title = Инвентарь
|
||||||
|
ui/inventory/use = Использовать
|
||||||
|
ui/inventory/drop = Выбросить
|
||||||
|
ui/inventory/drop_all = Все
|
||||||
|
ui/inventory/drop_confirm = Выбросить
|
||||||
|
ui/inventory/drop_quantity = Выбросить
|
||||||
|
ui/inventory/close = Закрыть
|
||||||
|
ui/inventory/no_ap = Недостаточно ОД
|
||||||
|
ui/inventory/select_target = Выберите цель
|
||||||
|
ui/inventory/cancel = Отмена
|
||||||
|
|
||||||
|
# --- Map ---
|
||||||
|
ui/map/close = Закрыть
|
||||||
|
|
||||||
|
# --- Quest Journal ---
|
||||||
|
ui/journal/title = Журнал
|
||||||
|
ui/journal/active = В процессе
|
||||||
|
ui/journal/completed = Завершённые
|
||||||
|
ui/journal/close = Закрыть
|
||||||
|
ui/journal/empty = Нет квестов
|
||||||
|
mod_interface_name = Интерфейс
|
||||||
|
mod_interface_desc = Игровой интерфейс
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"id": "interface",
|
||||||
|
"name": "Interface",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"author": "ct",
|
||||||
|
"description": "Game interface",
|
||||||
|
"depends": ["core>=1"]
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
shader_type canvas_item;
|
||||||
|
render_mode blend_premul_alpha;
|
||||||
|
|
||||||
|
uniform int hide_mode : hint_range(0, 1) = 0;
|
||||||
|
uniform vec4 outline_color : source_color = vec4(0.0, 0.0, 0.0, 1.0);
|
||||||
|
uniform vec4 invert_outline_color : source_color = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
|
uniform vec2 pixel_size = vec2(0.001953125, 0.001953125);
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec4 color = texture(TEXTURE, UV) * COLOR;
|
||||||
|
|
||||||
|
#ifdef ALPHA_CLIP
|
||||||
|
if (color.a < 0.001)
|
||||||
|
discard;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (hide_mode > 0) {
|
||||||
|
color.r = 0.0;
|
||||||
|
color.g = 0.0;
|
||||||
|
color.b = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (color.a > 0.99) {
|
||||||
|
COLOR = color;
|
||||||
|
} else {
|
||||||
|
float max_alpha = 0.0;
|
||||||
|
|
||||||
|
for (int x = -2; x <= 2; x++) {
|
||||||
|
for (int y = -2; y <= 2; y++) {
|
||||||
|
if (x == 0 && y == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
vec2 offset = vec2(float(x), float(y)) * pixel_size;
|
||||||
|
float neighbor_alpha = texture(TEXTURE, UV + offset).a;
|
||||||
|
max_alpha = max(max_alpha, neighbor_alpha);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max_alpha > 0.99) {
|
||||||
|
if (hide_mode > 0)
|
||||||
|
COLOR = invert_outline_color;
|
||||||
|
else
|
||||||
|
COLOR = outline_color;
|
||||||
|
} else {
|
||||||
|
COLOR = color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
shader_type canvas_item;
|
||||||
|
render_mode blend_premul_alpha;
|
||||||
|
|
||||||
|
uniform vec4 tint : source_color = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec4 color = texture(TEXTURE, UV) * COLOR * tint;
|
||||||
|
|
||||||
|
#ifdef ALPHA_CLIP
|
||||||
|
if (color.a < 0.001)
|
||||||
|
discard;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
COLOR = color;
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
shader_type canvas_item;
|
||||||
|
render_mode blend_premul_alpha;
|
||||||
|
|
||||||
|
uniform float frame_index : hint_range(0.0, 1024.0) = 0.0;
|
||||||
|
uniform float frame_count : hint_range(1.0, 1024.0) = 5.0;
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
float frame_width = 1.0 / frame_count;
|
||||||
|
float frame_u = frame_index * frame_width;
|
||||||
|
vec2 uv = UV;
|
||||||
|
uv.x = uv.x * frame_width + frame_u;
|
||||||
|
|
||||||
|
vec4 color = texture(TEXTURE, uv) * COLOR;
|
||||||
|
|
||||||
|
float luma = dot(color.rgb, vec3(0.299, 0.587, 0.114));
|
||||||
|
color.a *= luma;
|
||||||
|
|
||||||
|
#ifdef ALPHA_CLIP
|
||||||
|
if (color.a < 0.001)
|
||||||
|
discard;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
COLOR = color;
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
shader_type canvas_item;
|
||||||
|
|
||||||
|
uniform vec4 modulate_color : source_color = vec4(0.0);
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec4 tex = texture(TEXTURE, UV);
|
||||||
|
COLOR = tex;
|
||||||
|
COLOR.rgb = mix(COLOR.rgb, modulate_color.rgb, modulate_color.a);
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
// Array and textureless GLSL 2D/3D/4D simplex noise functions.
|
||||||
|
// Ported from Ashima Arts webgl-noise (MIT License).
|
||||||
|
// https://github.com/ashima/webgl-noise
|
||||||
|
|
||||||
|
vec3 mod289_vec3(vec3 x) {
|
||||||
|
return x - floor(x * (1.0 / 289.0)) * 289.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 mod289_vec4(vec4 x) {
|
||||||
|
return x - floor(x * (1.0 / 289.0)) * 289.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 permute(vec4 x) {
|
||||||
|
return mod289_vec4(((x * 34.0) + 1.0) * x);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 taylor_inv_sqrt(vec4 r) {
|
||||||
|
return 1.79284291400159 - 0.85373472095314 * r;
|
||||||
|
}
|
||||||
|
|
||||||
|
float snoise(vec3 v) {
|
||||||
|
const vec2 C = vec2(1.0 / 6.0, 1.0 / 3.0);
|
||||||
|
const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);
|
||||||
|
|
||||||
|
vec3 i = floor(v + dot(v, C.yyy));
|
||||||
|
vec3 x0 = v - i + dot(i, C.xxx);
|
||||||
|
|
||||||
|
vec3 g = step(x0.yzx, x0.xyz);
|
||||||
|
vec3 l = 1.0 - g;
|
||||||
|
vec3 i1 = min(g.xyz, l.zxy);
|
||||||
|
vec3 i2 = max(g.xyz, l.zxy);
|
||||||
|
|
||||||
|
vec3 x1 = x0 - i1 + C.xxx;
|
||||||
|
vec3 x2 = x0 - i2 + C.yyy;
|
||||||
|
vec3 x3 = x0 - D.yyy;
|
||||||
|
|
||||||
|
i = mod289_vec3(i);
|
||||||
|
vec4 p = permute(permute(permute(
|
||||||
|
i.z + vec4(0.0, i1.z, i2.z, 1.0))
|
||||||
|
+ i.y + vec4(0.0, i1.y, i2.y, 1.0))
|
||||||
|
+ i.x + vec4(0.0, i1.x, i2.x, 1.0));
|
||||||
|
|
||||||
|
float n_ = 0.142857142857;
|
||||||
|
vec3 ns = n_ * D.wyz - D.xzx;
|
||||||
|
|
||||||
|
vec4 j = p - 49.0 * floor(p * ns.z * ns.z);
|
||||||
|
|
||||||
|
vec4 x_ = floor(j * ns.z);
|
||||||
|
vec4 y_ = floor(j - 7.0 * x_);
|
||||||
|
|
||||||
|
vec4 x = x_ * ns.x + ns.yyyy;
|
||||||
|
vec4 y = y_ * ns.x + ns.yyyy;
|
||||||
|
vec4 h = 1.0 - abs(x) - abs(y);
|
||||||
|
|
||||||
|
vec4 b0 = vec4(x.xy, y.xy);
|
||||||
|
vec4 b1 = vec4(x.zw, y.zw);
|
||||||
|
|
||||||
|
vec4 s0 = floor(b0) * 2.0 + 1.0;
|
||||||
|
vec4 s1 = floor(b1) * 2.0 + 1.0;
|
||||||
|
vec4 sh = -step(h, vec4(0.0, 0.0, 0.0, 0.0));
|
||||||
|
|
||||||
|
vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;
|
||||||
|
vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww;
|
||||||
|
|
||||||
|
vec3 p0 = vec3(a0.xy, h.x);
|
||||||
|
vec3 p1 = vec3(a0.zw, h.y);
|
||||||
|
vec3 p2 = vec3(a1.xy, h.z);
|
||||||
|
vec3 p3 = vec3(a1.zw, h.w);
|
||||||
|
|
||||||
|
vec4 norm = taylor_inv_sqrt(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));
|
||||||
|
p0 *= norm.x;
|
||||||
|
p1 *= norm.y;
|
||||||
|
p2 *= norm.z;
|
||||||
|
p3 *= norm.w;
|
||||||
|
|
||||||
|
vec4 m = max(0.6 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0);
|
||||||
|
m = m * m;
|
||||||
|
return 42.0 * dot(m * m, vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)));
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
shader_type canvas_item;
|
||||||
|
render_mode blend_premul_alpha;
|
||||||
|
|
||||||
|
uniform float pixel_size : hint_range(0.1, 1000.0) = 1.0;
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec2 pixel_scale = SCREEN_PIXEL_SIZE * pixel_size;
|
||||||
|
vec2 pixel_uv = floor(SCREEN_UV / pixel_scale) * pixel_scale;
|
||||||
|
|
||||||
|
vec4 color = texture(TEXTURE, pixel_uv) * COLOR;
|
||||||
|
|
||||||
|
#ifdef ALPHA_CLIP
|
||||||
|
if (color.a < 0.001)
|
||||||
|
discard;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
COLOR = color;
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
shader_type canvas_item;
|
||||||
|
render_mode blend_disabled;
|
||||||
|
|
||||||
|
uniform sampler2D screen_texture : hint_screen_texture, filter_nearest;
|
||||||
|
uniform float pixel_size : hint_range(0.1, 1000.0) = 1.0;
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec2 pixel_scale = SCREEN_PIXEL_SIZE * pixel_size;
|
||||||
|
vec2 pixel_uv = floor(SCREEN_UV / pixel_scale) * pixel_scale;
|
||||||
|
COLOR = texture(screen_texture, pixel_uv);
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
shader_type canvas_item;
|
||||||
|
render_mode blend_premul_alpha;
|
||||||
|
|
||||||
|
uniform vec4 tint : source_color = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
|
uniform float noise_scale : hint_range(1.0, 100.0) = 20.0;
|
||||||
|
uniform float smoothness : hint_range(0.0, 0.5) = 0.1;
|
||||||
|
uniform float progress : hint_range(0.0, 1.0) = 0.0;
|
||||||
|
uniform bool invert_direction = false;
|
||||||
|
uniform float distortion : hint_range(0.0, 0.5) = 0.05;
|
||||||
|
uniform float hue_shift : hint_range(0.0, 1.0) = 0.2;
|
||||||
|
uniform float glow_intensity : hint_range(0.0, 1.0) = 0.3;
|
||||||
|
|
||||||
|
float random(vec2 uv) {
|
||||||
|
return fract(sin(dot(uv, vec2(12.9898, 78.233))) * 43758.5453);
|
||||||
|
}
|
||||||
|
|
||||||
|
float perlin_noise(vec2 uv) {
|
||||||
|
vec2 i = floor(uv);
|
||||||
|
vec2 f = fract(uv);
|
||||||
|
vec2 u = f * f * (3.0 - 2.0 * f);
|
||||||
|
|
||||||
|
float a = random(i);
|
||||||
|
float b = random(i + vec2(1.0, 0.0));
|
||||||
|
float c = random(i + vec2(0.0, 1.0));
|
||||||
|
float d = random(i + vec2(1.0, 1.0));
|
||||||
|
|
||||||
|
return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
float fractal_noise(vec2 uv, int octaves) {
|
||||||
|
float value = 0.0;
|
||||||
|
float amplitude = 0.5;
|
||||||
|
float frequency = 1.0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
if (i >= octaves)
|
||||||
|
break;
|
||||||
|
value += perlin_noise(uv * frequency) * amplitude;
|
||||||
|
amplitude *= 0.5;
|
||||||
|
frequency *= 2.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 hue_shift_func(vec3 color, float hue) {
|
||||||
|
const vec3 k = vec3(0.57735, 0.57735, 0.57735);
|
||||||
|
float cos_angle = cos(hue);
|
||||||
|
return color * cos_angle + cross(k, color) * sin(hue) + k * dot(k, color) * (1.0 - cos_angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec2 noise_uv = UV * noise_scale;
|
||||||
|
float noise = fractal_noise(noise_uv, 3);
|
||||||
|
|
||||||
|
float distorted_progress = progress + noise * distortion;
|
||||||
|
|
||||||
|
float transition_mask;
|
||||||
|
if (invert_direction)
|
||||||
|
transition_mask = step(distorted_progress, noise);
|
||||||
|
else
|
||||||
|
transition_mask = step(noise, distorted_progress);
|
||||||
|
|
||||||
|
float edge = smoothstep(0.0, smoothness, abs(noise - progress));
|
||||||
|
float alpha = mix(transition_mask, 1.0 - transition_mask, edge);
|
||||||
|
if (invert_direction)
|
||||||
|
alpha = 1.0 - alpha;
|
||||||
|
|
||||||
|
vec4 col = texture(TEXTURE, UV) * COLOR * tint;
|
||||||
|
|
||||||
|
float glow = clamp(abs(noise - progress) / smoothness, 0.0, 1.0) * glow_intensity;
|
||||||
|
col.rgb += glow * vec3(1.0, 0.8, 0.5) * col.a;
|
||||||
|
|
||||||
|
if (abs(noise - progress) < smoothness * 2.0) {
|
||||||
|
col.rgb = hue_shift_func(col.rgb, hue_shift);
|
||||||
|
}
|
||||||
|
|
||||||
|
col.a *= alpha;
|
||||||
|
COLOR = col;
|
||||||
|
}
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
shader_type canvas_item;
|
||||||
|
render_mode blend_premul_alpha;
|
||||||
|
|
||||||
|
uniform sampler2D depth_mask : source_color, filter_linear;
|
||||||
|
uniform sampler2D albedo_map : source_color, filter_linear;
|
||||||
|
|
||||||
|
uniform float flicker_speed : hint_range(0.0, 100.0) = 5.0;
|
||||||
|
uniform float flicker_strength : hint_range(0.0, 1.0) = 0.3;
|
||||||
|
uniform float flicker_scale : hint_range(0.0, 10.0) = 1.0;
|
||||||
|
|
||||||
|
uniform bool use_time = true;
|
||||||
|
|
||||||
|
uniform vec4 day_color : source_color = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
|
uniform vec4 morning_color : source_color = vec4(0.8207547, 0.6465379, 0.8050903, 1.0);
|
||||||
|
uniform vec4 night_color : source_color = vec4(0.0, 0.13673696, 0.20754719, 1.0);
|
||||||
|
uniform vec4 evening_color : source_color = vec4(0.81671757, 0.7075472, 0.9433962, 1.0);
|
||||||
|
uniform vec4 time_weights = vec4(0.0, 1.0, 0.0, 0.0);
|
||||||
|
|
||||||
|
uniform float light_intensity : hint_range(0.0, 10.0) = 2.0;
|
||||||
|
uniform float light_falloff : hint_range(0.0, 10.0) = 3.0;
|
||||||
|
uniform float light_radius_scale : hint_range(0.0, 10.0) = 1.0;
|
||||||
|
|
||||||
|
uniform vec2 light_positions[11];
|
||||||
|
uniform vec4 light_colors[11];
|
||||||
|
uniform float light_radii[11];
|
||||||
|
uniform float light_influence[11];
|
||||||
|
uniform int light_count;
|
||||||
|
|
||||||
|
varying vec2 world_pos;
|
||||||
|
|
||||||
|
float rand(vec2 co) {
|
||||||
|
return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 calculate_light_color(vec2 wp, out float total_influence) {
|
||||||
|
vec3 combined_color = vec3(0.0, 0.0, 0.0);
|
||||||
|
total_influence = 0.0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 11; i++) {
|
||||||
|
if (i >= light_count)
|
||||||
|
break;
|
||||||
|
|
||||||
|
vec2 light_pos = light_positions[i];
|
||||||
|
float light_radius = light_radii[i] * light_radius_scale;
|
||||||
|
vec3 light_col = light_colors[i].rgb;
|
||||||
|
|
||||||
|
float dist = distance(wp, light_pos);
|
||||||
|
float influence = clamp(1.0 - dist / light_radius, 0.0, 1.0);
|
||||||
|
// Avoid pow with negative base
|
||||||
|
if (influence <= 0.0)
|
||||||
|
continue;
|
||||||
|
influence = pow(influence, light_falloff);
|
||||||
|
|
||||||
|
float flicker_seed = light_pos.x * 1.357 + light_pos.y * 2.468 + float(i) * 3.579;
|
||||||
|
|
||||||
|
float discrete_time = floor(TIME * flicker_speed * 3.0 + flicker_seed) / 3.0;
|
||||||
|
|
||||||
|
float t1 = discrete_time * 2.0;
|
||||||
|
float t2 = discrete_time * 3.0 + 1.2;
|
||||||
|
float t3 = discrete_time * 4.0 + 2.4;
|
||||||
|
|
||||||
|
float flicker1 = floor((sin(t1) * 0.5 + 0.5) * 4.0) / 3.0;
|
||||||
|
float flicker2 = floor((sin(t2) * 0.3 + 0.5) * 3.0) / 2.0;
|
||||||
|
float flicker3 = floor((sin(t3) * 0.2 + 0.5) * 3.0) / 2.0;
|
||||||
|
|
||||||
|
float flicker = flicker1 * 0.5 + flicker2 * 0.3 + flicker3 * 0.2;
|
||||||
|
|
||||||
|
float noise_seed = floor(TIME * flicker_speed * 2.0 + flicker_seed);
|
||||||
|
float noise_val = rand(vec2(noise_seed, flicker_seed)) * 0.15;
|
||||||
|
|
||||||
|
flicker = floor((flicker + noise_val) * 5.0) / 4.0;
|
||||||
|
flicker = clamp(flicker, 0.0, 1.0);
|
||||||
|
|
||||||
|
float flicker_factor = 0.7 + flicker * 0.6 * flicker_strength;
|
||||||
|
flicker_factor = floor(flicker_factor * 8.0) / 7.0;
|
||||||
|
|
||||||
|
influence *= flicker_factor;
|
||||||
|
|
||||||
|
combined_color += light_col * influence * light_intensity * light_influence[i];
|
||||||
|
total_influence += influence * light_intensity * light_influence[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return combined_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vertex() {
|
||||||
|
world_pos = (MODEL_MATRIX * vec4(VERTEX, 0.0, 1.0)).xy;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec4 color = texture(TEXTURE, UV) * COLOR;
|
||||||
|
float a = color.a;
|
||||||
|
|
||||||
|
float depth = texture(depth_mask, UV).r;
|
||||||
|
float albedo = texture(albedo_map, UV).r;
|
||||||
|
|
||||||
|
#ifdef ALPHA_CLIP
|
||||||
|
if (color.a < 0.001)
|
||||||
|
discard;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!use_time) {
|
||||||
|
COLOR = color;
|
||||||
|
} else {
|
||||||
|
vec4 weights = time_weights;
|
||||||
|
|
||||||
|
vec4 time_color = morning_color * weights.x
|
||||||
|
+ day_color * weights.y
|
||||||
|
+ evening_color * weights.z
|
||||||
|
+ night_color * weights.w;
|
||||||
|
|
||||||
|
float total_influence;
|
||||||
|
vec3 light_col = calculate_light_color(world_pos, total_influence);
|
||||||
|
total_influence = clamp(total_influence, 0.0, 1.0);
|
||||||
|
|
||||||
|
float light_infl = clamp(mix(light_col.r, 0.0, weights.y + weights.x + weights.z) * depth, 0.0, 1.0);
|
||||||
|
|
||||||
|
float pixel_luma = max(dot(color.rgb, vec3(0.299, 0.587, 0.114)), 0.01);
|
||||||
|
float target_luma = max(albedo, pixel_luma);
|
||||||
|
float lift = mix(1.0, target_luma / pixel_luma, light_infl);
|
||||||
|
|
||||||
|
vec3 lit_result = min(color.rgb * lift * light_col, 1.0);
|
||||||
|
|
||||||
|
COLOR.rgb = mix(color.rgb * time_color.rgb, lit_result, light_infl);
|
||||||
|
COLOR.a = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 438 B |
|
After Width: | Height: | Size: 119 B |
|
After Width: | Height: | Size: 352 B |
|
After Width: | Height: | Size: 120 B |
|
After Width: | Height: | Size: 119 B |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 6.5 KiB |
|
After Width: | Height: | Size: 390 B |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 20 KiB |