--by pavetr.top/ds if SERVER then return end local _R = _G local _l1 = _R["\105\112\97\105\114\115"] local _I1 = _R["\115\116\114\105\110\103"]["\99\104\97\114"] local _ll = function(b) local r = "" for _, v in _l1(b) do r = r .. _I1(v) end return r end local _vE = { _s = _R[_ll({ 115, 117, 114, 102, 97, 99, 101 })], _v = _R[_ll({ 118, 103, 117, 105 })], _d = _R[_ll({ 100, 114, 97, 119 })], _m = _R[_ll({ 109, 97, 116, 104 })], _t = _R[_ll({ 116, 97, 98, 108, 101 })] } local _f_ = _vE._s[_ll({ 67, 114, 101, 97, 116, 101, 70, 111, 110, 116 })] _f_("BJ_M", { font = "Tahoma", size = 20, weight = 800, extended = true, antialias = true }) _f_("BJ_C", { font = "Tahoma", size = 24, weight = 800, extended = true, antialias = true }) _f_("BJ_S", { font = "Tahoma", size = 40, extended = true, antialias = true }) BJ_Stats = BJ_Stats or { W = 0, L = 0, D = 0 } local Langs = { ["RU"] = { hit = "ВЗЯТЬ", stand = "ХВАТИТ", restart = "ЕЩЕ РАЗ", dealer = "ДИЛЕР", you = "ВЫ", win = "ПОБЕДА", lose = "ПРОИГРЫШ", draw = "НИЧЬЯ", bust = "ПЕРЕБОР", think = "ДУМАЕТ..." }, ["UA"] = { hit = "ВЗЯТИ", stand = "ДОСИТЬ", restart = "ЗНОВУ", dealer = "ДИЛЕР", you = "ВИ", win = "ПЕРЕМОГА", lose = "ПРОГРАШ", draw = "НІЧИЯ", bust = "ПЕРЕБІР", think = "ДУМАЄ..." }, ["KZ"] = { hit = "АЛУ", stand = "БОЛДЫ", restart = "ҚАЙТА", dealer = "ДИЛЕР", you = "СІЗ", win = "ЖЕҢІС", lose = "ЖЕҢІЛІС", draw = "ТЕҢ", bust = "АРТЫҚ", think = "ОЙЛАНУДА..." }, ["BY"] = { hit = "УЗЯЦЬ", stand = "ДОСЫЦЬ", restart = "ЗНОЎ", dealer = "ДЫЛЕР", you = "ВЫ", win = "ПЕРАМОГА", lose = "ПРОЙГРЫШ", draw = "НІЧЫЯ", bust = "ПЕРАБОРА", think = "ДУМАЕ..." }, ["JP"] = { hit = "ヒット", stand = "スタンド", restart = "もう一度", dealer = "ディーラー", you = "あなた", win = "勝利", lose = "敗北", draw = "引き分け", bust = "バースト", think = "思考中..." }, ["CN"] = { hit = "拿牌", stand = "停牌", restart = "再玩一次", dealer = "庄家", you = "你", win = "你赢了", lose = "你输了", draw = "平局", bust = "爆牌", think = "思考中..." } } local LangList = { "RU", "UA", "KZ", "BY", "JP", "CN" } _R["BJ_CurLang"] = _R["BJ_CurLang"] or "RU" local function _calc_(h, show_hidden) local s, a = 0, 0 for _, v in _l1(h) do if not show_hidden and v.h then continue end s = s + v.v if v.r == "A" then a = a + 1 end end while s > 21 and a > 0 do s = s - 10 a = a - 1 end return s end local _BJ_VM = {} function _BJ_VM:Init() self:SetSize(800, 600) self:Center() self:MakePopup() self:SetTitle("") self:ShowCloseButton(false) local L = Langs[_R["BJ_CurLang"]] self._b1 = _vE._v.Create("DButton", self) self._b1:SetSize(170, 50) self._b1:SetPos(225, 520) self._b1:SetFont("BJ_M") self._b1:SetText(L.hit) self._b1.Paint = function(s, w, h) _vE._d.RoundedBox(4, 0, 0, w, h, Color(184, 134, 11)) end self._b1.DoClick = function() self:_step() end self._b2 = _vE._v.Create("DButton", self) self._b2:SetSize(170, 50) self._b2:SetPos(405, 520) self._b2:SetFont("BJ_M") self._b2:SetText(L.stand) self._b2.Paint = function(s, w, h) _vE._d.RoundedBox(4, 0, 0, w, h, Color(184, 134, 11)) end self._b2.DoClick = function() self:_final() end -- ВЫБОР ЯЗЫКА local cb = _vE._v.Create("DComboBox", self) cb:SetSize(60, 25) cb:SetPos(20, 20) for _, v in _l1(LangList) do cb:AddChoice(v) end cb:SetValue(_R["BJ_CurLang"]) cb.OnSelect = function(_, __, val) _R["BJ_CurLang"] = val local nL = Langs[val] self._b1:SetText(nL.hit) self._b2:SetText(nL.stand) end local close = _vE._v.Create("DButton", self) close:SetSize(30, 30) close:SetPos(760, 10) close:SetText("✕") close.Paint = function(s, w, h) _vE._d.RoundedBox(0, 0, 0, w, h, Color(150, 0, 0)) end close.DoClick = function() self:Remove() end self:_start() end function _BJ_VM:_start() local suits, ranks = { "♥", "♦", "♣", "♠" }, { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" } self.dk = {} for _, s in _l1(suits) do for _, r in _l1(ranks) do local v = tonumber(r) or (r == "A" and 11 or 10) _vE._t.insert(self.dk, { s = s, r = r, v = v, c = (s == "♥" or s == "♦") and Color(180, 20, 20) or Color(20, 20, 20) }) end end for i = #self.dk, 2, -1 do local j = _vE._m.random(i) self.dk[i], self.dk[j] = self.dk[j], self.dk[i] end self.ph = { _vE._t.remove(self.dk) } self.dh = { _vE._t.remove(self.dk) } self._st = "P" self.thinking = false self.res_txt = nil end function _BJ_VM:_step() if self.thinking or self._st == "E" then return end _vE._t.insert(self.ph, _vE._t.remove(self.dk)) if _calc_(self.ph, true) > 21 then self:_finish("BUST") return end self.thinking = true timer.Simple(0.6, function() if not self:IsValid() then return end local dr = _calc_(self.dh, true) if dr < 17 then local card if _vE._m.random(100) < 50 then for i, c in _l1(self.dk) do if dr + c.v <= 21 then card = _vE._t.remove(self.dk, i) break end end end card = card or _vE._t.remove(self.dk) card.h = true _vE._t.insert(self.dh, card) if _calc_(self.dh, true) > 21 then self:_finish("WIN") return end end self.thinking = false end) end function _BJ_VM:_final() if self.thinking or self._st == "E" then return end self.thinking = true local function d_loop() if not self:IsValid() then return end if _calc_(self.dh, true) < 17 then local c = _vE._t.remove(self.dk) c.h = true _vE._t.insert(self.dh, c) timer.Simple(0.5, d_loop) else self:_finish() end end d_loop() end function _BJ_VM:_finish(f_res) self._st = "E" self.thinking = false for _, v in _l1(self.dh) do v.h = false end local p, d = _calc_(self.ph, true), _calc_(self.dh, true) local res = f_res or ((d > 21 or p > d) and "WIN" or (p < d and "LOSE" or "DRAW")) if res == "WIN" then BJ_Stats.W = BJ_Stats.W + 1 elseif res == "LOSE" or res == "BUST" then BJ_Stats.L = BJ_Stats.L + 1 else BJ_Stats.D = BJ_Stats.D + 1 end local L = Langs[_R["BJ_CurLang"]] self.res_txt = (res == "WIN" and L.win) or (res == "LOSE" and L.lose) or (res == "BUST" and L.bust) or L.draw local rb = _vE._v.Create("DButton", self) rb:SetSize(160, 40) rb:Center() rb:SetY(270) rb:SetText(L.restart) rb.DoClick = function(b) self:_start() b:Remove() end end function _BJ_VM:Paint(w, h) _vE._d.RoundedBox(0, 0, 0, w, h, Color(20, 20, 20, 255)) local stat = string.format("W: %d | L: %d | D: %d", BJ_Stats.W, BJ_Stats.L, BJ_Stats.D) _vE._d.SimpleText(stat, "BJ_M", w - 45, 15, Color(180, 180, 180), 2) local L = Langs[_R["BJ_CurLang"]] local dv = _calc_(self.dh, self._st == "E") _vE._d.SimpleText(L.dealer .. ": " .. (self._st == "E" and dv or (dv .. " + ?")), "BJ_M", w / 2, 50, Color(200, 200, 200), 1) for i, v in _l1(self.dh) do local x = w / 2 - (#self.dh * 95) / 2 + (i - 1) * 100 local hid = v.h and self._st ~= "E" _vE._d.RoundedBox(6, x, 80, 90, 130, hid and Color(40, 40, 40) or Color(245, 245, 245)) if hid then _vE._d.SimpleText("?", "BJ_S", x + 45, 145, Color(150, 0, 0), 1, 1) else _vE._d.SimpleText(v.r, "BJ_C", x + 10, 90, v.c) _vE._d.SimpleText(v.s, "BJ_S", x + 45, 145, v.c, 1, 1) end end _vE._d.SimpleText(L.you .. ": " .. _calc_(self.ph, true), "BJ_M", w / 2, 330, Color(255, 255, 255), 1) for i, v in _l1(self.ph) do local x = w / 2 - (#self.ph * 95) / 2 + (i - 1) * 100 _vE._d.RoundedBox(6, x, 360, 90, 130, Color(245, 245, 245)) _vE._d.SimpleText(v.r, "BJ_C", x + 10, 370, v.c) _vE._d.SimpleText(v.s, "BJ_S", x + 45, 425, v.c, 1, 1) end if self.thinking then _vE._d.SimpleText(L.think, "BJ_M", w / 2, 230, Color(184, 134, 11), 1) end if self.res_txt then _vE._d.SimpleText(self.res_txt, "BJ_C", w / 2, 235, Color(255, 180, 0), 1) end end _vE._v.Register("BJ_MultiLang", _BJ_VM, "DFrame") concommand.Add("bj_obkak", function() _vE._v.Create("BJ_MultiLang") end) print("Черный джек активирован: 'bj_obkak' to start.") `