Untitled
unknown
plain_text
a month ago
78 kB
3
Indexable
import 'dart:math'; class Time { /// Converts a solar date to Julian Day Number (JDN) static int jdFromDate(int day, int month, int year) { final a = ((14 - month) / 12).floor(); final y = year + 4800 - a; final m = month + 12 * a - 3; var jd = day + ((153 * m + 2) / 5).floor() + 365 * y + (y / 4).floor() - (y / 100).floor() + (y / 400).floor() - 32045; if (jd < 2299161) { jd = day + ((153 * m + 2) / 5).floor() + 365 * y + (y / 4).floor() - 32083; } return jd; } /// Converts Julian Day Number (JDN) to solar date static List<int> jdToDate(int jd) { int a, b, c; if (jd > 2299160) { a = jd + 32044; b = ((4 * a + 3) / 146097).floor(); c = a - ((b * 146097) / 4).floor(); } else { b = 0; c = jd + 32082; } final d = ((4 * c + 3) / 1461).floor(); final e = c - ((1461 * d) / 4).floor(); final m = ((5 * e + 2) / 153).floor(); final day = e - ((153 * m + 2) / 5).floor() + 1; final month = m + 3 - 12 * (m / 10).floor(); final year = b * 100 + d - 4800 + (m / 10).floor(); return [day, month, year]; } /// Calculates the Julian Day Number of the k-th new moon static double newMoon(int k) { final T = k / 1236.85; final T2 = T * T; final T3 = T2 * T; final dr = pi / 180; var Jd1 = 2415020.75933 + 29.53058868 * k + 0.0001178 * T2 - 0.000000155 * T3; Jd1 += 0.00033 * sin((166.56 + 132.87 * T - 0.009173 * T2) * dr); final M = 359.2242 + 29.10535608 * k - 0.0000333 * T2 - 0.00000347 * T3; final Mpr = 306.0253 + 385.81691806 * k + 0.0107306 * T2 + 0.00001236 * T3; final F = 21.2964 + 390.67050646 * k - 0.0016528 * T2 - 0.00000239 * T3; var C1 = (0.1734 - 0.000393 * T) * sin(M * dr) + 0.0021 * sin(2 * dr * M); C1 -= 0.4068 * sin(Mpr * dr) + 0.0161 * sin(2 * dr * Mpr); C1 -= 0.0004 * sin(3 * dr * Mpr); C1 += 0.0104 * sin(2 * dr * F) - 0.0051 * sin((M + Mpr) * dr); C1 -= 0.0074 * sin((M - Mpr) * dr) + 0.0004 * sin((2 * F + M) * dr); C1 -= 0.0004 * sin((2 * F - M) * dr) - 0.0006 * sin((2 * F + Mpr) * dr); C1 += 0.0010 * sin((2 * F - Mpr) * dr) + 0.0005 * sin((2 * Mpr + M) * dr); final deltat = (T < -11) ? 0.001 + 0.000839 * T + 0.0002261 * T2 - 0.00000845 * T3 - 0.000000081 * T * T3 : -0.000278 + 0.000265 * T + 0.000262 * T2; return Jd1 + C1 - deltat; } /// Gets the Julian Day Number of the k-th new moon static int getNewMoonDay(int k, int timeZone) { return (newMoon(k) + 0.5 + timeZone / 24).floor(); } /// Gets the sun's longitude at a given Julian Day Number static int getSunLongitude(int jdn, int timeZone) { final T = (jdn - 2451545.5 - timeZone / 24) / 36525; final T2 = T * T; final dr = pi / 180; final M = 357.52910 + 35999.05030 * T - 0.0001559 * T2 - 0.00000048 * T2 * T; final L0 = 280.46645 + 36000.76983 * T + 0.0003032 * T2; var DL = (1.914600 - 0.004817 * T - 0.000014 * T2) * sin(dr * M); DL += (0.019993 - 0.000101 * T) * sin(dr * 2 * M) + 0.000290 * sin(dr * 3 * M); var L = L0 + DL; final omega = 125.04 - 1934.136 * T; L = L - 0.00569 - 0.00478 * sin(omega * dr); L = L * dr; L = L - pi * 2 * (L / (pi * 2)).floor(); return (L / pi * 6).floor(); } /// Gets the Julian Day Number of the 11th month of the lunar year static int getLunarMonth11(int year, int timeZone) { final off = jdFromDate(31, 12, year) - 2415021; final k = (off / 29.530588853).floor(); var nm = getNewMoonDay(k, timeZone); final sunLong = getSunLongitude(nm, timeZone); if (sunLong >= 9) { nm = getNewMoonDay(k - 1, timeZone); } return nm; } /// Gets the offset of the leap month static int getLeapMonthOffset(int a11, int timeZone) { final k = ((a11 - 2415021.076998695) / 29.530588853 + 0.5).floor(); var i = 1; var arc = getSunLongitude(getNewMoonDay(k + i, timeZone), timeZone); var last = arc; while (true) { last = arc; i++; arc = getSunLongitude(getNewMoonDay(k + i, timeZone), timeZone); if (!(arc != last && i < 14)) { break; } } return i - 1; } /// Converts a solar date to lunar date /// Returns a list containing [lunarDay, lunarMonth, lunarYear, isLeapMonth] static List<int> S2L(int day, int month, int year, [int timeZone = 7]) { final dayNumber = jdFromDate(day, month, year); final k = ((dayNumber - 2415021.076998695) / 29.530588853).floor(); var monthStart = getNewMoonDay(k + 1, timeZone); if (monthStart > dayNumber) { monthStart = getNewMoonDay(k, timeZone); } var a11 = getLunarMonth11(year, timeZone); var b11 = a11; int lunarYear; if (a11 >= monthStart) { lunarYear = year; a11 = getLunarMonth11(year - 1, timeZone); } else { lunarYear = year + 1; b11 = getLunarMonth11(year + 1, timeZone); } final lunarDay = dayNumber - monthStart + 1; final diff = ((monthStart - a11) / 29).floor(); var lunarLeap = 0; var lunarMonth = diff + 11; if (b11 - a11 > 365) { final leapMonthDiff = getLeapMonthOffset(a11, timeZone); if (diff >= leapMonthDiff) { lunarMonth = diff + 10; if (diff == leapMonthDiff) { lunarLeap = 1; } } } if (lunarMonth > 12) { lunarMonth -= 12; } if (lunarMonth >= 11 && diff < 4) { lunarYear -= 1; } return [lunarDay, lunarMonth, lunarYear, lunarLeap]; } /// Converts a lunar date to solar date static List<int> L2S(int lunarDay, int lunarMonth, int lunarYear, bool isLeapMonth, [int timeZone = 7]) { // Implement the conversion logic here // This is a placeholder implementation return [lunarDay, lunarMonth, lunarYear]; // Replace with actual conversion logic } } class AmDuong { /// List of Thien Can (Heavenly Stems) static final List<Map<String, dynamic>> thienCan = [ { 'id': 0, 'chuCaiDau': null, 'tenCan': null, 'nguHanh': null, 'nguHanhID': null, 'vitriDiaBan': null, 'amDuong': null, }, { 'id': 1, 'chuCaiDau': 'G', 'tenCan': 'Giáp', 'nguHanh': 'M', 'nguHanhID': 2, 'vitriDiaBan': 3, 'amDuong': 1, }, { 'id': 2, 'chuCaiDau': 'A', 'tenCan': 'Ất', 'nguHanh': 'M', 'nguHanhID': 2, 'vitriDiaBan': 4, 'amDuong': -1, }, { 'id': 3, 'chuCaiDau': 'B', 'tenCan': 'Bính', 'nguHanh': 'H', 'nguHanhID': 4, 'vitriDiaBan': 6, 'amDuong': 1, }, { 'id': 4, 'chuCaiDau': 'D', 'tenCan': 'Đinh', 'nguHanh': 'H', 'nguHanhID': 4, 'vitriDiaBan': 7, 'amDuong': -1, }, { 'id': 5, 'chuCaiDau': 'M', 'tenCan': 'Mậu', 'nguHanh': 'O', 'nguHanhID': 5, 'vitriDiaBan': 6, 'amDuong': 1, }, { 'id': 6, 'chuCaiDau': 'K', 'tenCan': 'Kỷ', 'nguHanh': 'O', 'nguHanhID': 5, 'vitriDiaBan': 7, 'amDuong': -1, }, { 'id': 7, 'chuCaiDau': 'C', 'tenCan': 'Canh', 'nguHanh': 'K', 'nguHanhID': 1, 'vitriDiaBan': 9, 'amDuong': 1, }, { 'id': 8, 'chuCaiDau': 'T', 'tenCan': 'Tân', 'nguHanh': 'K', 'nguHanhID': 1, 'vitriDiaBan': 10, 'amDuong': -1, }, { 'id': 9, 'chuCaiDau': 'N', 'tenCan': 'Nhâm', 'nguHanh': 'T', 'nguHanhID': 3, 'vitriDiaBan': 12, 'amDuong': 1, }, { 'id': 10, 'chuCaiDau': 'Q', 'tenCan': 'Quý', 'nguHanh': 'T', 'nguHanhID': 3, 'vitriDiaBan': 1, 'amDuong': -1, }, ]; /// List of Dia Chi (Earthly Branches) static final List<Map<String, dynamic>> diaChi = [ {'id': 0, 'tenChi': 'Hem có', 'tenHanh': ':D', 'amDuong': 0}, { 'id': 1, 'tenChi': 'Tý', 'tenHanh': 'T', 'menhChu': 'Tham lang', 'thanChu': 'Linh tinh', 'amDuong': 1, }, { 'id': 2, 'tenChi': 'Sửu', 'tenHanh': 'O', 'menhChu': 'Cự môn', 'thanChu': 'Thiên tướng', 'amDuong': -1, }, { 'id': 3, 'tenChi': 'Dần', 'tenHanh': 'M', 'menhChu': 'Lộc tồn', 'thanChu': 'Thiên lương', 'amDuong': 1, }, { 'id': 4, 'tenChi': 'Mão', 'tenHanh': 'M', 'menhChu': 'Văn khúc', 'thanChu': 'Thiên đồng', 'amDuong': -1, }, { 'id': 5, 'tenChi': 'Thìn', 'tenHanh': 'O', 'menhChu': 'Liêm trinh', 'thanChu': 'Văn xương', 'amDuong': 1, }, { 'id': 6, 'tenChi': 'Tỵ', 'tenHanh': 'H', 'menhChu': 'Vũ khúc', 'thanChu': 'Thiên cơ', 'amDuong': -1, }, { 'id': 7, 'tenChi': 'Ngọ', 'tenHanh': 'H', 'menhChu': 'Phá quân', 'thanChu': 'Hỏa tinh', 'amDuong': 1, }, { 'id': 8, 'tenChi': 'Mùi', 'tenHanh': 'O', 'menhChu': 'Vũ khúc', 'thanChu': 'Thiên tướng', 'amDuong': -1, }, { 'id': 9, 'tenChi': 'Thân', 'tenHanh': 'K', 'menhChu': 'Liêm trinh', 'thanChu': 'Thiên lương', 'amDuong': 1, }, { 'id': 10, 'tenChi': 'Dậu', 'tenHanh': 'K', 'menhChu': 'Văn khúc', 'thanChu': 'Thiên đồng', 'amDuong': -1, }, { 'id': 11, 'tenChi': 'Tuất', 'tenHanh': 'O', 'menhChu': 'Lộc tồn', 'thanChu': 'Văn xương', 'amDuong': 1, }, { 'id': 12, 'tenChi': 'Hợi', 'tenHanh': 'T', 'menhChu': 'Cự môn', 'thanChu': 'Thiên cơ', 'amDuong': -1, }, ]; /// Converts solar date to lunar date static List<int> ngayThangNam(int nn, int tt, int nnnn, {bool duongLich = true, int timeZone = 7}) { int thangNhuan = 0; if (nn > 0 && nn < 32 && tt > 0 && tt < 13) { if (duongLich) { final result = Time.S2L(nn, tt, nnnn, timeZone); nn = result[0]; tt = result[1]; nnnn = result[2]; thangNhuan = result[3]; } return [nn, tt, nnnn, thangNhuan]; } else { throw ArgumentError('Ngày, tháng, năm không chính xác.'); } } /// Calculates Can Chi for day static List<int> canChiNgay(int nn, int tt, int nnnn, {bool duongLich = true, int timeZone = 7, bool thangNhuan = false}) { if (!duongLich) { final result = Time.L2S(nn, tt, nnnn, thangNhuan, timeZone); nn = result[0]; tt = result[1]; nnnn = result[2]; } int jd = Time.jdFromDate(nn, tt, nnnn); int canNgay = ((jd + 9) % 10) + 1; int chiNgay = ((jd + 1) % 12) + 1; return [canNgay, chiNgay]; } /// Calculates Can Chi for month and year static List<int> ngayThangNamCanChi(int nn, int tt, int nnnn, {bool duongLich = true, int timeZone = 7}) { int thangNhuan = 0; if (duongLich) { final result = ngayThangNam(nn, tt, nnnn, timeZone: timeZone); nn = result[0]; tt = result[1]; nnnn = result[2]; thangNhuan = result[3]; } int canThang = ((nnnn * 12 + tt + 3) % 10) + 1; int canNamSinh = ((nnnn + 6) % 10) + 1; int chiNam = ((nnnn + 8) % 12) + 1; return [canThang, canNamSinh, chiNam]; } /// Gets the Five Elements (Ngũ Hành) information static Map<String, dynamic> nguHanh(String tenHanh) { final hanhMap = { 'Kim': {'id': 1, 'tenHanh': 'Kim', 'cuc': 4, 'tenCuc': 'Kim tứ Cục', 'css': 'hanhKim'}, 'K': {'id': 1, 'tenHanh': 'Kim', 'cuc': 4, 'tenCuc': 'Kim tứ Cục', 'css': 'hanhKim'}, 'Moc': {'id': 2, 'tenHanh': 'Mộc', 'cuc': 3, 'tenCuc': 'Mộc tam Cục', 'css': 'hanhMoc'}, 'M': {'id': 2, 'tenHanh': 'Mộc', 'cuc': 3, 'tenCuc': 'Mộc tam Cục', 'css': 'hanhMoc'}, 'Thuy': {'id': 3, 'tenHanh': 'Thủy', 'cuc': 2, 'tenCuc': 'Thủy nhị Cục', 'css': 'hanhThuy'}, 'T': {'id': 3, 'tenHanh': 'Thủy', 'cuc': 2, 'tenCuc': 'Thủy nhị Cục', 'css': 'hanhThuy'}, 'Hoa': {'id': 4, 'tenHanh': 'Hỏa', 'cuc': 6, 'tenCuc': 'Hỏa lục Cục', 'css': 'hanhHoa'}, 'H': {'id': 4, 'tenHanh': 'Hỏa', 'cuc': 6, 'tenCuc': 'Hỏa lục Cục', 'css': 'hanhHoa'}, 'Tho': {'id': 5, 'tenHanh': 'Thổ', 'cuc': 5, 'tenCuc': 'Thổ ngũ Cục', 'css': 'hanhTho'}, 'O': {'id': 5, 'tenHanh': 'Thổ', 'cuc': 5, 'tenCuc': 'Thổ ngũ Cục', 'css': 'hanhTho'}, }; if (hanhMap.containsKey(tenHanh)) { return hanhMap[tenHanh]!; } else { throw ArgumentError('Tên Hành phải thuộc Kim (K), Mộc (M), Thủy (T), Hỏa (H) hoặc Thổ (O)'); } } /// Calculates the relationship between two elements static int? sinhKhac(int hanh1, int hanh2) { final matranSinhKhac = [ [null, null, null, null, null, null], [null, 0, -1, 1, -1, 1], [null, -1, 0, 1, 1, -1], [null, 1, 1, 0, 1, -1], [null, -1, 1, -1, 0, 1], [null, 1, -1, -1, 1, 0], ]; return matranSinhKhac[hanh1][hanh2]; } /// Calculates the Five Elements Nạp Âm static String nguHanhNapAm(int diaChi, int thienCan, {bool xuatBanMenh = false}) { final banMenh = { 'K1': 'HẢI TRUNG KIM', 'T1': 'GIÁNG HẠ THỦY', 'H1': 'TÍCH LỊCH HỎA', 'O1': 'BÍCH THƯỢNG THỔ', 'M1': 'TANG ÐỐ MỘC', 'T2': 'ÐẠI KHÊ THỦY', 'H2': 'LƯ TRUNG HỎA', 'O2': 'THÀNH ÐẦU THỔ', 'M2': 'TÒNG BÁ MỘC', 'K2': 'KIM BẠCH KIM', 'H3': 'PHÚ ÐĂNG HỎA', 'O3': 'SA TRUNG THỔ', 'M3': 'ÐẠI LÂM MỘC', 'K3': 'BẠCH LẠP KIM', 'T3': 'TRƯỜNG LƯU THỦY', 'K4': 'SA TRUNG KIM', 'T4': 'THIÊN HÀ THỦY', 'H4': 'THIÊN THƯỢNG HỎA', 'O4': 'LỘ BÀN THỔ', 'M4': 'DƯƠNG LIỄU MỘC', 'T5': 'TRUYỀN TRUNG THỦY', 'H5': 'SƠN HẠ HỎA', 'O5': 'ÐẠI TRẠCH THỔ', 'M5': 'THẠCH LỰU MỘC', 'K5': 'KIẾM PHONG KIM', 'H6': 'SƠN ÐẦU HỎA', 'O6': 'ỐC THƯỢNG THỔ', 'M6': 'BÌNH ÐỊA MỘC', 'K6': 'XOA XUYẾN KIM', 'T6': 'ÐẠI HẢI THỦY', }; final matranNapAm = [ [0, 'G', 'Ất', 'Bính', 'Đinh', 'Mậu', 'Kỷ', 'Canh', 'Tân', 'N', 'Q'], [1, 'K1', false, 'T1', false, 'H1', false, 'O1', false, 'M1', false], [2, false, 'K1', false, 'T1', false, 'H1', false, 'O1', false, 'M1'], [3, 'T2', false, 'H2', false, 'O2', false, 'M2', false, 'K2', false], [4, false, 'T2', false, 'H2', false, 'O2', false, 'M2', false, 'K2'], [5, 'H3', false, 'O3', false, 'M3', false, 'K3', false, 'T3', false], [6, false, 'H3', false, 'O3', false, 'M3', false, 'K3', false, 'T3'], [7, 'K4', false, 'T4', false, 'H4', false, 'O4', false, 'M4', false], [8, false, 'K4', false, 'T4', false, 'H4', false, 'O4', false, 'M4'], [9, 'T5', false, 'H5', false, 'O5', false, 'M5', false, 'K5', false], [10, false, 'T5', false, 'H5', false, 'O5', false, 'M5', false, 'K5'], [11, 'H6', false, 'O6', false, 'M6', false, 'K6', false, 'T6', false], [12, false, 'H6', false, 'O6', false, 'M6', false, 'K6', false, 'T6'], ]; if (diaChi < 0 || diaChi >= matranNapAm.length) { throw Exception('Chỉ số địa chi không hợp lệ'); } if (thienCan < 0 || thienCan >= matranNapAm[diaChi].length) { throw Exception('Chỉ số thiên can không hợp lệ'); } final dynamic nh = matranNapAm[diaChi][thienCan]; if (nh != false && nh is String && ['K', 'M', 'T', 'H', 'O'].contains(nh[0])) { return xuatBanMenh ? banMenh[nh] ?? '' : nh[0]; } throw Exception('Không tìm thấy ngũ hành nạp âm hợp lệ'); } /// Moves a position in the chart static int dichCung(int cungBanDau, List<int> soCungDich) { int cungSauKhiDich = cungBanDau; for (final soCung in soCungDich) { cungSauKhiDich += soCung; } if (cungSauKhiDich <= 0) { cungSauKhiDich += 12; } return cungSauKhiDich % 12 == 0 ? 12 : cungSauKhiDich % 12; } /// Calculates distance between two positions static int khoangCachCung(int cung1, int cung2, int chieu) { return chieu == 1 ? (cung1 - cung2 + 12) % 12 : (cung2 - cung1 + 12) % 12; } /// Finds the Five Elements group (Cục) static String timCuc(int viTriCungMenhTrenDiaBan, int canNamSinh) { int canThangGieng = (canNamSinh * 2 + 1) % 10; int kcCungMenhVaCungThangGieng = viTriCungMenhTrenDiaBan - 3 < 0 ? viTriCungMenhTrenDiaBan - 3 + 12 : viTriCungMenhTrenDiaBan - 3; int canThangMenh = ((kcCungMenhVaCungThangGieng % 12) + canThangGieng) % 10; if (canThangMenh == 0) { canThangMenh = 10; } return nguHanhNapAm(viTriCungMenhTrenDiaBan, canThangMenh); } /// Finds the Tử Vi position static int timTuVi(int cuc, int ngaySinhAmLich) { int cungDan = 3; // Vị trí cung Dần ban đầu là 3 final cucBanDau = cuc; if (![2, 3, 4, 5, 6].contains(cuc)) { throw Exception('Số cục phải là 2, 3, 4, 5, 6'); } while (cuc < ngaySinhAmLich) { cuc += cucBanDau; cungDan += 1; } int saiLech = cuc - ngaySinhAmLich; if (saiLech % 2 == 1) { saiLech = -saiLech; } return dichCung(cungDan, [saiLech]); } /// Finds the Trường Sinh position static int timTrangSinh(int cucSo) { switch (cucSo) { case 6: return 3; // Hỏa lục cục - Tràng sinh ở Dần case 4: return 6; // Kim tứ cục - Tràng sinh ở Tỵ case 2: case 5: return 9; // Thủy nhị cục, Thổ ngũ cục - Tràng sinh ở Thân case 3: return 12; // Mộc tam cục - Tràng sinh ở Hợi default: throw Exception('Không tìm được cung an sao Trường sinh'); } } /// Finds Hỏa Tinh and Linh Tinh positions static List<int> timHoaLinh(int chiNamSinh, int gioSinh, int gioiTinh, int amDuongNamSinh) { int khoiCungHoaTinh, khoiCungLinhTinh; if ([3, 7, 11].contains(chiNamSinh)) { khoiCungHoaTinh = 2; khoiCungLinhTinh = 4; } else if ([1, 5, 9].contains(chiNamSinh)) { khoiCungHoaTinh = 3; khoiCungLinhTinh = 11; } else if ([6, 10, 2].contains(chiNamSinh)) { khoiCungHoaTinh = 4; khoiCungLinhTinh = 11; } else if ([12, 4, 8].contains(chiNamSinh)) { khoiCungHoaTinh = 10; khoiCungLinhTinh = 11; } else { throw Exception('Không thể khởi cung tìm Hỏa-Linh'); } int viTriHoaTinh, viTriLinhTinh; if (gioiTinh * amDuongNamSinh == -1) { viTriHoaTinh = dichCung(khoiCungHoaTinh + 1, [-gioSinh]); viTriLinhTinh = dichCung(khoiCungLinhTinh - 1, [gioSinh]); } else if (gioiTinh * amDuongNamSinh == 1) { viTriHoaTinh = dichCung(khoiCungHoaTinh - 1, [gioSinh]); viTriLinhTinh = dichCung(khoiCungLinhTinh + 1, [-gioSinh]); } else { throw Exception('Không thể tính vị trí Hỏa-Linh'); } return [viTriHoaTinh, viTriLinhTinh]; } /// Finds Thiên Khoi position static int timThienKhoi(int canNam) { final thienKhoi = [null, 2, 1, 12, 12, 2, 1, 7, 7, 4, 4]; if (canNam >= 1 && canNam <= 10) { return thienKhoi[canNam] ?? 0; } else { throw Exception('Không tìm được vị trí Khôi-Việt'); } } /// Finds Thiên Quan and Thiên Phúc positions static List<int> timThienQuanThienPhuc(int canNam) { final thienQuan = [null, 8, 5, 6, 3, 4, 10, 12, 10, 11, 7]; final thienPhuc = [null, 10, 9, 1, 12, 4, 3, 7, 6, 7, 6]; if (canNam >= 1 && canNam <= 10) { return [ thienQuan[canNam] ?? 0, thienPhuc[canNam] ?? 0 ]; } else { throw Exception('Không tìm được Quan-Phúc'); } } /// Finds Cô Thần position static int timCoThan(int chiNam) { if ([12, 1, 2].contains(chiNam)) { return 3; } else if ([3, 4, 5].contains(chiNam)) { return 6; } else if ([6, 7, 8].contains(chiNam)) { return 9; } else { return 12; } } /// Finds Thiên Mã position static int timThienMa(int chiNam) { final demNghich = chiNam % 4; switch (demNghich) { case 1: return 3; case 2: return 12; case 3: return 9; case 0: return 6; default: throw Exception('Không tìm được Thiên mã'); } } /// Finds Phá Toái position static int timPhaToai(int chiNam) { final demNghich = chiNam % 3; switch (demNghich) { case 0: return 6; case 1: return 10; case 2: return 2; default: throw Exception('Không tìm được Phá toái'); } } /// Finds Triệt position static List<int> timTriet(int canNam) { switch (canNam) { case 1: case 6: return [9, 10]; // Giáp Kỷ, Thân Dậu cung case 2: case 7: return [7, 8]; // Ất Canh, Ngọ Mùi cung case 3: case 8: return [5, 6]; // Bính Tân, Thìn Tị cung case 4: case 9: return [3, 4]; // Đinh Nhâm, Dần Mão cung case 5: case 10: return [1, 2]; // Mậu Quý, Tý Sửu cung default: throw Exception('Không tìm được Triệt'); } } /// Finds Lưu Hà and Thiên Trù positions static List<int> timLuuTru(int canNam) { final maTranLuuHa = [null, 10, 11, 7, 9, 1, 7, 4, 5, 12, 3]; final maTranThienTru = [null, 6, 7, 1, 6, 7, 9, 3, 7, 10, 11]; if (canNam >= 1 && canNam <= 10) { return [ maTranLuuHa[canNam] ?? 0, maTranThienTru[canNam] ?? 0 ]; } else { throw Exception('Không tìm được Lưu - Trù'); } } } class CungDiaBan { int cungSo; String hanhCung; List<Sao> cungSao = []; int cungAmDuong; String cungTen; bool cungThan = false; String? cungChuTen; int? cungDaiHan; String? cungTieuHan; String? nguyetHan; bool tuanTrung = false; bool luuTuanTrung = false; bool trietLo = false; bool luuTrietLo = false; CungDiaBan(this.cungSo) : hanhCung = hanhCungList[cungSo], cungAmDuong = cungSo % 2 == 0 ? -1 : 1, cungTen = AmDuong.diaChi[cungSo]['tenChi']; static const List<String> hanhCungList = [ '', 'Thủy', 'Thổ', 'Mộc', 'Mộc', 'Thổ', 'Hỏa', 'Hỏa', 'Thổ', 'Kim', 'Kim', 'Thổ', 'Thủy' ]; CungDiaBan themSao(List<Sao> saoList) { for (var sao in saoList) { dacTinhSao(cungSo, sao); cungSao.add(sao); } return this; } CungDiaBan cungChu(String tenCungChu) { cungChuTen = tenCungChu; return this; } CungDiaBan daiHan(int daiHan) { cungDaiHan = daiHan; return this; } CungDiaBan tieuHan(int tieuHan) { cungTieuHan = AmDuong.diaChi[tieuHan + 1]['tenChi']; return this; } CungDiaBan nguyetHanMethod(int nguyetHanValue) { nguyetHan = 'Tháng $nguyetHanValue'; return this; } void anCungThan() => cungThan = true; void anTuan() => tuanTrung = true; void anLuuTuan() => luuTuanTrung = true; void anTriet() => trietLo = true; void anLuuTriet() => luuTrietLo = true; @override String toString() { return 'CungDiaBan(cungAmDuong: $cungAmDuong, cungChu: $cungChuTen, cungDaiHan: $cungDaiHan, cungSao: $cungSao, cungSo: $cungSo, cungTen: $cungTen, cungThan: $cungThan, cungTieuHan: $cungTieuHan, hanhCung: $hanhCung)'; } } class DiaBan { int thangSinhAmLich; int gioSinhAmLich; late List<CungDiaBan> thapNhiCung; int cungThan = 0; int cungMenh = 0; int cungNoboc = 0; int cungTatAch = 0; DiaBan(this.thangSinhAmLich, this.gioSinhAmLich) { thapNhiCung = List.generate(13, (i) => CungDiaBan(i)); nhapCungChu(); nhapCungThan(); } List<Map<String, dynamic>> cungChu(int thangSinh, int gioSinh) { cungThan = AmDuong.dichCung(3, [thangSinh - 1, gioSinh - 1]); cungMenh = AmDuong.dichCung(3, [thangSinh - 1, -gioSinh + 1]); int cungPhuMau = AmDuong.dichCung(cungMenh, [1]); int cungPhucDuc = AmDuong.dichCung(cungMenh, [2]); int cungDienTrach = AmDuong.dichCung(cungMenh, [3]); int cungQuanLoc = AmDuong.dichCung(cungMenh, [4]); cungNoboc = AmDuong.dichCung(cungMenh, [5]); int cungThienDi = AmDuong.dichCung(cungMenh, [6]); cungTatAch = AmDuong.dichCung(cungMenh, [7]); int cungTaiBach = AmDuong.dichCung(cungMenh, [8]); int cungTuTuc = AmDuong.dichCung(cungMenh, [9]); int cungTheThiep = AmDuong.dichCung(cungMenh, [10]); int cungHuynhDe = AmDuong.dichCung(cungMenh, [11]); return [ {'cungId': 1, 'tenCung': 'Mệnh', 'cungSoDiaBan': cungMenh}, {'cungId': 2, 'tenCung': 'Phụ mẫu', 'cungSoDiaBan': cungPhuMau}, {'cungId': 3, 'tenCung': 'Phúc đức', 'cungSoDiaBan': cungPhucDuc}, {'cungId': 4, 'tenCung': 'Điền trạch', 'cungSoDiaBan': cungDienTrach}, {'cungId': 5, 'tenCung': 'Quan lộc', 'cungSoDiaBan': cungQuanLoc}, {'cungId': 6, 'tenCung': 'Nô bộc', 'cungSoDiaBan': cungNoboc}, {'cungId': 7, 'tenCung': 'Thiên di', 'cungSoDiaBan': cungThienDi}, {'cungId': 8, 'tenCung': 'Tật Ách', 'cungSoDiaBan': cungTatAch}, {'cungId': 9, 'tenCung': 'Tài Bạch', 'cungSoDiaBan': cungTaiBach}, {'cungId': 10, 'tenCung': 'Tử tức', 'cungSoDiaBan': cungTuTuc}, {'cungId': 11, 'tenCung': 'Phu thê', 'cungSoDiaBan': cungTheThiep}, {'cungId': 12, 'tenCung': 'Huynh đệ', 'cungSoDiaBan': cungHuynhDe}, ]; } DiaBan nhapCungChu() { for (var cung in cungChu(thangSinhAmLich, gioSinhAmLich)) { thapNhiCung[cung['cungSoDiaBan']].cungChu(cung['tenCung']); } return this; } DiaBan nhapCungThan() { thapNhiCung[cungThan].anCungThan(); return this; } DiaBan nhapDaiHan(int cucSo, int gioiTinh) { for (var cung in thapNhiCung) { int kc = AmDuong.khoangCachCung(cung.cungSo, cungMenh, gioiTinh); cung.daiHan(cucSo + kc * 10); } return this; } DiaBan nhapTieuHan(int khoiTieuHan, int gioiTinh, int chiNam) { int viTriCungTy1 = AmDuong.dichCung(khoiTieuHan, [-gioiTinh * (chiNam - 1)]); for (var cung in thapNhiCung) { int kc = AmDuong.khoangCachCung(cung.cungSo, viTriCungTy1, gioiTinh); cung.tieuHan(kc); } return this; } DiaBan nhapNguyetVan(int chiNam, int thangSinh, int gioSinh) { int viTriBatDau = 1; for (var cung in thapNhiCung) { if (cung.cungTieuHan == AmDuong.diaChi[chiNam]['tenChi']) { viTriBatDau = cung.cungSo; } } int viTriThang1 = AmDuong.dichCung(viTriBatDau, [gioSinh - thangSinh]); for (var cung in thapNhiCung) { int kc = cung.cungSo - viTriThang1; if (kc < 0) kc += 12; cung.nguyetHanMethod(kc + 1); } return this; } DiaBan nhapSao(int cungSo, List<Sao> saoList) { for (var sao in saoList) { thapNhiCung[cungSo].themSao([sao]); } return this; } DiaBan nhapTuan(List<int> cungList) { for (var cung in cungList) { thapNhiCung[cung].anTuan(); } return this; } DiaBan nhapLuuTuan(List<int> cungList) { for (var cung in cungList) { thapNhiCung[cung].anLuuTuan(); } return this; } DiaBan nhapTriet(List<int> cungList) { for (var cung in cungList) { thapNhiCung[cung].anTriet(); } return this; } DiaBan nhapLuuTriet(List<int> cungList) { for (var cung in cungList) { thapNhiCung[cung].anLuuTriet(); } return this; } } void dacTinhSao(int viTriDiaBan, Sao sao) { const Map<int, List<dynamic>> maTranDacTinh = { 1: ["Tử vi", "B", "Đ", "M", "B", "V", "M", "M", "Đ", "M", "B", "V", "B"], 2: ["Liêm trinh", "V", "Đ", "V", "H", "M", "H", "V", "Đ", "V", "H", "M", "H"], 3: ["Thiên đồng", "V", "H", "M", "Đ", "H", "Đ", "H", "H", "M", "H", "H", "Đ"], 4: ["Vũ khúc", "V", "M", "V", "Đ", "M", "H", "V", "M", "V", "Đ", "M", "H"], 5: ["Thái dương", "H", "Đ", "V", "V", "V", "M", "M", "Đ", "H", "H", "H", "H"], 6: ["Thiên cơ", "Đ", "Đ", "H", "M", "M", "V", "Đ", "Đ", "V", "M", "M", "H"], 8: ["Thái âm", "V", "Đ", "H", "H", "H", "H", "H", "Đ", "V", "M", "M", "M"], 9: ["Tham lang", "H", "M", "Đ", "H", "V", "H", "H", "M", "Đ", "H", "V", "H"], 10: ["Cự môn", "V", "H", "V", "M", "H", "H", "V", "H", "Đ", "M", "H", "Đ"], 11: ["Thiên tướng", "V", "Đ", "M", "H", "V", "Đ", "V", "Đ", "M", "H", "V", "Đ"], 12: ["Thiên lương", "V", "Đ", "V", "V", "M", "H", "M", "Đ", "V", "H", "M", "H"], 13: ["Thất sát", "M", "Đ", "M", "H", "H", "V", "M", "Đ", "M", "H", "H", "V"], 14: ["Phá quân", "M", "V", "H", "H", "Đ", "H", "M", "V", "H", "H", "Đ", "H"], 51: ["Đà la", "H", "Đ", "H", "H", "Đ", "H", "H", "Đ", "H", "H", "Đ", "H"], 52: ["Kình dương", "H", "Đ", "H", "H", "Đ", "H", "H", "Đ", "H", "H", "Đ", "H"], 55: ["Linh tinh", "H", "H", "Đ", "Đ", "Đ", "Đ", "Đ", "H", "H", "H", "H", "H"], 56: ["Hỏa tinh", "H", "H", "Đ", "Đ", "Đ", "Đ", "Đ", "H", "H", "H", "H", "H"], 57: ["Văn xương", "H", "Đ", "H", "Đ", "H", "Đ", "H", "Đ", "H", "H", "Đ", "Đ"], 58: ["Văn khúc", "H", "Đ", "H", "Đ", "H", "Đ", "H", "Đ", "H", "H", "Đ", "Đ"], 53: ["Địa không", "H", "H", "Đ", "H", "H", "Đ", "H", "H", "Đ", "H", "H", "Đ"], 54: ["Địa kiếp", "H", "H", "Đ", "H", "H", "Đ", "H", "H", "Đ", "H", "H", "Đ"], 95: ["Hóa kỵ", null, "Đ", null, null, "Đ", null, null, "Đ", null, null, "Đ", null], 36: ["Đại hao", null, null, "Đ", "Đ", null, null, null, null, "Đ", "Đ", null, null], 30: ["Tiểu Hao", null, null, "Đ", "Đ", null, null, null, null, "Đ", "Đ", null, null], 69: ["Thiên khốc", "Đ", "Đ", null, "Đ", null, null, "Đ", "Đ", null, "Đ", null, null], 70: ["Thiên hư", "Đ", "Đ", null, "Đ", null, null, "Đ", "Đ", null, "Đ", null, null], 98: ["Thiên mã", null, null, "Đ", null, null, "Đ", null, null, null, null, null, null], 73: ["Thiên Hình", null, null, "Đ", "Đ", null, null, null, null, "Đ", "Đ", null, null], 74: ["Thiên riêu", null, null, "Đ", "Đ", null, null, null, null, null, "Đ", "Đ", null], }; if (maTranDacTinh.containsKey(sao.saoID)) { final dacTinh = maTranDacTinh[sao.saoID]![viTriDiaBan]; if (["M", "V", "Đ", "B", "H"].contains(dacTinh)) { sao.anDacTinh(dacTinh); } } } DiaBan lapDiaBan( int nn, int tt, int nnnn, int gioSinh, int gioiTinh, bool duongLich, int timeZone, int? namXemTieuVan, ) { int canThang, canNam, chiNam, thangNhuan, canLuuThang, canLuuNam, chiLuuNam; List<int> ngayThangNam(int nn, int tt, int nnnn, {bool duongLich = true, int timeZone = 7}) { return AmDuong.ngayThangNam( nn, tt, nnnn, duongLich: duongLich, timeZone: timeZone, ); } List<int> ngayThangNamCanChi(int nn, int tt, int nnnn, {bool duongLich = true, int timeZone = 7}) { return AmDuong.ngayThangNamCanChi( nn, tt, nnnn, duongLich: duongLich, timeZone: timeZone, ); } Map<String, dynamic> nguHanh(String tenHanh){ return AmDuong.nguHanh(tenHanh); } int dichCung(int cungBanDau, List<int> soCungDich) { return AmDuong.dichCung(cungBanDau, soCungDich); } if (duongLich) { // Assuming ngayThangNam returns a List<int> List<int> result = ngayThangNam( nn, tt, nnnn, duongLich: duongLich, timeZone: timeZone, ); nn = result[0]; tt = result[1]; nnnn = result[2]; thangNhuan = result[3]; } List<int> canChiResult = ngayThangNamCanChi( nn, tt, nnnn, duongLich: false, timeZone: timeZone, ); canThang = canChiResult[0]; canNam = canChiResult[1]; chiNam = canChiResult[2]; List<int> canLuuResult = ngayThangNamCanChi(5, 5, namXemTieuVan!, duongLich : false, timeZone: timeZone); canLuuThang = canLuuResult[0]; canLuuNam = canLuuResult[1]; chiLuuNam = canLuuResult[2]; DiaBan diaBan = DiaBan(tt, gioSinh); int amDuongNamSinh = AmDuong.thienCan[canNam]['amDuong'] as int; int amDuongChiNamSinh = AmDuong.diaChi[chiNam]['amDuong'] as int; // Bản Mệnh chính là Ngũ hành nạp âm của năm sinh // int banMenh = nguHanhNapAm(canNam, chiNam); String hanhCuc = AmDuong.timCuc(diaBan.cungMenh, canNam); var cuc = nguHanh(hanhCuc); int cucSo = cuc["cuc"]; // Nhập đại hạn khi đã biết được số cục diaBan.nhapDaiHan(cucSo, gioiTinh * amDuongChiNamSinh); // Nhập tiểu hạn int khoiHan = dichCung(11, [-3 * (chiNam - 1)]); diaBan.nhapTieuHan(khoiHan, gioiTinh, chiNam); // Bắt đầu an Tử vi tinh hệ int viTriTuVi = AmDuong.timTuVi(cucSo, nn); diaBan.nhapSao(viTriTuVi, [saoTuVi]); int viTriLiemTrinh = dichCung(viTriTuVi, [4]); diaBan.nhapSao(viTriLiemTrinh, [saoLiemTrinh]); int viTriThienDong = dichCung(viTriTuVi, [7]); diaBan.nhapSao(viTriThienDong, [saoThienDong]); int viTriVuKhuc = dichCung(viTriTuVi, [8]); diaBan.nhapSao(viTriVuKhuc, [saoVuKhuc]); int vitriThaiDuong = dichCung(viTriTuVi, [9]); diaBan.nhapSao(vitriThaiDuong, [saoThaiDuong]); int viTriThienCo = dichCung(viTriTuVi, [11]); diaBan.nhapSao(viTriThienCo, [saoThienCo]); // Thiên phủ tinh hệ int viTriThienPhu = dichCung(3, [3 - viTriTuVi]); diaBan.nhapSao(viTriThienPhu, [saoThienPhu]); int viTriThaiAm = dichCung(viTriThienPhu, [1]); diaBan.nhapSao(viTriThaiAm, [saoThaiAm]); int viTriThamLang = dichCung(viTriThienPhu, [2]); diaBan.nhapSao(viTriThamLang, [saoThamLang]); int viTriCuMon = dichCung(viTriThienPhu, [3]); diaBan.nhapSao(viTriCuMon, [saoCuMon]); int viTriThienTuong = dichCung(viTriThienPhu, [4]); diaBan.nhapSao(viTriThienTuong, [saoThienTuong]); int viTriThienLuong = dichCung(viTriThienPhu, [5]); diaBan.nhapSao(viTriThienLuong, [saoThienLuong]); int viTriThatSat = dichCung(viTriThienPhu, [6]); diaBan.nhapSao(viTriThatSat, [saoThatSat]); int viTriPhaQuan = dichCung(viTriThienPhu, [10]); diaBan.nhapSao(viTriPhaQuan, [saoPhaQuan]); // Vòng Lộc tồn int viTriLocTon = AmDuong.thienCan[canNam]['vitriDiaBan'] as int; diaBan.nhapSao(viTriLocTon, [saoLocTon, saoBacSy]); int amDuongNamNu = gioiTinh * amDuongNamSinh; int viTriLucSi = dichCung(viTriLocTon, [1 * amDuongNamNu]); diaBan.nhapSao(viTriLucSi, [saoLucSi]); int viTriThanhLong = dichCung(viTriLocTon, [2 * amDuongNamNu]); diaBan.nhapSao(viTriThanhLong, [saoThanhLong]); int viTriTieuHao = dichCung(viTriLocTon, [3 * amDuongNamNu]); diaBan.nhapSao(viTriTieuHao, [saoTieuHao]); int viTriTuongQuan = dichCung(viTriLocTon, [4 * amDuongNamNu]); diaBan.nhapSao(viTriTuongQuan, [saoTuongQuan]); int viTriTauThu = dichCung(viTriLocTon, [5 * amDuongNamNu]); diaBan.nhapSao(viTriTauThu, [saoTauThu]); int viTriPhiLiem = dichCung(viTriLocTon, [6 * amDuongNamNu]); diaBan.nhapSao(viTriPhiLiem, [saoPhiLiem]); int viTriHyThan = dichCung(viTriLocTon, [7 * amDuongNamNu]); diaBan.nhapSao(viTriHyThan, [saoHyThan]); int viTriDaiHao = dichCung(viTriLocTon, [9 * amDuongNamNu]); diaBan.nhapSao(viTriDaiHao, [saoDaiHao]); int viTriPhucBinh = dichCung(viTriLocTon, [10 * amDuongNamNu]); diaBan.nhapSao(viTriPhucBinh, [saoPhucBinh]); int viTriQuanPhu2 = dichCung(viTriLocTon, [11 * amDuongNamNu]); diaBan.nhapSao(viTriQuanPhu2, [saoQuanPhu2]); // Vòng Địa chi - Thái tuế int viTriThaiTue = chiNam; diaBan.nhapSao(viTriThaiTue, [saoThaiTue]); int viTriThieuDuong = dichCung(viTriThaiTue, [1]); diaBan.nhapSao(viTriThieuDuong, [saoThieuDuong, saoThienKhong]); int viTriTangMon = dichCung(viTriThaiTue, [2]); diaBan.nhapSao(viTriTangMon, [saoTangMon]); int viTriQuanPhu3 = dichCung(viTriThaiTue, [4]); diaBan.nhapSao(viTriQuanPhu3, [saoQuanPhu3]); int viTriBachHo = dichCung(viTriThaiTue, [8]); diaBan.nhapSao(viTriBachHo, [saoBachHo]); int viTriPhucDuc = dichCung(viTriThaiTue, [9]); diaBan.nhapSao(viTriPhucDuc, [saoPhucDuc]); int viTriDaLa = dichCung(viTriLocTon, [-1]); diaBan.nhapSao(viTriDaLa, [saoDaLa]); int viTriKinhDuong = dichCung(viTriLocTon, [1]); diaBan.nhapSao(viTriKinhDuong, [saoKinhDuong]); // Không - Kiếp int viTriDiaKiep = dichCung(11, [gioSinh]); diaBan.nhapSao(viTriDiaKiep, [saoDiaKiep]); List<int> viTriHoaTinhLinhTinh = AmDuong.timHoaLinh(chiNam, gioSinh, gioiTinh, amDuongNamSinh); diaBan.nhapSao(viTriHoaTinhLinhTinh[0], [saoHoaTinh]); diaBan.nhapSao(viTriHoaTinhLinhTinh[1], [saoLinhTinh]); int viTriLongTri = dichCung(5, [chiNam - 1]); diaBan.nhapSao(viTriLongTri, [saoLongTri]); int viTriPhuongCac = dichCung(2, [2 - viTriLongTri]); diaBan.nhapSao(viTriPhuongCac, [saoPhuongCac, saoGiaiThan]); int viTriTaPhu = dichCung(5, [tt - 1]); diaBan.nhapSao(viTriTaPhu, [saoTaPhu]); int viTriHuuBat = dichCung(2, [2 - viTriTaPhu]); diaBan.nhapSao(viTriHuuBat, [saoHuuBat]); int viTriVanKhuc = dichCung(5, [gioSinh - 1]); diaBan.nhapSao(viTriVanKhuc, [saoVanKhuc]); int viTriVanXuong = dichCung(2, [2 - viTriVanKhuc]); diaBan.nhapSao(viTriVanXuong, [saoVanXuong]); int viTriThienKhoi = AmDuong.timThienKhoi(canNam); diaBan.nhapSao(viTriThienKhoi, [saoThienKhoi]); int viTriThienViet = dichCung(5, [5 - viTriThienKhoi]); diaBan.nhapSao(viTriThienViet, [saoThienViet]); int viTriThienHu = dichCung(7, [chiNam - 1]); diaBan.nhapSao(viTriThienHu, [saoThienHu]); int viTriThienKhoc = dichCung(7, [-chiNam + 1]); diaBan.nhapSao(viTriThienKhoc, [saoThienKhoc]); int viTriHongLoan = dichCung(4, [-chiNam + 1]); diaBan.nhapSao(viTriHongLoan, [saoHongLoan]); int viTriThienHy = dichCung(viTriHongLoan,[ 6]); diaBan.nhapSao(viTriThienHy, [saoThienHy]); int viTriThienHinh = dichCung(10, [tt - 1]); diaBan.nhapSao(viTriThienHinh, [saoThienHinh]); int viTriThienRieu = dichCung(viTriThienHinh,[4]); diaBan.nhapSao(viTriThienRieu, [saoThienRieu, saoThienY]); int viTriCoThan = AmDuong.timCoThan(chiNam); diaBan.nhapSao(viTriCoThan, [saoCoThan]); int viTriQuaTu = dichCung(viTriCoThan, [-4]); diaBan.nhapSao(viTriQuaTu, [saoQuaTu]); int viTriVanTinh = dichCung(viTriKinhDuong, [2]); // diaBan.nhapSao(viTriVanTinh, [saoVanTinh]); int viTriDuongPhu = dichCung(viTriVanTinh, [2]); // diaBan.nhapSao(viTriDuongPhu, [saoDuongPhu]); int viTriQuocAn = dichCung(viTriDuongPhu, [3]); diaBan.nhapSao(viTriQuocAn, [saoQuocAn]); // Vòng Thiên mã int viTriThienMa = AmDuong.timThienMa(chiNam); diaBan.nhapSao(viTriThienMa, [saoThienMa]); int viTriHoaCai = dichCung(viTriThienMa, [2]); diaBan.nhapSao(viTriHoaCai, [saoHoaCai]); int viTriKiepSat = dichCung(viTriThienMa, [3]); diaBan.nhapSao(viTriKiepSat, [saoKiepSat]); int viTriDaoHoa = dichCung(viTriKiepSat, [4]); diaBan.nhapSao(viTriDaoHoa, [saoDaoHoa]); int viTriHoaLoc = 0; int viTriHoaQuyen = 0; int viTriHoaKhoa = 0; int viTriHoaKy = 0; switch (canNam) { case 1: viTriHoaLoc = viTriLiemTrinh; viTriHoaQuyen = viTriPhaQuan; viTriHoaKhoa = viTriVuKhuc; viTriHoaKy = vitriThaiDuong; break; case 2: viTriHoaLoc = viTriThienCo; viTriHoaQuyen = viTriThienLuong; viTriHoaKhoa = viTriTuVi; viTriHoaKy = viTriThaiAm; break; case 3: viTriHoaLoc = viTriThienDong; viTriHoaQuyen = viTriThienCo; viTriHoaKhoa = viTriVanXuong; viTriHoaKy = viTriLiemTrinh; break; case 4: viTriHoaLoc = viTriThaiAm; viTriHoaQuyen = viTriThienDong; viTriHoaKhoa = viTriThienCo; viTriHoaKy = viTriCuMon; break; case 5: viTriHoaLoc = viTriThamLang; viTriHoaQuyen = viTriThaiAm; viTriHoaKhoa = viTriHuuBat; viTriHoaKy = viTriThienCo; break; case 6: viTriHoaLoc = viTriVuKhuc; viTriHoaQuyen = viTriThamLang; viTriHoaKhoa = viTriThienLuong; viTriHoaKy = viTriVanKhuc; break; case 7: viTriHoaLoc = vitriThaiDuong; viTriHoaQuyen = viTriVuKhuc; viTriHoaKhoa = viTriThaiAm; viTriHoaKy = viTriThienDong; break; case 8: viTriHoaLoc = viTriCuMon; viTriHoaQuyen = vitriThaiDuong; viTriHoaKhoa = viTriVanKhuc; viTriHoaKy = viTriVanXuong; break; case 9: viTriHoaLoc = viTriThienLuong; viTriHoaQuyen = viTriTuVi; viTriHoaKhoa = viTriTaPhu; viTriHoaKy = viTriVuKhuc; break; case 10: viTriHoaLoc = viTriPhaQuan; viTriHoaQuyen = viTriCuMon; viTriHoaKhoa = viTriThaiAm; viTriHoaKy = viTriThamLang; break; } diaBan.nhapSao(viTriHoaLoc, [saoHoaLoc]); diaBan.nhapSao(viTriHoaQuyen, [saoHoaQuyen]); diaBan.nhapSao(viTriHoaKhoa, [saoHoaKhoa]); diaBan.nhapSao(viTriHoaKy, [saoHoaKy]); // An Lưu Hà - Thiên Trù List<int> viTriLuuHaThienTru = AmDuong.timLuuTru(canNam); diaBan.nhapSao(viTriLuuHaThienTru[0], [saoLuuHa]); diaBan.nhapSao(viTriLuuHaThienTru[1], [saoThienTru]); // An Tuần, Triệt int ketThucTuan = dichCung(chiNam, [10 - canNam]); int viTriTuan1 = dichCung(ketThucTuan, [1]); int viTriTuan2 = dichCung(viTriTuan1, [1]); diaBan.nhapTuan([viTriTuan1, viTriTuan2]); List<int> viTriTriet1Triet2 = AmDuong.timTriet(canNam); diaBan.nhapTriet([viTriTriet1Triet2[0], viTriTriet1Triet2[1]]); if (namXemTieuVan != null) { diaBan = diaBan.nhapNguyetVan(chiLuuNam, tt, gioSinh); int viTriLuuThienKhoi = AmDuong.timThienKhoi(canLuuNam); diaBan.nhapSao(viTriLuuThienKhoi, [saoLuuThienKhoi]); int viTriLuuThienViet = dichCung(5, [5 - viTriLuuThienKhoi]); diaBan.nhapSao(viTriLuuThienViet, [saoLuuThienViet]); int viTriLuuLocTon = AmDuong.thienCan[canLuuNam]["vitriDiaBan"]; diaBan.nhapSao(viTriLuuLocTon, [saoLuuLocTon]); int viTriLuuThaiTue = chiLuuNam; diaBan.nhapSao(viTriLuuThaiTue, [saoLuuThaiTue]); int viTriLuuTangMon = dichCung(viTriLuuThaiTue, [2]); diaBan.nhapSao(viTriLuuTangMon, [saoLuuTangMon]); int viTriLuuBachHo = dichCung(viTriLuuThaiTue, [8]); diaBan.nhapSao(viTriLuuBachHo, [saoLuuBachHo]); int viTriLuuThienMa = AmDuong.timThienMa(chiLuuNam); diaBan.nhapSao(viTriLuuThienMa, [saoLuuThienMa]); int viTriLuuDaoHoa = dichCung(viTriLuuThienMa, [7]); diaBan.nhapSao(viTriLuuDaoHoa, [saoLuuDaoHoa]); int viTriLuuHongLoan = dichCung(4, [-chiLuuNam + 1]); diaBan.nhapSao(viTriLuuHongLoan, [saoLuuHongLoan]); int viTriLuuThienKhoc = dichCung(7, [-chiLuuNam + 1]); diaBan.nhapSao(viTriLuuThienKhoc, [saoLuuThienKhoc]); int viTriLuuDaLa = dichCung(viTriLuuLocTon, [-1]); diaBan.nhapSao(viTriLuuDaLa, [saoLuuDaLa]); int viTriLuuKinhDuong = dichCung(viTriLuuLocTon, [1]); diaBan.nhapSao(viTriLuuKinhDuong, [saoLuuKinhDuong]); int viTriLuuThienHu = dichCung(7, [chiLuuNam - 1]); diaBan.nhapSao(viTriLuuThienHu, [saoLuuThienHu]); int viTriLuuLongTri = dichCung(5, [chiLuuNam - 1]); int viTriLuuPhuongCac = dichCung(2, [2 - viTriLuuLongTri]); diaBan.nhapSao(viTriLuuPhuongCac, [saoLuuPhuongCac]); int viTriLuuTuongQuan = dichCung(viTriLuuLocTon,[ 4 * amDuongNamNu]); diaBan.nhapSao(viTriLuuTuongQuan, [saoLuuTuongQuan]); int viTriLuuTauThu = dichCung(viTriLuuLocTon, [5 * amDuongNamNu]); diaBan.nhapSao(viTriLuuTauThu, [saoLuuTauThu]); int viTriLuuDuongPhu = dichCung(viTriLuuKinhDuong, [4]); diaBan.nhapSao(viTriLuuDuongPhu, [saoLuuDuongPhu]); int viTriLuuQuanPhu3 = dichCung(viTriLuuThaiTue, [4]); diaBan.nhapSao(viTriLuuQuanPhu3, [saoLuuQuanPhu3]); int viTriLuuPhiLiem = dichCung(viTriLuuLocTon,[ 6 * amDuongNamNu]); diaBan.nhapSao(viTriLuuPhiLiem, [saoLuuPhiLiem]); int viTriLuuHyThan = dichCung(viTriLuuLocTon, [7 * amDuongNamNu]); diaBan.nhapSao(viTriLuuHyThan, [saoLuuHyThan]); List<int> viTriLuuLuuHaThienTru = AmDuong.timLuuTru(canLuuNam); diaBan.nhapSao(viTriLuuLuuHaThienTru[0], [saoLuuLuuHa]); int viTriLuuQuocAn = dichCung(viTriLuuDuongPhu, [3]); diaBan.nhapSao(viTriLuuQuocAn, [saoLuuQuocAn]); int viTriLuuBenhPhu = dichCung(viTriLuuLocTon, [8 * amDuongNamNu]); diaBan.nhapSao(viTriLuuBenhPhu, [saoLuuBenhPhu]); int viTriLuuDaiHao = dichCung(viTriLuuLocTon, [9 * amDuongNamNu]); diaBan.nhapSao(viTriLuuDaiHao, [saoLuuDaiHao]); int viTriLuuPhucBinh = dichCung(viTriLuuLocTon, [10 * amDuongNamNu]); diaBan.nhapSao(viTriLuuPhucBinh, [saoLuuPhucBinh]); int viTriLuuCoThan = AmDuong.timCoThan(chiLuuNam); diaBan.nhapSao(viTriLuuCoThan, [saoLuuCoThan]); int viTriLuuQuaTu = dichCung(viTriLuuCoThan, [-4]); diaBan.nhapSao(viTriLuuQuaTu, [saoLuuQuaTu]); int viTriLuuQuanPhu2 = dichCung(viTriLuuLocTon, [11 * amDuongNamNu]); diaBan.nhapSao(viTriLuuQuanPhu2, [saoLuuQuanPhu2]); int viTriLuuDieuKhach = dichCung(viTriLuuThaiTue, [10]); diaBan.nhapSao(viTriLuuDieuKhach, [saoLuuDieuKhach]); int viTriLuuLucSi = dichCung(viTriLuuLocTon, [1 * amDuongNamNu]); diaBan.nhapSao(viTriLuuLucSi, [saoLuuLucSi]); int viTriLuuThanhLong = dichCung(viTriLuuLocTon,[ 2 * amDuongNamNu]); diaBan.nhapSao(viTriLuuThanhLong, [saoLuuThanhLong]); int viTriLuuHoaCai = dichCung(viTriLuuThienMa, [2]); diaBan.nhapSao(viTriLuuHoaCai, [saoLuuHoaCai]); int viTriLuuThienHy = dichCung(viTriLuuHongLoan, [6]); diaBan.nhapSao(viTriLuuThienHy, [saoLuuThienHy]); int viTriLuuTieuHao = dichCung(viTriLuuLocTon, [3 * amDuongNamNu]); diaBan.nhapSao(viTriLuuTieuHao, [saoLuuTieuHao]); List<int> viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy = [0, 0, 0, 0]; switch (canLuuNam) { case 1: viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[0] = viTriLiemTrinh; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[1] = viTriPhaQuan; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[2] = viTriVuKhuc; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[3] = vitriThaiDuong; break; case 2: viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[0] = viTriThienCo; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[1] = viTriThienLuong; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[2] = viTriTuVi; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[3] = viTriThaiAm; break; case 3: viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[0] = viTriThienDong; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[1] = viTriThienCo; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[2] = viTriVanXuong; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[3] = viTriLiemTrinh; break; case 4: viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[0] = viTriThaiAm; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[1] = viTriThienDong; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[2] = viTriThienCo; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[3] = viTriCuMon; break; case 5: viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[0] = viTriThamLang; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[1] = viTriThaiAm; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[2] = viTriHuuBat; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[3] = viTriThienCo; break; case 6: viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[0] = viTriVuKhuc; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[1] = viTriThamLang; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[2] = viTriThienLuong; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[3] = viTriVanKhuc; break; case 7: viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[0] = vitriThaiDuong; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[1] = viTriVuKhuc; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[2] = viTriThienDong; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[3] = viTriThaiAm; break; case 8: viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[0] = viTriCuMon; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[1] = vitriThaiDuong; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[2] = viTriVanKhuc; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[3] = viTriVanXuong; break; case 9: viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[0] = viTriThienLuong; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[1] = viTriTuVi; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[2] = viTriTaPhu; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[3] = viTriVuKhuc; break; case 10: viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[0] = viTriPhaQuan; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[1] = viTriCuMon; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[2] = viTriThaiAm; viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[3] = viTriThamLang; break; } diaBan.nhapSao(viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[0], [saoLuuHoaLoc]); diaBan.nhapSao(viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[1], [saoLuuHoaQuyen]); diaBan.nhapSao(viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[2], [saoLuuHoaKhoa]); diaBan.nhapSao(viTriLuuHoaLocLuuHoaQuyenLuuHoaKhoaLuuHoaKy[3], [saoLuuHoaKy]); } return diaBan; } class Sao { final int saoID; final String saoTen; final String saoNguHanh; final int saoLoai; final String saoPhuongVi; final dynamic saoAmDuong; final int vongTrangSinh; final bool saoLuuNien; final String cssSao; String? saoDacTinh; int? saoViTriCung; Sao( this.saoID, this.saoTen, { this.saoNguHanh = '', this.saoLoai = 2, this.saoPhuongVi = '', this.saoAmDuong = '', this.vongTrangSinh = 0, this.saoLuuNien = false, }) : cssSao = AmDuong.nguHanh(saoNguHanh)['css']; Sao anDacTinh(String dacTinh) { saoDacTinh = dacTinh; return this; } Sao anCung(int saoViTriCung) { this.saoViTriCung = saoViTriCung; return this; } @override String toString() { return 'Sao(cssSao: $cssSao, saoAmDuong: $saoAmDuong, saoDacTinh: $saoDacTinh, saoId: $saoID, saoLoai: $saoLoai, saoLuuNien: $saoLuuNien, saoNguHanh: $saoNguHanh, saoPhuongVi: $saoPhuongVi, saoTen: $saoTen, vongTrangSinh: $vongTrangSinh)'; } } // Tử vi tinh hệ final saoTuVi = Sao( 1, "Tử vi", saoNguHanh: "O", saoLoai: 1, saoPhuongVi: "Đế tinh", saoAmDuong: 1, vongTrangSinh: 0, ); final saoLiemTrinh = Sao( 2, "Liêm trinh", saoNguHanh: "H", saoLoai: 1, saoPhuongVi: "Bắc đẩu tinh", saoAmDuong: 1, vongTrangSinh: 0, ); final saoThienDong = Sao( 3, "Thiên đồng", saoNguHanh: "T", saoLoai: 1, saoPhuongVi: "Bắc đẩu tinh", saoAmDuong: 1, vongTrangSinh: 0, ); final saoVuKhuc = Sao( 4, "Vũ khúc", saoNguHanh: "K", saoLoai: 1, saoPhuongVi: "Bắc đẩu tinh", saoAmDuong: -1, vongTrangSinh: 0, ); final saoThaiDuong = Sao( 5, "Thái Dương", saoNguHanh: "H", saoLoai: 1, saoPhuongVi: "Nam đẩu tinh", saoAmDuong: 1, vongTrangSinh: 0, ); final saoThienCo = Sao( 6, "Thiên cơ", saoNguHanh: "M", saoLoai: 1, saoPhuongVi: "Nam đẩu tinh", saoAmDuong: -1, vongTrangSinh: 0, ); // Thiên phủ tinh hệ final saoThienPhu = Sao( 7, "Thiên phủ", saoNguHanh: "O", saoLoai: 1, saoPhuongVi: "Nam đẩu tinh", saoAmDuong: 1, vongTrangSinh: 0, ); final saoThaiAm = Sao( 8, "Thái âm", saoNguHanh: "T", saoLoai: 1, saoPhuongVi: "Bắc đẩu tinh", saoAmDuong: -1, vongTrangSinh: 0, ); final saoThamLang = Sao( 9, "Tham lang", saoNguHanh: "T", saoLoai: 1, saoPhuongVi: "Bắc đẩu tinh", saoAmDuong: -1, vongTrangSinh: 0, ); final saoCuMon = Sao( 10, "Cự môn", saoNguHanh: "T", saoLoai: 1, saoPhuongVi: "Bắc đẩu tinh", saoAmDuong: -1, vongTrangSinh: 0, ); final saoThienTuong = Sao( 11, "Thiên tướng", saoNguHanh: "T", saoLoai: 1, saoPhuongVi: "Nam đẩu tinh", saoAmDuong: 1, vongTrangSinh: 0, ); final saoThienLuong = Sao( 12, "Thiên lương", saoNguHanh: "M", saoLoai: 1, saoPhuongVi: "Nam đẩu tinh", saoAmDuong: -1, vongTrangSinh: 0, ); final saoThatSat = Sao( 13, "Thất sát", saoNguHanh: "K", saoLoai: 1, saoPhuongVi: "Nam đẩu tinh", saoAmDuong: 1, vongTrangSinh: 0, ); final saoPhaQuan = Sao( 14, "Phá quân", saoNguHanh: "T", saoLoai: 1, saoPhuongVi: "Bắc đẩu tinh", saoAmDuong: -1, vongTrangSinh: 0, ); // Vòng Địa chi - Thái tuế final saoThaiTue = Sao( 15, "Thái tuế", saoNguHanh: "H", saoLoai: 15, saoPhuongVi: "", saoAmDuong: 0, vongTrangSinh: 0, ); final saoThieuDuong = Sao( 16, "Thiếu dương", saoNguHanh: "H", saoLoai: 5, ); final saoTangMon = Sao( 17, "Tang môn", saoNguHanh: "M", saoLoai: 12, ); final saoThieuAm = Sao( 18, "Thiếu âm", saoNguHanh: "T", saoLoai: 5, ); final saoQuanPhu3 = Sao( 19, "Quan phù", saoNguHanh: "H", saoLoai: 12, ); final saoTuPhu = Sao( 20, "Tử phù", saoNguHanh: "K", saoLoai: 12, ); final saoTuePha = Sao( 21, "Tuế phá", saoNguHanh: "H", saoLoai: 12, ); final saoLongDuc = Sao( 22, "Long đức", saoNguHanh: "T", saoLoai: 5, ); final saoBachHo = Sao( 23, "Bạch hổ", saoNguHanh: "K", saoLoai: 12, ); final saoPhucDuc = Sao( 24, "Phúc đức", saoNguHanh: "O", saoLoai: 5, ); final saoDieuKhach = Sao( 25, "Điếu khách", saoNguHanh: "H", saoLoai: 12, ); final saoTrucPhu = Sao( 26, "Trực phù", saoNguHanh: "K", saoLoai: 16, ); // Vòng Thiên can - Lộc tồn final saoLocTon = Sao( 27, "Lộc tồn", saoNguHanh: "O", saoLoai: 3, saoPhuongVi: "Bắc đẩu tinh", ); final saoBacSy = Sao( 109, "Bác sỹ", saoNguHanh: "T", saoLoai: 5, ); final saoLucSi = Sao( 28, "Lực sĩ", saoNguHanh: "H", saoLoai: 2, ); final saoThanhLong = Sao( 29, "Thanh long", saoNguHanh: "T", saoLoai: 5, ); final saoTieuHao = Sao( 30, "Tiểu hao", saoNguHanh: "H", saoLoai: 12, ); final saoTuongQuan = Sao( 31, "Tướng quân", saoNguHanh: "M", saoLoai: 4, ); final saoTauThu = Sao( 32, "Tấu thư", saoNguHanh: "K", saoLoai: 3, ); final saoPhiLiem = Sao( 33, "Phi liêm", saoNguHanh: "H", saoLoai: 2, ); final saoHyThan = Sao( 34, "Hỷ thần", saoNguHanh: "H", saoLoai: 5, ); final saoBenhPhu = Sao( 35, "Bệnh phù", saoNguHanh: "O", saoLoai: 12, ); final saoDaiHao = Sao( 36, "Đại hao", saoNguHanh: "H", saoLoai: 12, ); final saoPhucBinh = Sao( 37, "Phục binh", saoNguHanh: "H", saoLoai: 13, ); final saoQuanPhu2 = Sao( 38, "Quan phủ", saoNguHanh: "H", saoLoai: 12, ); // Vòng Tràng sinh final saoTrangSinh = Sao( 39, "Tràng sinh", saoNguHanh: "T", saoLoai: 5, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 1, ); final saoMocDuc = Sao( 40, "Mộc dục", saoNguHanh: "T", saoLoai: 14, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 1, ); final saoQuanDoi = Sao( 41, "Quan đới", saoNguHanh: "K", saoLoai: 4, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 1, ); final saoLamQuan = Sao( 42, "Lâm quan", saoNguHanh: "K", saoLoai: 7, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 1, ); final saoDeVuong = Sao( 43, "Đế vượng", saoNguHanh: "K", saoLoai: 5, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 1, ); final saoSuy = Sao( 44, "Suy", saoNguHanh: "T", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 1, ); final saoBenh = Sao( 45, "Bệnh", saoNguHanh: "H", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 1, ); final saoTu = Sao( 46, "Tử", saoNguHanh: "H", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 1, ); final saoMo = Sao( 47, "Mộ", saoNguHanh: "O", saoLoai: 0, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 1, ); final saoTuyet = Sao( 48, "Tuyệt", saoNguHanh: "O", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 1, ); final saoThai = Sao( 49, "Thai", saoNguHanh: "O", saoLoai: 14, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 1, ); final saoDuong = Sao( 50, "Dưỡng", saoNguHanh: "M", saoLoai: 2, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 1, ); // Lục sát final saoDaLa = Sao( 51, "Đà la", saoNguHanh: "K", saoLoai: 11, ); final saoKinhDuong = Sao( 52, "Kình dương", saoNguHanh: "K", saoLoai: 11, ); final saoDiaKhong = Sao( 53, "Địa không", saoNguHanh: "H", saoLoai: 11, ); final saoDiaKiep = Sao( 54, "Địa kiếp", saoNguHanh: "H", saoLoai: 11, ); final saoLinhTinh = Sao( 55, "Linh tinh", saoNguHanh: "H", saoLoai: 11, ); final saoHoaTinh = Sao( 56, "Hỏa tinh", saoNguHanh: "H", saoLoai: 11, ); // Sao Âm Dương final saoVanXuong = Sao( 57, "Văn xương", saoNguHanh: "K", saoLoai: 6, ); final saoVanKhuc = Sao( 58, "Văn Khúc", saoNguHanh: "T", saoLoai: 6, ); final saoThienKhoi = Sao( 59, "Thiên khôi", saoNguHanh: "H", saoLoai: 6, ); final saoThienViet = Sao( 60, "Thiên việt", saoNguHanh: "H", saoLoai: 6, ); final saoTaPhu = Sao( 61, "Tả phù", saoNguHanh: "O", saoLoai: 2, ); final saoHuuBat = Sao( 62, "Hữu bật", saoNguHanh: "O", saoLoai: 2, ); final saoLongTri = Sao( 63, "Long trì", saoNguHanh: "T", saoLoai: 3, ); final saoPhuongCac = Sao( 64, "Phượng các", saoNguHanh: "O", saoLoai: 3, ); final saoTamThai = Sao( 65, "Tam thai", saoNguHanh: "M", saoLoai: 7, ); final saoBatToa = Sao( 66, "Bát tọa", saoNguHanh: "T", saoLoai: 7, ); final saoAnQuang = Sao( 67, "Ân quang", saoNguHanh: "M", saoLoai: 3, ); final saoThienQuy = Sao( 68, "Thiên quý", saoNguHanh: "O", saoLoai: 3, ); // Sao đôi khác // Sao đôi khác final saoThienKhoc = Sao( 69, "Thiên khốc", saoNguHanh: "T", saoLoai: 12, ); final saoThienHu = Sao( 70, "Thiên hư", saoNguHanh: "T", saoLoai: 12, ); final saoThienDuc = Sao( 71, "Thiên đức", saoNguHanh: "H", saoLoai: 5, ); final saoNguyetDuc = Sao( 72, "Nguyệt đức", saoNguHanh: "H", saoLoai: 5, ); final saoThienHinh = Sao( 73, "Thiên hình", saoNguHanh: "H", saoLoai: 15, ); final saoThienRieu = Sao( 74, "Thiên riêu", saoNguHanh: "T", saoLoai: 13, ); final saoThienY = Sao( 75, "Thiên y", saoNguHanh: "T", saoLoai: 5, ); final saoQuocAn = Sao( 76, "Quốc ấn", saoNguHanh: "O", saoLoai: 6, ); final saoDuongPhu = Sao( 77, "Đường phù", saoNguHanh: "M", saoLoai: 4, ); final saoDaoHoa = Sao( 78, "Đào hoa", saoNguHanh: "M", saoLoai: 8, ); final saoHongLoan = Sao( 79, "Hồng loan", saoNguHanh: "T", saoLoai: 8, ); final saoThienHy = Sao( 80, "Thiên hỷ", saoNguHanh: "T", saoLoai: 5, ); final saoThienGiai = Sao( 81, "Thiên giải", saoNguHanh: "H", saoLoai: 5, ); final saoDiaGiai = Sao( 82, "Địa giải", saoNguHanh: "O", saoLoai: 5, ); final saoGiaiThan = Sao( 83, "Giải thần", saoNguHanh: "M", saoLoai: 5, ); final saoThaiPhu = Sao( 84, "Thai phụ", saoNguHanh: "K", saoLoai: 6, ); final saoPhongCao = Sao( 85, "Phong cáo", saoNguHanh: "O", saoLoai: 4, ); final saoThienTai = Sao( 86, "Thiên tài", saoNguHanh: "O", saoLoai: 2, ); final saoThienTho = Sao( 87, "Thiên thọ", saoNguHanh: "O", saoLoai: 5, ); final saoThienThuong = Sao( 88, "Thiên thương", saoNguHanh: "O", saoLoai: 12, ); final saoThienSu = Sao( 89, "Thiên sứ", saoNguHanh: "T", saoLoai: 12, ); final saoThienLa = Sao( 90, "Thiên la", saoNguHanh: "O", saoLoai: 12, ); final saoDiaVong = Sao( 91, "Địa võng", saoNguHanh: "O", saoLoai: 12, ); final saoHoaKhoa = Sao( 92, "Hóa khoa", saoNguHanh: "T", saoLoai: 5, ); final saoHoaQuyen = Sao( 93, "Hóa quyền", saoNguHanh: "T", saoLoai: 4, ); final saoHoaLoc = Sao( 94, "Hóa lộc", saoNguHanh: "M", saoLoai: 3, ); final saoHoaKy = Sao( 95, "Hóa kỵ", saoNguHanh: "T", saoLoai: 13, ); final saoCoThan = Sao( 96, "Cô thần", saoNguHanh: "O", saoLoai: 13, ); final saoQuaTu = Sao( 97, "Quả tú", saoNguHanh: "O", saoLoai: 13, ); final saoThienMa = Sao( 98, "Thiên mã", saoNguHanh: "H", saoLoai: 3, ); final saoPhaToai = Sao( 99, "Phá toái", saoNguHanh: "H", saoLoai: 12, ); final saoThienQuan = Sao( 100, "Thiên quan", saoNguHanh: "H", saoLoai: 5, ); final saoThienPhuc = Sao( 101, "Thiên phúc", saoNguHanh: "H", saoLoai: 5, ); final saoLuuHa = Sao( 102, "Lưu hà", saoNguHanh: "T", saoLoai: 12, ); final saoThienTru = Sao( 103, "Thiên trù", saoNguHanh: "O", saoLoai: 5, ); final saoKiepSat = Sao( 104, "Kiếp sát", saoNguHanh: "H", saoLoai: 11, ); final saoHoaCai = Sao( 105, "Hoa cái", saoNguHanh: "K", saoLoai: 14, ); final saoVanTinh = Sao( 106, "Văn tinh", saoNguHanh: "H", saoLoai: 6, ); final saoDauQuan = Sao( 107, "Đẩu quân", saoNguHanh: "H", saoLoai: 5, ); final saoThienKhong = Sao( 108, "Thiên không", saoNguHanh: "T", saoLoai: 11, ); // Lưu niên tinh hệ final saoLuuThaiTue = Sao( 109, "L.Thái tuế", saoNguHanh: "H", saoLoai: 15, saoPhuongVi: "", saoAmDuong: 0, vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuTangMon = Sao( 110, "L.Tang môn", saoNguHanh: "M", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuBachHo = Sao( 111, "L.Bạch hổ", saoNguHanh: "K", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuLocTon = Sao( 112, "L.Lộc tồn", saoNguHanh: "O", saoLoai: 3, saoPhuongVi: "Bắc đẩu tinh", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuKinhDuong = Sao( 113, "L.Kình dương", saoNguHanh: "K", saoLoai: 11, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuDaLa = Sao( 114, "L.Đà la", saoNguHanh: "K", saoLoai: 11, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuThienMa = Sao( 115, "L.Thiên mã", saoNguHanh: "H", saoLoai: 3, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuThienKhoc = Sao( 116, "L.Thiên khốc", saoNguHanh: "T", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuThienHu = Sao( 117, "L.Thiên hư", saoNguHanh: "T", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuThienKhoi = Sao( 118, "L.Thiên khôi", saoNguHanh: "H", saoLoai: 6, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuThienViet = Sao( 119, "L.Thiên việt", saoNguHanh: "H", saoLoai: 6, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuDaoHoa = Sao( 120, "L.Đào hoa", saoNguHanh: "M", saoLoai: 8, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuHongLoan = Sao( 121, "L.Hồng loan", saoNguHanh: "T", saoLoai: 8, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuHoaKhoa = Sao( 122, "L.Hóa khoa", saoNguHanh: "T", saoLoai: 5, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuHoaQuyen = Sao( 123, "L.Hóa quyền", saoNguHanh: "T", saoLoai: 4, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuHoaLoc = Sao( 124, "L.Hóa lộc", saoNguHanh: "M", saoLoai: 3, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuHoaKy = Sao( 125, "L.Hóa kỵ", saoNguHanh: "T", saoLoai: 13, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuPhuongCac = Sao( 126, "L.Phượng các", saoNguHanh: "O", saoLoai: 3, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuTuongQuan = Sao( 127, "L.Tướng quân", saoNguHanh: "M", saoLoai: 4, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuTauThu = Sao( 128, "L.Tấu thư", saoNguHanh: "K", saoLoai: 3, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuDuongPhu = Sao( 129, "L.Đường phù", saoNguHanh: "M", saoLoai: 4, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuQuanPhu3 = Sao( 130, "L.Quan phù", saoNguHanh: "H", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuPhiLiem = Sao( 131, "L.Phi liêm", saoNguHanh: "H", saoLoai: 2, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuHyThan = Sao( 132, "L.Hỷ thần", saoNguHanh: "H", saoLoai: 5, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuLuuHa = Sao( 133, "L.Lưu hà", saoNguHanh: "T", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuQuocAn = Sao( 134, "L.Quốc ấn", saoNguHanh: "O", saoLoai: 6, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuBenhPhu = Sao( 135, "L.Bệnh phù", saoNguHanh: "O", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuDaiHao = Sao( 136, "L.Đại hao", saoNguHanh: "H", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuPhucBinh = Sao( 137, "L.Phục binh", saoNguHanh: "H", saoLoai: 13, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuQuaTu = Sao( 138, "L.Quả tú", saoNguHanh: "O", saoLoai: 13, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuQuanPhu2 = Sao( 139, "L.Quan phủ", saoNguHanh: "H", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuDieuKhach = Sao( 140, "L.Điếu khách", saoNguHanh: "H", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuLucSi = Sao( 141, "L.Lực sĩ", saoNguHanh: "H", saoLoai: 2, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuThanhLong = Sao( 142, "L.Thanh long", saoNguHanh: "T", saoLoai: 5, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuHoaCai = Sao( 143, "L.Hoa cái", saoNguHanh: "K", saoLoai: 14, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuThienHy = Sao( 144, "L.Thiên hỷ", saoNguHanh: "T", saoLoai: 5, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuTieuHao = Sao( 145, "L.Tiểu hao", saoNguHanh: "H", saoLoai: 12, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); final saoLuuCoThan = Sao( 146, "L.Cô thần", saoNguHanh: "O", saoLoai: 13, saoPhuongVi: "", saoAmDuong: "", vongTrangSinh: 0, saoLuuNien: true, ); class LapThienBan { int gioiTinh; String namNu; late Map<String, dynamic> chiGioSinh; int canGioSinh = 0; String gioSinh; int timeZone; String today; int ngayDuong; int thangDuong; int namDuong; String ten; int? namXemTieuVan; int canNamTieuVan = 0; int chiNamTieuVan = 0; int ngayAm = 0; int thangAm = 0; int namAm = 0; int thangNhuan = 0; int canThang = 0; int canNam = 0; int chiNam = 0; int chiThang = 0; String canThangTen = ''; String canNamTen = ''; String chiThangTen = ''; String chiNamTen = ''; int canNgay = 0; int chiNgay = 0; String canNgayTen = ''; String chiNgayTen = ''; String amDuongNamSinh = ''; String amDuongMenh = ''; int hanhCuc = 0; String tenCuc = ''; String menhChu = ''; String thanChu = ''; String menh = ''; String banMenh = ''; String sinhKhac = ''; String canNamTieuVanTen = ''; String chiNamTieuVanTen = ''; LapThienBan( int nn, int tt, int nnnn, int gioSinhNumber, int gioiTinhInput, String tenInput, DiaBan diaBan, { bool duongLich = true, int timeZoneInput = 7, int? namXemTieuVanInput }) : gioiTinh = gioiTinhInput == 1 ? 1 : -1, namNu = gioiTinhInput == 1 ? "Nam" : "Nữ", ngayDuong = nn, thangDuong = tt, namDuong = nnnn, ten = tenInput, gioSinh = gioSinhNumber.toString(), timeZone = timeZoneInput, today = DateTime.now().toLocal().toString() { chiGioSinh = AmDuong.diaChi[gioSinhNumber]; canGioSinh = ((((Time.jdFromDate(nn, tt, nnnn) - 1) * 2) % 10) + gioSinhNumber) % 10; if (canGioSinh == 0) canGioSinh = 10; gioSinh = '${AmDuong.thienCan[canGioSinh]["tenCan"]} ${chiGioSinh['tenChi']}'; if (namXemTieuVanInput != null) { namXemTieuVan = namXemTieuVanInput; var canChi = ngayThangNamCanChi(5, 5, namXemTieuVanInput, duongLich: false, timeZone: timeZone); canNamTieuVan = canChi[1]; chiNamTieuVan = canChi[2]; canNamTieuVanTen = AmDuong.thienCan[canNamTieuVan]["tenCan"]; chiNamTieuVanTen = AmDuong.diaChi[chiNamTieuVan]["tenChi"]; } if (duongLich) { var result = ngayThangNam(ngayDuong, thangDuong, namDuong, duongLich: true, timeZone: timeZone); ngayAm = result[0]; thangAm = result[1]; namAm = result[2]; thangNhuan = result[3]; } else { ngayAm = ngayDuong; thangAm = thangDuong; namAm = namDuong; } var canChiResult = ngayThangNamCanChi(ngayAm, thangAm, namAm, duongLich: false, timeZone: timeZone); canThang = canChiResult[0]; canNam = canChiResult[1]; chiNam = canChiResult[2]; chiThang = thangAm; canThangTen = AmDuong.thienCan[canThang]['tenCan']; canNamTen = AmDuong.thienCan[canNam]['tenCan']; chiThangTen = AmDuong.diaChi[thangAm]['tenChi']; chiNamTen = AmDuong.diaChi[chiNam]['tenChi']; var ngayResult = AmDuong.canChiNgay(ngayDuong, thangDuong, namDuong, duongLich: duongLich, timeZone: timeZone); canNgay = ngayResult[0]; chiNgay = ngayResult[1]; canNgayTen = AmDuong.thienCan[canNgay]['tenCan']; chiNgayTen = AmDuong.diaChi[chiNgay]['tenChi']; int cungAmDuong = diaBan.cungMenh % 2 == 1 ? 1 : -1; amDuongNamSinh = chiNam % 2 == 1 ? "Dương" : "Âm"; amDuongMenh = cungAmDuong * gioiTinh == 1 ? "Âm dương thuận lý" : "Âm dương nghịch lý"; String cuc = timCuc(diaBan.cungMenh, canNam); hanhCuc = AmDuong.nguHanh(cuc)["id"]; tenCuc = AmDuong.nguHanh(cuc)["tenCuc"]; menhChu = AmDuong.diaChi[canNam]['menhChu']; thanChu = AmDuong.diaChi[canNam]['thanChu']; menh = nguHanhNapAm(chiNam, canNam); int menhId = nguHanh(menh)['id']; int? menhCucVal = AmDuong.sinhKhac(menhId, hanhCuc); if (menhCucVal == 1) { sinhKhac = "Bản Mệnh sinh Cục"; } else if (menhCucVal == -1) { sinhKhac = "Bản Mệnh khắc Cục"; } else if (menhCucVal == -1) { sinhKhac = "Cục khắc Bản Mệnh"; } else if (menhCucVal == 1) { sinhKhac = "Cục sinh Bản mệnh"; } else { sinhKhac = "Cục hòa Bản Mệnh"; } banMenh = nguHanhNapAm(chiNam, canNam, xuatBanMenh: true); } static List<int> ngayThangNam(int nn, int tt, int nnnn, {bool duongLich = true, int timeZone = 7}) { return AmDuong.ngayThangNam(nn, tt, nnnn, duongLich: duongLich, timeZone: timeZone); } List<int> ngayThangNamCanChi(int nn, int tt, int nnnn, {bool duongLich = true, int timeZone = 7}) { return AmDuong.ngayThangNamCanChi(nn, tt, nnnn, duongLich: duongLich, timeZone: timeZone); } static Map<String, dynamic> nguHanh(String tenHanh) { return AmDuong.nguHanh(tenHanh); } static String nguHanhNapAm(int diaChi, int thienCan, {bool xuatBanMenh = false}) { return AmDuong.nguHanhNapAm(diaChi, thienCan, xuatBanMenh: xuatBanMenh); } static List<Map<String, dynamic>> thienCan() { return AmDuong.thienCan; } static String timCuc(int viTriCungMenhTrenDiaBan, int canNamSinh) { return AmDuong.timCuc(viTriCungMenhTrenDiaBan, canNamSinh); } static List<int> jdToDate(int jd) { return Time.jdToDate(jd); } @override String toString() { return 'LapThienBan(amDuongMenh: $amDuongMenh), amDuongNamSinh: $amDuongNamSinh, banMenh: $banMenh, canGioSinh: $canGioSinh, canNam: $canNam, canNamTen: $canNamTen, canNamTieuVanTen: $canNamTieuVanTen, $canNgay: canNgay, canNgayTen: $canNgayTen, chiGioSinh: $chiGioSinh, chiNam: $chiNam, chiNamTen: $chiNamTen, chiNamTieuVanTen: chiNamTieuVanTen, chiNgay: $chiNgay, chiNgayTen: $chiNgayTen, chiThang: $chiThang, chiThangTen: $chiThangTen, gioSinh: $gioSinh, gioiTinh: $gioiTinh, hanhCuc: $hanhCuc, menh: $menh, menhChu: $menhChu, namAm: $namAm, namDuong: $namDuong, namNu: $namNu, namXemTieuVan: $namXemTieuVan, ngayAm: $ngayAm, ngayDuong: $ngayDuong, sinhKhac: $sinhKhac, ten: $ten, tenCuc: $tenCuc, thanChu: $thanChu, thangAm: $thangAm, thangDuong: $thangDuong, thangNhuan: $thangNhuan, timeZone: $timeZone, today: $today'; } } String capitalizeWords(String input) { return input.split(' ').map((word) { if (word.isEmpty) return word; return word[0].toUpperCase() + word.substring(1).toLowerCase(); }).join(' '); } String generateLasoContent(LapThienBan thienBan, List<CungDiaBan> thapNhiCung) { final namDuong = thienBan.namDuong; final canNamTen = thienBan.canNamTen; final ten = thienBan.ten; final chiNamTen = thienBan.chiNamTen; // thapNhiCung.removeAt(0); final sapXepCungTheoCungSo = List<CungDiaBan>.from(thapNhiCung)..sort((a, b) => a.cungSo.compareTo(b.cungSo)); final sapXepCungTheoTuoi = List<CungDiaBan>.from(thapNhiCung)..sort((a, b) => (a.cungDaiHan ?? 0).compareTo(b.cungDaiHan ?? 0)); final contentThapNhiCung = sapXepCungTheoTuoi.asMap().entries.map((entry) { final index = entry.key; final cung = entry.value; final cungSao = cung.cungSao; final cungSo = cung.cungSo; final chinhTinh = cungSao.where((sao) => sao.saoAmDuong != '').toList(); final phuTinh = cungSao.where((sao) => sao.saoAmDuong == '').toList(); final cungDoiXung = cungSo + 6 > 12 ? sapXepCungTheoCungSo[cungSo + 6 - 12] : sapXepCungTheoCungSo[cungSo + 6 - 1]; final cungTamHop1 = cungSo + 4 > 12 ? sapXepCungTheoCungSo[cungSo + 4 - 12] : sapXepCungTheoCungSo[cungSo + 4 - 1]; final cungSoTamHop1 = cungTamHop1.cungSo - 1; final cungTamHop2 = cungSoTamHop1 + 4 > 12 ? sapXepCungTheoCungSo[cungSoTamHop1 + 4 - 12] : sapXepCungTheoCungSo[cungSoTamHop1 + 4 - 1]; final stt = index + 1; final sttNext = index == sapXepCungTheoTuoi.length - 1 ? null : index + 1; final cungTen = cung.cungTen; final cungChu = cung.cungChuTen; final cungDaiHan = cung.cungDaiHan ?? 0; final cungTieuHan = cung.cungTieuHan; final cungDaiVan = sttNext == null ? "$cungDaiHan tuổi trở lên" : "$cungDaiHan tuổi đến năm ${sapXepCungTheoTuoi[sttNext].cungDaiHan! - 1} tuổi"; return """ $stt. Cung vị: ${capitalizeWords(cungTen)} Cung chức: ${capitalizeWords(cungChu ?? '')} của anh $ten sinh năm $namDuong Tam hợp với cung ${capitalizeWords(cungTamHop1.cungChuTen ?? '')} và ${capitalizeWords(cungTamHop2.cungChuTen ?? '')}, đối xung ngoại cảnh là ${capitalizeWords(cungDoiXung.cungChuTen ?? '')} Chính Tinh (ảnh hưởng min 50%, max 80%): ${chinhTinh.map((sao) => capitalizeWords(sao.saoTen)).join(' + ')} Phụ Tinh (ảnh hưởng min 20%, max 50%): ${phuTinh.map((sao) => capitalizeWords(sao.saoTen)).join(' + ')} Đại vận thứ ${index == 0 ? 'nhất' : stt} của anh ${capitalizeWords(ten)} sinh năm $namDuong ($cungDaiVan) Tiểu vận: năm ${capitalizeWords(cungTieuHan ?? '')} """; }).join('\n'); return "Lá số của $ten sinh năm $namDuong ($canNamTen $chiNamTen)\n$contentThapNhiCung"; } void main(){ String hoTen = 'tien'; int ngaySinh = 24; int thangSinh = 3; int namSinh = 2000; int gioSinh = 1; int gioiTinh = 1; bool duongLich = true; int timeZone = 7; DiaBan diaBan = lapDiaBan(ngaySinh, thangSinh, namSinh, gioSinh, gioiTinh, duongLich, timeZone, 2025); LapThienBan thienBan = LapThienBan( ngaySinh, // nn thangSinh, // tt namSinh, // nnnn gioSinh, // gioSinhNumber (int) gioiTinh, // gioiTinhInput hoTen, // tenInput diaBan, // diaBan duongLich: true, timeZoneInput: 1 ); List<CungDiaBan> thapNhiCung = diaBan.thapNhiCung.sublist(1); String content = generateLasoContent(thienBan, thapNhiCung); print(content); }
Editor is loading...
Leave a Comment