feat: add characters

This commit is contained in:
2026-07-10 00:56:58 +03:30
parent 7c067d36f2
commit 97d156c492
28 changed files with 486 additions and 94 deletions
@@ -68,18 +68,18 @@ class HokmGame extends FlameGame {
// ضربانِ قلبِ نوبتِ کاربر (منطق در TurnHeartbeat جدا شده است).
final TurnHeartbeat _heart = TurnHeartbeat();
/// فرشِ انتخابی؛ 'classic' یعنی سطحِ میزِ ترسیمی. فرشِ تصویری به‌عنوانِ سطحِ
/// میز (بریده در شکلِ میز) روی زمینِ لاجوردی کشیده می‌شود.
final String carpet;
/// URL کاملِ تصویرِ فرش (از سرور)؛ خالی یعنی میزِ ترسیمیِ کلاسیک. فرشِ تصویری
/// به‌عنوانِ سطحِ میز (بریده در شکلِ میز) روی زمینِ لاجوردی کشیده می‌شود.
final String carpetUrl;
HokmGame(this.cubit, {this.skin = 'simple', this.carpet = 'classic'});
HokmGame(this.cubit, {this.skin = 'simple', this.carpetUrl = ''});
@override
Color backgroundColor() => AppColors.lapisNight;
@override
Future<void> onLoad() async {
add(Felt(carpet: carpet));
add(Felt(carpetUrl: carpetUrl));
if (!AppSettings.I.lowGraphics.value) {
add(Motes()); // ذراتِ طلاییِ معلق برای اتمسفر (در حالتِ کم‌مصرف خاموش)
}
@@ -16,19 +16,19 @@ const _goldDark = AppColors.goldDark;
/// اگر فرشی انتخاب شده باشد، سطحِ میز تصویرِ فرش است (بریده‌شده در شکلِ میز)؛
/// وگرنه سطحِ سرمه‌ایِ ترسیمی. کارت‌ها داخلِ همین ناحیه انداخته می‌شوند.
class Felt extends PositionComponent with HasGameReference {
/// شناسه‌ی فرشِ انتخابی؛ 'classic' یعنی سطحِ ترسیمی (بدون تصویر).
final String carpet;
Felt({this.carpet = 'classic'});
/// URL کاملِ تصویرِ فرش (از سرور)؛ خالی یعنی سطحِ ترسیمیِ کلاسیک (بدون تصویر).
final String carpetUrl;
Felt({this.carpetUrl = ''});
Sprite? _carpetSprite;
Sprite? _bgSprite; // پس‌زمینه‌ی نقاشی‌شده (اختیاری، قابلِ تعویض)
bool get _hasCarpet => carpet != 'classic';
bool get _hasCarpet => carpetUrl.isNotEmpty;
@override
Future<void> onLoad() async {
if (_hasCarpet) {
_carpetSprite = await CardImages.carpet(carpet);
_carpetSprite = await CardImages.carpetByUrl(carpetUrl);
}
// پس‌زمینه‌ی سفارشی (تالار/کاخ): فایلِ assets/images/game_bg.jpg را بگذارید.
// اگر نبود یا حالتِ کم‌مصرف باشد، به گرادیانِ لاجوردیِ پیش‌فرض برمی‌گردد.
@@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:random_avatar/random_avatar.dart';
import '../../../../core/network/ws_client.dart';
import '../../../../core/theme/app_theme.dart';
import '../../../../core/theme/frames.dart';
import '../../../../core/theme/ranks.dart';
import '../../../../core/widgets/player_avatar.dart';
import '../../domain/entities/game_entities.dart';
import '../bloc/game_state.dart';
@@ -91,8 +91,12 @@ class _PlayerSeat extends StatelessWidget {
color: Colors.white70,
size: diameter * 0.5,
)
: RandomAvatar(
player.avatarSeed.isEmpty ? '?' : player.avatarSeed),
: PlayerAvatar(
seed: player.avatarSeed.isEmpty
? '?'
: player.avatarSeed,
imageUrl: player.avatarImg,
),
),
),
),