Add Assembler Casino project with 2.5D graphics and tools

This commit is contained in:
Artvasil09 2026-09-24 19:31:05 +03:00
parent fb53e49ffd
commit a24acf7936
124 changed files with 66144 additions and 0 deletions

25
.gitignore vendored Normal file
View file

@ -0,0 +1,25 @@
# Build intermediate files
*.obj
*.pdb
*.ilk
*.tmp
*.res
# Large zip archives & installer payloads (>100MB)
*.zip
PokerGameSetup.exe
PokerGameSetup_*.exe
# Legacy backups folder (kept locally)
backups/
# Generated frames & temporary video tools (270MB)
tools/generated_frames/
__pycache__/
*.pyc
# Local debug / test captures
*_test*.png
debug_render.png
render_view.png
*.log

41
AGENTS.md Normal file
View file

@ -0,0 +1,41 @@
# AGENTS.md
## Project identity
Single-file x86 assembly (MASM32) Windows console casino game. Source: `poker.asm` (~8500 lines). Python scripts are only for previewing animations — not part of the game itself.
## Build
- **Assembler**: `ml /c /coff /Cp /nologo poker.asm`
- **Link**: `link /SUBSYSTEM:CONSOLE /RELEASE /VERSION:4.0 /LIBPATH:"<MASM32>\lib" poker.obj kernel32.lib winmm.lib user32.lib ws2_32.lib gdi32.lib`
- **IDE project**: `poker.wap` (Pelles C/Windows)
- **Libraries**: `kernel32.lib`, `winmm.lib`, `user32.lib`, `ws2_32.lib`, `gdi32.lib`
- **Build script**: `build.bat` (uses MASM32 from `D:\MASM32\masm32`)
Requires MASM32 toolchain (`ml.exe`, `link.exe` from e.g. `F:\MASM32\masm32\bin`).
## Encoding
- Source strings, `dealer_phrases.txt`: **CP1251** (Windows-1251). Do not re-save as UTF-8.
- `.ans` animation files: ANSI escape codes + CP1251, frames separated by form feed (`\f`, 0x0C).
- Preview scripts run `chcp 65001` before printing.
## Assets
| File | Purpose |
|------|---------|
| `casino_intro.ans` | Animated intro (skippable with Enter, loops at `@@LOOP@@` marker) |
| `hakari_dance.ans` | Animated dance on jackpot win |
| `dealer_phrases.txt` | CP1251, each line prefixed `W|` (win), `L|` (loss), `D|` (draw) |
## Workflow
- **No git**. Backups in `backups/` follow: `poker_before_<feature>_<YYYYMMDD_HHMMSS>.{asm,exe}`
- **No tests**. Manually verify by running `poker.exe`.
- Preview animations: `preview_hakari.bat` / `preview_intro.bat` (or `python preview_hakari.py` directly).
## Games (menu)
1=21/Blackjack, 2=Poker, 3=CloverPit (slots 5×3), 4=Russian Roulette, 5=Skulls & cups, 6=Coin, 7=Dice, 8=Roulette, 9=Slot machine, 10=Durak, 11=Training, 12=Observer AI vs AI, 0=Exit
Cheat codes: `MONEYRAIN`, `SEVENS`, `WINNEXT`, `GODMODE`, `FAIRPLAY`, `GOAL`, `RESETBANK`, `EASYAI`/`NORMALAI`/`HARDAI`, `JACKPOT`, `HIGHROLLER`, `DOUBLECASH`, `ONEBUCK` (entered at main menu).

BIN
Assembler Casino.exe Normal file

Binary file not shown.

13
CMakeLists.txt Normal file
View file

@ -0,0 +1,13 @@
cmake_minimum_required(VERSION 3.10)
project(poker_portable C)
set(CMAKE_C_STANDARD 99)
add_executable(poker_portable
src_portable/casino_portable.c
src_portable/casino_portable.h
)
if(WIN32)
target_link_libraries(poker_portable ws2_32)
endif()

18
Makefile Normal file
View file

@ -0,0 +1,18 @@
CC ?= gcc
CFLAGS ?= -std=c99 -O2 -Wall
ifeq ($(OS),Windows_NT)
LIBS = -lws2_32
TARGET = poker_portable.exe
else
LIBS =
TARGET = poker_portable
endif
all: $(TARGET)
$(TARGET): src_portable/casino_portable.c src_portable/casino_portable.h
$(CC) $(CFLAGS) src_portable/casino_portable.c -o $(TARGET) $(LIBS)
clean:
rm -f $(TARGET) *.o

Binary file not shown.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,17 @@
W|Красиво. Фишки идут к вам.
W|Стол сегодня явно на вашей стороне.
W|Хороший удар по банку казино.
W|Похоже, удача села рядом с вами.
W|Казино делает вид, что все под контролем.
W|Вот это заход. Касса вздрогнула.
L|Казино забирает ставку.
L|Не лучший расклад, но вечер еще живой.
L|Фишки уходят со стола.
L|Стол холодный. Бывает.
L|Крупье молча сгребает фишки.
L|Риск был красивый, результат не очень.
D|Ставка остается при вас.
D|Никто не сдвинул банк. Играем дальше.
D|Ровно. Без победителя.
D|Карты пожали друг другу руки.
D|Стол решил не выбирать сторону.

BIN
assets/icons/casino.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
bin/poker.dll Normal file

Binary file not shown.

BIN
bin/poker.exe Normal file

Binary file not shown.

14
build.bat Normal file
View file

@ -0,0 +1,14 @@
@echo off
set MASM_PATH=D:\MASM32\masm32
echo Assembling poker.asm...
"%MASM_PATH%\bin\ml.exe" /c /coff /Cp /nologo /I. /I"%MASM_PATH%\include" poker.asm
if errorlevel 1 goto err
echo Linking poker.obj...
"%MASM_PATH%\bin\link.exe" /SUBSYSTEM:CONSOLE /RELEASE /VERSION:4.0 /LIBPATH:"%MASM_PATH%\lib" /OUT:poker.exe poker.obj kernel32.lib winmm.lib user32.lib ws2_32.lib gdi32.lib
if errorlevel 1 goto err
echo [SUCCESS] poker.exe built successfully!
goto end
:err
echo [ERROR] Build failed!
pause
:end

View file

@ -0,0 +1,57 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Security.Cryptography;
using System.Windows.Forms;
namespace AssemblerCasinoLauncher
{
static class Program
{
const string ExpectedPokerSha256 = "76C4886161218322A5286B48F5542EBF8FBBB78A172EDCA40267148AC0D5EF99";
[STAThread]
static void Main()
{
var root = AppDomain.CurrentDomain.BaseDirectory;
var game = Path.Combine(root, "bin", "poker.exe");
if (!File.Exists(game))
{
MessageBox.Show("bin\\poker.exe не найден рядом с лаунчером.", "Assembler Casino", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (!VerifyGame(game))
{
MessageBox.Show("bin\\poker.exe был изменен или поврежден. Запуск остановлен.", "Assembler Casino", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Process.Start(new ProcessStartInfo
{
FileName = game,
WorkingDirectory = root,
UseShellExecute = false
});
}
static bool VerifyGame(string gamePath)
{
try
{
using (var sha = SHA256.Create())
using (var stream = File.OpenRead(gamePath))
{
var actual = BitConverter.ToString(sha.ComputeHash(stream)).Replace("-", "");
return actual.Equals(ExpectedPokerSha256, StringComparison.OrdinalIgnoreCase);
}
}
catch
{
return false;
}
}
}
}

581
build/PokerGameSetupGui.cs Normal file
View file

@ -0,0 +1,581 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.IO.Compression;
using System.Linq;
using Microsoft.Win32;
using System.Reflection;
using System.Security.Cryptography;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PokerGameSetup
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new InstallerForm());
}
}
sealed class InstallerForm : Form
{
const string Marker = "<<POKER_GAME_GUI_PAYLOAD_ZIP>>";
const string ExpectedPayloadSha256 = "718663039D0CCB6EE83C62D23C8F8F7A6D4C596135E75F757C101C568E8473E9";
readonly Color bg = Color.FromArgb(15, 12, 10);
readonly Color panel = Color.FromArgb(28, 22, 18);
readonly Color gold = Color.FromArgb(236, 186, 75);
readonly Color red = Color.FromArgb(164, 26, 32);
readonly Color green = Color.FromArgb(29, 135, 64);
readonly Color text = Color.FromArgb(245, 236, 205);
CasinoArtPanel art;
Panel page;
Button backButton;
Button nextButton;
Button cancelButton;
int step;
TextBox folderBox;
CasinoProgress progress;
Label progressText;
CheckBox launchCheck;
string installedPath;
bool installing;
public InstallerForm()
{
Text = "Assembler Casino Setup";
try { Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); } catch { }
StartPosition = FormStartPosition.CenterScreen;
FormBorderStyle = FormBorderStyle.FixedDialog;
MaximizeBox = false;
MinimizeBox = false;
ClientSize = new Size(820, 500);
BackColor = bg;
Font = new Font("Segoe UI", 10f);
art = new CasinoArtPanel { Dock = DockStyle.Left, Width = 260 };
Controls.Add(art);
page = new Panel { Left = 280, Top = 28, Width = 500, Height = 365, BackColor = panel };
page.Paint += (s, e) =>
{
using (var pen = new Pen(Color.FromArgb(88, gold), 2))
e.Graphics.DrawRectangle(pen, 0, 0, page.Width - 1, page.Height - 1);
};
Controls.Add(page);
backButton = MakeButton("Назад");
backButton.Left = 406; backButton.Top = 428; backButton.Click += (s, e) => ShowStep(step - 1);
Controls.Add(backButton);
nextButton = MakeButton("Далее");
nextButton.Left = 532; nextButton.Top = 428; nextButton.Click += NextClicked;
Controls.Add(nextButton);
cancelButton = MakeButton("Отмена");
cancelButton.Left = 658; cancelButton.Top = 428; cancelButton.Click += (s, e) => { if (!installing) Close(); };
Controls.Add(cancelButton);
ShowStep(0);
}
Button MakeButton(string caption)
{
var b = new Button
{
Text = caption,
Width = 108,
Height = 38,
FlatStyle = FlatStyle.Flat,
BackColor = Color.FromArgb(62, 43, 20),
ForeColor = text,
Font = new Font("Segoe UI", 10f, FontStyle.Bold),
Cursor = Cursors.Hand
};
b.FlatAppearance.BorderColor = gold;
b.FlatAppearance.MouseOverBackColor = Color.FromArgb(94, 61, 24);
b.FlatAppearance.MouseDownBackColor = Color.FromArgb(120, 71, 22);
return b;
}
Label MakeLabel(string caption, int x, int y, int w, int h, float size, FontStyle style)
{
var l = new Label
{
Text = caption,
Left = x,
Top = y,
Width = w,
Height = h,
ForeColor = text,
BackColor = Color.Transparent,
Font = new Font("Segoe UI", size, style)
};
page.Controls.Add(l);
return l;
}
void ShowStep(int value)
{
step = Math.Max(0, Math.Min(3, value));
page.Controls.Clear();
art.Stage = step;
art.Invalidate();
backButton.Enabled = step > 0 && !installing;
nextButton.Enabled = !installing;
cancelButton.Enabled = !installing;
nextButton.Text = step == 3 ? "Готово" : "Далее";
if (step == 0) WelcomePage();
if (step == 1) FolderPage();
if (step == 2) InstallPage();
if (step == 3) FinishPage();
}
void WelcomePage()
{
MakeLabel("Добро пожаловать", 32, 32, 430, 42, 22f, FontStyle.Bold);
MakeLabel("Установщик Assembler Casino", 34, 82, 420, 28, 13f, FontStyle.Regular);
MakeLabel("Внутри уже лежит вся игра: exe, арты, звуки, анимации, музыка башни и служебные файлы.", 34, 136, 420, 72, 10.5f, FontStyle.Regular);
MakeLabel("Сейчас выберем папку, красиво распакуем казино и положим рядом нормальный exe для запуска.", 34, 220, 420, 60, 10.5f, FontStyle.Regular);
MakeLabel("Нажми «Далее», если готов открыть двери.", 34, 315, 420, 26, 10.5f, FontStyle.Bold);
}
void FolderPage()
{
MakeLabel("Куда установить игру?", 32, 32, 430, 42, 22f, FontStyle.Bold);
MakeLabel("Можно выбрать любую папку. По умолчанию игра ставится на рабочий стол.", 34, 86, 420, 50, 10.5f, FontStyle.Regular);
folderBox = new TextBox
{
Left = 34,
Top = 160,
Width = 330,
Height = 28,
Text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "покер"),
BackColor = Color.FromArgb(9, 9, 9),
ForeColor = text,
BorderStyle = BorderStyle.FixedSingle
};
page.Controls.Add(folderBox);
var browse = MakeButton("Обзор");
browse.Left = 374; browse.Top = 154; browse.Width = 86;
browse.Parent = page;
browse.Click += (s, e) =>
{
using (var dialog = new FolderBrowserDialog())
{
dialog.Description = "Выбери папку для Assembler Casino";
dialog.SelectedPath = Directory.Exists(folderBox.Text) ? folderBox.Text : Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
if (dialog.ShowDialog(this) == DialogResult.OK)
folderBox.Text = Path.Combine(dialog.SelectedPath, "покер");
}
};
MakeLabel("Сохранения игроков будут храниться отдельно в AppData, поэтому переустановка игру не обнулит.", 34, 230, 420, 70, 10.5f, FontStyle.Regular);
}
void InstallPage()
{
MakeLabel("Установка", 32, 32, 430, 42, 22f, FontStyle.Bold);
MakeLabel("Казино распаковывается. Фишки на стол, карты в колоду, барабаны на место.", 34, 86, 420, 52, 10.5f, FontStyle.Regular);
progressText = MakeLabel("Ожидание старта...", 34, 166, 420, 28, 10.5f, FontStyle.Bold);
progress = new CasinoProgress { Left = 34, Top = 208, Width = 420, Height = 34 };
page.Controls.Add(progress);
BeginInstall();
}
void FinishPage()
{
MakeLabel("Готово", 32, 32, 430, 42, 22f, FontStyle.Bold);
MakeLabel("Assembler Casino установлено. Можно запускать и проверять, как оно выглядит уже на другом компьютере.", 34, 86, 420, 70, 10.5f, FontStyle.Regular);
MakeLabel("Удачи за столами. И да, казино все еще подозрительно смотрит на чит-коды.", 34, 176, 420, 48, 10.5f, FontStyle.Regular);
launchCheck = new CheckBox
{
Text = "Запустить игру после закрытия установщика",
Left = 34,
Top = 275,
Width = 390,
Height = 28,
Checked = true,
BackColor = Color.Transparent,
ForeColor = text
};
page.Controls.Add(launchCheck);
cancelButton.Text = "Закрыть";
}
async void BeginInstall()
{
installing = true;
backButton.Enabled = nextButton.Enabled = cancelButton.Enabled = false;
try
{
var target = folderBox != null && !string.IsNullOrWhiteSpace(folderBox.Text)
? folderBox.Text.Trim()
: Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "покер");
await Task.Run(() => ExtractPayload(target));
installedPath = target;
installing = false;
ShowStep(3);
}
catch (Exception ex)
{
installing = false;
backButton.Enabled = nextButton.Enabled = cancelButton.Enabled = true;
MessageBox.Show(this, ex.Message, "Ошибка установки", MessageBoxButtons.OK, MessageBoxIcon.Error);
ShowStep(1);
}
}
void ExtractPayload(string target)
{
Directory.CreateDirectory(target);
Directory.CreateDirectory(Path.Combine(target, "runtime"));
var exe = Assembly.GetExecutingAssembly().Location;
var bytes = File.ReadAllBytes(exe);
var marker = System.Text.Encoding.UTF8.GetBytes(Marker);
var index = FindMarker(bytes, marker);
if (index < 0) throw new InvalidOperationException("В установщике не найден архив игры.");
var payloadBytes = bytes.Skip(index + marker.Length).ToArray();
VerifyPayloadIntegrity(payloadBytes);
var tempZip = Path.Combine(Path.GetTempPath(), "assembler_casino_payload_" + Guid.NewGuid().ToString("N") + ".zip");
File.WriteAllBytes(tempZip, payloadBytes);
try
{
using (var zip = ZipFile.OpenRead(tempZip))
{
var files = zip.Entries.Where(e => !string.IsNullOrEmpty(e.Name)).ToList();
for (int i = 0; i < files.Count; i++)
{
var entry = files[i];
var full = Path.GetFullPath(Path.Combine(target, entry.FullName));
if (!full.StartsWith(Path.GetFullPath(target), StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException("Архив содержит некорректный путь.");
Directory.CreateDirectory(Path.GetDirectoryName(full));
entry.ExtractToFile(full, true);
int percent = (int)((i + 1) * 100.0 / Math.Max(1, files.Count));
SetProgress(percent, "Устанавливаем: " + entry.FullName.Replace('/', '\\'));
}
}
var oldBat = Path.Combine(target, "Assembler Casino.bat");
try { if (File.Exists(oldBat)) File.Delete(oldBat); } catch { }
CreateDesktopShortcut(target);
RegisterUninstaller(target);
SetProgress(100, "Казино установлено.");
}
finally
{
try { File.Delete(tempZip); } catch { }
}
}
void VerifyPayloadIntegrity(byte[] payloadBytes)
{
if (string.IsNullOrWhiteSpace(ExpectedPayloadSha256) || ExpectedPayloadSha256 == "TO_BE_FILLED_BY_RELEASE_BUILD")
return;
using (var sha = SHA256.Create())
{
var hash = sha.ComputeHash(payloadBytes);
var actual = BitConverter.ToString(hash).Replace("-", "");
if (!actual.Equals(ExpectedPayloadSha256, StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException("Архив игры внутри установщика был изменен. Установка остановлена.");
}
}
void CreateDesktopShortcut(string target)
{
try
{
var shellType = Type.GetTypeFromProgID("WScript.Shell");
if (shellType == null) return;
dynamic shell = Activator.CreateInstance(shellType);
var desktop = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
var linkPath = Path.Combine(desktop, "Assembler Casino.lnk");
dynamic shortcut = shell.CreateShortcut(linkPath);
var launcher = Path.Combine(target, "Assembler Casino.exe");
var icon = Path.Combine(target, "assets", "icons", "casino.ico");
shortcut.TargetPath = launcher;
shortcut.WorkingDirectory = target;
shortcut.IconLocation = File.Exists(icon) ? icon : launcher + ",0";
shortcut.Description = "Assembler Casino";
shortcut.Save();
}
catch { }
}
void RegisterUninstaller(string target)
{
try
{
using (var key = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall\AssemblerCasino"))
{
if (key == null) return;
var launcher = Path.Combine(target, "Assembler Casino.exe");
var uninstaller = Path.Combine(target, "Uninstall Assembler Casino.exe");
var icon = Path.Combine(target, "assets", "icons", "casino.ico");
key.SetValue("DisplayName", "Assembler Casino");
key.SetValue("DisplayVersion", "1.0");
key.SetValue("Publisher", "Assembler Casino");
key.SetValue("InstallLocation", target);
key.SetValue("DisplayIcon", File.Exists(icon) ? icon : launcher);
key.SetValue("UninstallString", "\"" + uninstaller + "\"");
key.SetValue("NoModify", 1, RegistryValueKind.DWord);
key.SetValue("NoRepair", 1, RegistryValueKind.DWord);
}
}
catch { }
}
int FindMarker(byte[] bytes, byte[] marker)
{
for (int i = 0; i <= bytes.Length - marker.Length; i++)
{
bool ok = true;
for (int j = 0; j < marker.Length; j++)
{
if (bytes[i + j] != marker[j]) { ok = false; break; }
}
if (ok) return i;
}
return -1;
}
void SetProgress(int value, string caption)
{
if (InvokeRequired)
{
BeginInvoke(new Action<int, string>(SetProgress), value, caption);
return;
}
if (progress != null) progress.Value = value;
if (progressText != null) progressText.Text = caption;
}
void NextClicked(object sender, EventArgs e)
{
if (step == 1)
{
if (folderBox == null || string.IsNullOrWhiteSpace(folderBox.Text))
{
MessageBox.Show(this, "Выбери папку установки.", "Assembler Casino", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
if (step == 2) return;
if (step == 3)
{
if (launchCheck != null && launchCheck.Checked)
{
var root = !string.IsNullOrWhiteSpace(installedPath) ? installedPath : folderBox.Text.Trim();
var path = Path.Combine(root, "Assembler Casino.exe");
if (File.Exists(path)) Process.Start(path);
}
Close();
return;
}
ShowStep(step + 1);
}
}
sealed class CasinoProgress : Control
{
int value;
public int Value
{
get { return value; }
set { this.value = Math.Max(0, Math.Min(100, value)); Invalidate(); }
}
public CasinoProgress()
{
DoubleBuffered = true;
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
var r = ClientRectangle;
r.Width -= 1; r.Height -= 1;
using (var b = new SolidBrush(Color.FromArgb(8, 8, 8))) e.Graphics.FillRectangle(b, r);
using (var p = new Pen(Color.FromArgb(236, 186, 75), 2)) e.Graphics.DrawRectangle(p, r);
var fill = new Rectangle(4, 4, (int)((Width - 9) * value / 100.0), Height - 9);
if (fill.Width > 0 && fill.Height > 0)
{
using (var brush = new LinearGradientBrush(fill, Color.FromArgb(30, 130, 60), Color.FromArgb(236, 186, 75), 0f))
e.Graphics.FillRectangle(brush, fill);
}
var caption = value + "%";
using (var font = new Font("Consolas", 10f, FontStyle.Bold))
using (var brush = new SolidBrush(Color.White))
{
var sz = e.Graphics.MeasureString(caption, font);
e.Graphics.DrawString(caption, font, brush, (Width - sz.Width) / 2, (Height - sz.Height) / 2);
}
}
}
sealed class CasinoArtPanel : Control
{
public int Stage { get; set; }
readonly Color gold = Color.FromArgb(236, 186, 75);
readonly Color red = Color.FromArgb(166, 24, 31);
readonly Color green = Color.FromArgb(20, 112, 54);
public CasinoArtPanel()
{
DoubleBuffered = true;
}
protected override void OnPaint(PaintEventArgs e)
{
var g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
using (var br = new LinearGradientBrush(ClientRectangle, Color.FromArgb(34, 12, 14), Color.FromArgb(7, 55, 30), 90f))
g.FillRectangle(br, ClientRectangle);
DrawTitle(g);
DrawCards(g, 28, 96);
DrawRoulette(g, 132, 235);
DrawChips(g, 48, 345);
DrawStageDots(g);
using (var pen = new Pen(Color.FromArgb(120, gold), 2))
g.DrawLine(pen, Width - 1, 0, Width - 1, Height);
}
void DrawTitle(Graphics g)
{
using (var f1 = new Font("Georgia", 20f, FontStyle.Bold))
using (var f2 = new Font("Segoe UI", 9f, FontStyle.Bold))
using (var b1 = new SolidBrush(gold))
using (var b2 = new SolidBrush(Color.FromArgb(235, 235, 220)))
{
g.DrawString("ASSEMBLER", f1, b1, 24, 24);
g.DrawString("CASINO SETUP", f2, b2, 62, 58);
}
}
void DrawCards(Graphics g, int x, int y)
{
DrawCard(g, x + 28, y + 8, -10, red, "A", "♥");
DrawCard(g, x + 76, y, 8, Color.Black, "K", "♠");
DrawCard(g, x + 124, y + 14, 14, red, "7", "♦");
}
void DrawCard(Graphics g, int x, int y, float angle, Color suitColor, string rank, string suit)
{
var state = g.Save();
g.TranslateTransform(x + 30, y + 42);
g.RotateTransform(angle);
var r = new Rectangle(-30, -42, 60, 84);
using (var path = RoundRect(r, 6))
using (var br = new SolidBrush(Color.FromArgb(245, 241, 225)))
using (var pen = new Pen(gold, 2))
{
g.FillPath(br, path);
g.DrawPath(pen, path);
}
using (var f = new Font("Georgia", 17f, FontStyle.Bold))
using (var b = new SolidBrush(suitColor))
{
g.DrawString(rank, f, b, -20, -32);
g.DrawString(suit, f, b, -10, 4);
}
g.Restore(state);
}
void DrawRoulette(Graphics g, int x, int y)
{
var outer = new Rectangle(x - 68, y - 68, 136, 136);
using (var br = new SolidBrush(Color.FromArgb(96, 48, 22))) g.FillEllipse(br, outer);
using (var p = new Pen(gold, 5)) g.DrawEllipse(p, outer);
for (int i = 0; i < 12; i++)
{
var a = i * 30.0 * Math.PI / 180.0;
var c = (i % 3 == 0) ? green : (i % 2 == 0 ? red : Color.FromArgb(12, 12, 12));
using (var p = new Pen(c, 8))
g.DrawLine(p, x, y, x + (float)Math.Cos(a) * 58, y + (float)Math.Sin(a) * 58);
}
using (var br = new SolidBrush(Color.FromArgb(30, 120, 50))) g.FillEllipse(br, x - 36, y - 36, 72, 72);
using (var p = new Pen(Color.FromArgb(255, 230, 150), 3)) g.DrawEllipse(p, x - 36, y - 36, 72, 72);
using (var br = new SolidBrush(Color.White)) g.FillEllipse(br, x + 18, y - 55, 12, 12);
using (var p = new Pen(Color.FromArgb(255, 230, 150), 4))
{
g.DrawLine(p, x, y, x + 44, y - 18);
g.DrawLine(p, x, y, x - 36, y + 26);
g.DrawLine(p, x, y, x + 8, y + 48);
}
}
void DrawChips(Graphics g, int x, int y)
{
DrawChip(g, x, y, red, "$");
DrawChip(g, x + 48, y + 28, green, "21");
DrawChip(g, x + 106, y + 2, Color.FromArgb(25, 70, 160), "VIP");
}
void DrawChip(Graphics g, int x, int y, Color c, string label)
{
using (var br = new SolidBrush(c)) g.FillEllipse(br, x, y, 54, 54);
using (var p = new Pen(Color.White, 4)) g.DrawEllipse(p, x + 5, y + 5, 44, 44);
using (var p = new Pen(gold, 2)) g.DrawEllipse(p, x + 1, y + 1, 52, 52);
using (var f = new Font("Segoe UI", 9f, FontStyle.Bold))
using (var b = new SolidBrush(Color.White))
{
var sz = g.MeasureString(label, f);
g.DrawString(label, f, b, x + 27 - sz.Width / 2, y + 27 - sz.Height / 2);
}
}
void DrawStageDots(Graphics g)
{
int y = Height - 44;
for (int i = 0; i < 4; i++)
{
var c = i <= Stage ? gold : Color.FromArgb(90, 80, 62);
using (var br = new SolidBrush(c)) g.FillEllipse(br, 78 + i * 28, y, 12, 12);
}
}
GraphicsPath RoundRect(Rectangle r, int radius)
{
int d = radius * 2;
var path = new GraphicsPath();
path.AddArc(r.X, r.Y, d, d, 180, 90);
path.AddArc(r.Right - d, r.Y, d, d, 270, 90);
path.AddArc(r.Right - d, r.Bottom - d, d, d, 0, 90);
path.AddArc(r.X, r.Bottom - d, d, d, 90, 90);
path.CloseFigure();
return path;
}
}
}

View file

@ -0,0 +1,235 @@
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Windows.Forms;
namespace AssemblerCasinoUninstaller
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new UninstallForm());
}
}
sealed class UninstallForm : Form
{
readonly Color bg = Color.FromArgb(15, 12, 10);
readonly Color panel = Color.FromArgb(28, 22, 18);
readonly Color gold = Color.FromArgb(236, 186, 75);
readonly Color red = Color.FromArgb(164, 26, 32);
readonly Color text = Color.FromArgb(245, 236, 205);
readonly string installDir = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\');
CheckBox removeSaves;
Button uninstallButton;
public UninstallForm()
{
Text = "Uninstall Assembler Casino";
try { Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); } catch { }
StartPosition = FormStartPosition.CenterScreen;
FormBorderStyle = FormBorderStyle.FixedDialog;
MaximizeBox = false;
MinimizeBox = false;
ClientSize = new Size(680, 390);
BackColor = bg;
Font = new Font("Segoe UI", 10f);
var art = new UninstallArt { Dock = DockStyle.Left, Width = 220 };
Controls.Add(art);
var content = new Panel { Left = 242, Top = 28, Width = 400, Height = 250, BackColor = panel };
content.Paint += (s, e) =>
{
using (var pen = new Pen(Color.FromArgb(88, gold), 2))
e.Graphics.DrawRectangle(pen, 0, 0, content.Width - 1, content.Height - 1);
};
Controls.Add(content);
AddLabel(content, "Удаление казино", 28, 26, 340, 38, 21f, FontStyle.Bold);
AddLabel(content, "Игра будет удалена из этой папки:", 30, 82, 340, 26, 10.5f, FontStyle.Regular);
AddLabel(content, installDir, 30, 112, 340, 46, 9.5f, FontStyle.Regular);
AddLabel(content, "Ярлык на рабочем столе и запись в списке программ тоже будут убраны.", 30, 160, 340, 42, 10f, FontStyle.Regular);
removeSaves = new CheckBox
{
Text = "Также удалить сохранения аккаунтов из AppData",
Left = 30,
Top = 208,
Width = 345,
Height = 26,
BackColor = Color.Transparent,
ForeColor = text
};
content.Controls.Add(removeSaves);
uninstallButton = MakeButton("Удалить");
uninstallButton.Left = 386; uninstallButton.Top = 312;
uninstallButton.Click += (s, e) => Uninstall();
Controls.Add(uninstallButton);
var cancel = MakeButton("Отмена");
cancel.Left = 514; cancel.Top = 312;
cancel.Click += (s, e) => Close();
Controls.Add(cancel);
}
void AddLabel(Control parent, string caption, int x, int y, int w, int h, float size, FontStyle style)
{
parent.Controls.Add(new Label
{
Text = caption,
Left = x,
Top = y,
Width = w,
Height = h,
ForeColor = text,
BackColor = Color.Transparent,
Font = new Font("Segoe UI", size, style)
});
}
Button MakeButton(string caption)
{
var b = new Button
{
Text = caption,
Width = 108,
Height = 38,
FlatStyle = FlatStyle.Flat,
BackColor = Color.FromArgb(62, 43, 20),
ForeColor = text,
Font = new Font("Segoe UI", 10f, FontStyle.Bold),
Cursor = Cursors.Hand
};
b.FlatAppearance.BorderColor = gold;
b.FlatAppearance.MouseOverBackColor = Color.FromArgb(94, 61, 24);
b.FlatAppearance.MouseDownBackColor = Color.FromArgb(120, 71, 22);
return b;
}
void Uninstall()
{
if (MessageBox.Show(this, "Удалить Assembler Casino?", "Assembler Casino", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes)
return;
uninstallButton.Enabled = false;
try
{
TryDeleteShortcut();
TryDeleteRegistry();
if (removeSaves.Checked)
TryDeleteSaves();
var parent = Directory.GetParent(installDir);
var cmd = "/c timeout /t 1 /nobreak >nul & rmdir /s /q \"" + installDir + "\"";
Process.Start(new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = cmd,
WorkingDirectory = parent == null ? Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) : parent.FullName,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
});
Close();
}
catch (Exception ex)
{
uninstallButton.Enabled = true;
MessageBox.Show(this, ex.Message, "Ошибка удаления", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
void TryDeleteShortcut()
{
try
{
var desktop = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
var link = Path.Combine(desktop, "Assembler Casino.lnk");
if (File.Exists(link)) File.Delete(link);
}
catch { }
}
void TryDeleteRegistry()
{
try
{
Registry.CurrentUser.DeleteSubKeyTree(@"Software\Microsoft\Windows\CurrentVersion\Uninstall\AssemblerCasino", false);
}
catch { }
}
void TryDeleteSaves()
{
try
{
var saves = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "AssemblerCasino");
if (Directory.Exists(saves)) Directory.Delete(saves, true);
}
catch { }
}
}
sealed class UninstallArt : Control
{
readonly Color gold = Color.FromArgb(236, 186, 75);
readonly Color red = Color.FromArgb(164, 26, 32);
public UninstallArt()
{
DoubleBuffered = true;
}
protected override void OnPaint(PaintEventArgs e)
{
var g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
using (var br = new LinearGradientBrush(ClientRectangle, Color.FromArgb(48, 9, 12), Color.FromArgb(12, 12, 12), 90f))
g.FillRectangle(br, ClientRectangle);
using (var f = new Font("Georgia", 19f, FontStyle.Bold))
using (var b = new SolidBrush(gold))
g.DrawString("CASINO", f, b, 48, 36);
DrawChip(g, 78, 112, red, "X");
DrawCardBack(g, 62, 190);
using (var p = new Pen(Color.FromArgb(120, gold), 2))
g.DrawLine(p, Width - 1, 0, Width - 1, Height);
}
void DrawChip(Graphics g, int x, int y, Color c, string label)
{
using (var br = new SolidBrush(c)) g.FillEllipse(br, x, y, 62, 62);
using (var p = new Pen(Color.White, 4)) g.DrawEllipse(p, x + 6, y + 6, 50, 50);
using (var p = new Pen(gold, 2)) g.DrawEllipse(p, x + 1, y + 1, 60, 60);
using (var f = new Font("Segoe UI", 17f, FontStyle.Bold))
using (var b = new SolidBrush(Color.White))
{
var sz = g.MeasureString(label, f);
g.DrawString(label, f, b, x + 31 - sz.Width / 2, y + 31 - sz.Height / 2);
}
}
void DrawCardBack(Graphics g, int x, int y)
{
var r = new Rectangle(x, y, 88, 122);
using (var br = new SolidBrush(Color.FromArgb(18, 18, 18))) g.FillRectangle(br, r);
using (var p = new Pen(gold, 3)) g.DrawRectangle(p, r);
using (var p = new Pen(red, 2))
{
g.DrawRectangle(p, x + 10, y + 10, 68, 102);
g.DrawLine(p, x + 18, y + 20, x + 70, y + 102);
g.DrawLine(p, x + 70, y + 20, x + 18, y + 102);
}
}
}
}

1
build/casino_icon.rc Normal file
View file

@ -0,0 +1 @@
1 ICON "assets\\icons\\casino.ico"

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

2975
build/graphics/casino3d.inc Normal file

File diff suppressed because it is too large Load diff

15144
build/graphics/poker.asm Normal file

File diff suppressed because it is too large Load diff

BIN
build/graphics/poker.exe Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 868 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

2975
casino3d.inc Normal file

File diff suppressed because it is too large Load diff

173
casino3d_data.inc Normal file
View file

@ -0,0 +1,173 @@
; --- CASINO 3D ENGINE DATA (Generated: Grand Open Hall) ---
NUM_ANGLES equ 512
MAP_WIDTH equ 32
MAP_HEIGHT equ 32
.data
ALIGN 4
tableCos dd 000010000h,00000FFFBh,00000FFECh,00000FFD4h,00000FFB1h,00000FF85h,00000FF4Eh,00000FF0Eh
dd 00000FEC4h,00000FE71h,00000FE13h,00000FDACh,00000FD3Bh,00000FCC0h,00000FC3Bh,00000FBADh
dd 00000FB15h,00000FA73h,00000F9C8h,00000F913h,00000F854h,00000F78Ch,00000F6BAh,00000F5DFh
dd 00000F4FAh,00000F40Ch,00000F314h,00000F213h,00000F109h,00000EFF5h,00000EED9h,00000EDB3h
dd 00000EC83h,00000EB4Bh,00000EA0Ah,00000E8BFh,00000E76Ch,00000E610h,00000E4AAh,00000E33Ch
dd 00000E1C6h,00000E046h,00000DEBEh,00000DD2Dh,00000DB94h,00000D9F2h,00000D848h,00000D696h
dd 00000D4DBh,00000D318h,00000D14Dh,00000CF7Ah,00000CD9Fh,00000CBBCh,00000C9D1h,00000C7DEh
dd 00000C5E4h,00000C3E2h,00000C1D8h,00000BFC7h,00000BDAFh,00000BB8Fh,00000B968h,00000B73Ah
dd 00000B505h,00000B2C9h,00000B086h,00000AE3Ch,00000ABEBh,00000A994h,00000A736h,00000A4D2h
dd 00000A268h,000009FF7h,000009D80h,000009B03h,000009880h,0000095F7h,000009368h,0000090D4h
dd 000008E3Ah,000008B9Ah,0000088F6h,00000864Ch,00000839Ch,0000080E8h,000007E2Fh,000007B70h
dd 0000078ADh,0000075E6h,00000731Ah,000007049h,000006D74h,000006A9Bh,0000067BEh,0000064DDh
dd 0000061F8h,000005F0Fh,000005C22h,000005932h,00000563Eh,000005348h,00000504Dh,000004D50h
dd 000004A50h,00000474Dh,000004447h,00000413Fh,000003E34h,000003B27h,000003817h,000003505h
dd 0000031F1h,000002EDCh,000002BC4h,0000028ABh,000002590h,000002274h,000001F56h,000001C38h
dd 000001918h,0000015F7h,0000012D5h,000000FB3h,000000C90h,00000096Ch,000000648h,000000324h
dd 000000000h,0FFFFFCDCh,0FFFFF9B8h,0FFFFF694h,0FFFFF370h,0FFFFF04Dh,0FFFFED2Bh,0FFFFEA09h
dd 0FFFFE6E8h,0FFFFE3C8h,0FFFFE0AAh,0FFFFDD8Ch,0FFFFDA70h,0FFFFD755h,0FFFFD43Ch,0FFFFD124h
dd 0FFFFCE0Fh,0FFFFCAFBh,0FFFFC7E9h,0FFFFC4D9h,0FFFFC1CCh,0FFFFBEC1h,0FFFFBBB9h,0FFFFB8B3h
dd 0FFFFB5B0h,0FFFFB2B0h,0FFFFAFB3h,0FFFFACB8h,0FFFFA9C2h,0FFFFA6CEh,0FFFFA3DEh,0FFFFA0F1h
dd 0FFFF9E08h,0FFFF9B23h,0FFFF9842h,0FFFF9565h,0FFFF928Ch,0FFFF8FB7h,0FFFF8CE6h,0FFFF8A1Ah
dd 0FFFF8753h,0FFFF8490h,0FFFF81D1h,0FFFF7F18h,0FFFF7C64h,0FFFF79B4h,0FFFF770Ah,0FFFF7466h
dd 0FFFF71C6h,0FFFF6F2Ch,0FFFF6C98h,0FFFF6A09h,0FFFF6780h,0FFFF64FDh,0FFFF6280h,0FFFF6009h
dd 0FFFF5D98h,0FFFF5B2Eh,0FFFF58CAh,0FFFF566Ch,0FFFF5415h,0FFFF51C4h,0FFFF4F7Ah,0FFFF4D37h
dd 0FFFF4AFBh,0FFFF48C6h,0FFFF4698h,0FFFF4471h,0FFFF4251h,0FFFF4039h,0FFFF3E28h,0FFFF3C1Eh
dd 0FFFF3A1Ch,0FFFF3822h,0FFFF362Fh,0FFFF3444h,0FFFF3261h,0FFFF3086h,0FFFF2EB3h,0FFFF2CE8h
dd 0FFFF2B25h,0FFFF296Ah,0FFFF27B8h,0FFFF260Eh,0FFFF246Ch,0FFFF22D3h,0FFFF2142h,0FFFF1FBAh
dd 0FFFF1E3Ah,0FFFF1CC4h,0FFFF1B56h,0FFFF19F0h,0FFFF1894h,0FFFF1741h,0FFFF15F6h,0FFFF14B5h
dd 0FFFF137Dh,0FFFF124Dh,0FFFF1127h,0FFFF100Bh,0FFFF0EF7h,0FFFF0DEDh,0FFFF0CECh,0FFFF0BF4h
dd 0FFFF0B06h,0FFFF0A21h,0FFFF0946h,0FFFF0874h,0FFFF07ACh,0FFFF06EDh,0FFFF0638h,0FFFF058Dh
dd 0FFFF04EBh,0FFFF0453h,0FFFF03C5h,0FFFF0340h,0FFFF02C5h,0FFFF0254h,0FFFF01EDh,0FFFF018Fh
dd 0FFFF013Ch,0FFFF00F2h,0FFFF00B2h,0FFFF007Bh,0FFFF004Fh,0FFFF002Ch,0FFFF0014h,0FFFF0005h
dd 0FFFF0000h,0FFFF0005h,0FFFF0014h,0FFFF002Ch,0FFFF004Fh,0FFFF007Bh,0FFFF00B2h,0FFFF00F2h
dd 0FFFF013Ch,0FFFF018Fh,0FFFF01EDh,0FFFF0254h,0FFFF02C5h,0FFFF0340h,0FFFF03C5h,0FFFF0453h
dd 0FFFF04EBh,0FFFF058Dh,0FFFF0638h,0FFFF06EDh,0FFFF07ACh,0FFFF0874h,0FFFF0946h,0FFFF0A21h
dd 0FFFF0B06h,0FFFF0BF4h,0FFFF0CECh,0FFFF0DEDh,0FFFF0EF7h,0FFFF100Bh,0FFFF1127h,0FFFF124Dh
dd 0FFFF137Dh,0FFFF14B5h,0FFFF15F6h,0FFFF1741h,0FFFF1894h,0FFFF19F0h,0FFFF1B56h,0FFFF1CC4h
dd 0FFFF1E3Ah,0FFFF1FBAh,0FFFF2142h,0FFFF22D3h,0FFFF246Ch,0FFFF260Eh,0FFFF27B8h,0FFFF296Ah
dd 0FFFF2B25h,0FFFF2CE8h,0FFFF2EB3h,0FFFF3086h,0FFFF3261h,0FFFF3444h,0FFFF362Fh,0FFFF3822h
dd 0FFFF3A1Ch,0FFFF3C1Eh,0FFFF3E28h,0FFFF4039h,0FFFF4251h,0FFFF4471h,0FFFF4698h,0FFFF48C6h
dd 0FFFF4AFBh,0FFFF4D37h,0FFFF4F7Ah,0FFFF51C4h,0FFFF5415h,0FFFF566Ch,0FFFF58CAh,0FFFF5B2Eh
dd 0FFFF5D98h,0FFFF6009h,0FFFF6280h,0FFFF64FDh,0FFFF6780h,0FFFF6A09h,0FFFF6C98h,0FFFF6F2Ch
dd 0FFFF71C6h,0FFFF7466h,0FFFF770Ah,0FFFF79B4h,0FFFF7C64h,0FFFF7F18h,0FFFF81D1h,0FFFF8490h
dd 0FFFF8753h,0FFFF8A1Ah,0FFFF8CE6h,0FFFF8FB7h,0FFFF928Ch,0FFFF9565h,0FFFF9842h,0FFFF9B23h
dd 0FFFF9E08h,0FFFFA0F1h,0FFFFA3DEh,0FFFFA6CEh,0FFFFA9C2h,0FFFFACB8h,0FFFFAFB3h,0FFFFB2B0h
dd 0FFFFB5B0h,0FFFFB8B3h,0FFFFBBB9h,0FFFFBEC1h,0FFFFC1CCh,0FFFFC4D9h,0FFFFC7E9h,0FFFFCAFBh
dd 0FFFFCE0Fh,0FFFFD124h,0FFFFD43Ch,0FFFFD755h,0FFFFDA70h,0FFFFDD8Ch,0FFFFE0AAh,0FFFFE3C8h
dd 0FFFFE6E8h,0FFFFEA09h,0FFFFED2Bh,0FFFFF04Dh,0FFFFF370h,0FFFFF694h,0FFFFF9B8h,0FFFFFCDCh
dd 000000000h,000000324h,000000648h,00000096Ch,000000C90h,000000FB3h,0000012D5h,0000015F7h
dd 000001918h,000001C38h,000001F56h,000002274h,000002590h,0000028ABh,000002BC4h,000002EDCh
dd 0000031F1h,000003505h,000003817h,000003B27h,000003E34h,00000413Fh,000004447h,00000474Dh
dd 000004A50h,000004D50h,00000504Dh,000005348h,00000563Eh,000005932h,000005C22h,000005F0Fh
dd 0000061F8h,0000064DDh,0000067BEh,000006A9Bh,000006D74h,000007049h,00000731Ah,0000075E6h
dd 0000078ADh,000007B70h,000007E2Fh,0000080E8h,00000839Ch,00000864Ch,0000088F6h,000008B9Ah
dd 000008E3Ah,0000090D4h,000009368h,0000095F7h,000009880h,000009B03h,000009D80h,000009FF7h
dd 00000A268h,00000A4D2h,00000A736h,00000A994h,00000ABEBh,00000AE3Ch,00000B086h,00000B2C9h
dd 00000B505h,00000B73Ah,00000B968h,00000BB8Fh,00000BDAFh,00000BFC7h,00000C1D8h,00000C3E2h
dd 00000C5E4h,00000C7DEh,00000C9D1h,00000CBBCh,00000CD9Fh,00000CF7Ah,00000D14Dh,00000D318h
dd 00000D4DBh,00000D696h,00000D848h,00000D9F2h,00000DB94h,00000DD2Dh,00000DEBEh,00000E046h
dd 00000E1C6h,00000E33Ch,00000E4AAh,00000E610h,00000E76Ch,00000E8BFh,00000EA0Ah,00000EB4Bh
dd 00000EC83h,00000EDB3h,00000EED9h,00000EFF5h,00000F109h,00000F213h,00000F314h,00000F40Ch
dd 00000F4FAh,00000F5DFh,00000F6BAh,00000F78Ch,00000F854h,00000F913h,00000F9C8h,00000FA73h
dd 00000FB15h,00000FBADh,00000FC3Bh,00000FCC0h,00000FD3Bh,00000FDACh,00000FE13h,00000FE71h
dd 00000FEC4h,00000FF0Eh,00000FF4Eh,00000FF85h,00000FFB1h,00000FFD4h,00000FFECh,00000FFFBh
ALIGN 4
tableSin dd 000000000h,000000324h,000000648h,00000096Ch,000000C90h,000000FB3h,0000012D5h,0000015F7h
dd 000001918h,000001C38h,000001F56h,000002274h,000002590h,0000028ABh,000002BC4h,000002EDCh
dd 0000031F1h,000003505h,000003817h,000003B27h,000003E34h,00000413Fh,000004447h,00000474Dh
dd 000004A50h,000004D50h,00000504Dh,000005348h,00000563Eh,000005932h,000005C22h,000005F0Fh
dd 0000061F8h,0000064DDh,0000067BEh,000006A9Bh,000006D74h,000007049h,00000731Ah,0000075E6h
dd 0000078ADh,000007B70h,000007E2Fh,0000080E8h,00000839Ch,00000864Ch,0000088F6h,000008B9Ah
dd 000008E3Ah,0000090D4h,000009368h,0000095F7h,000009880h,000009B03h,000009D80h,000009FF7h
dd 00000A268h,00000A4D2h,00000A736h,00000A994h,00000ABEBh,00000AE3Ch,00000B086h,00000B2C9h
dd 00000B505h,00000B73Ah,00000B968h,00000BB8Fh,00000BDAFh,00000BFC7h,00000C1D8h,00000C3E2h
dd 00000C5E4h,00000C7DEh,00000C9D1h,00000CBBCh,00000CD9Fh,00000CF7Ah,00000D14Dh,00000D318h
dd 00000D4DBh,00000D696h,00000D848h,00000D9F2h,00000DB94h,00000DD2Dh,00000DEBEh,00000E046h
dd 00000E1C6h,00000E33Ch,00000E4AAh,00000E610h,00000E76Ch,00000E8BFh,00000EA0Ah,00000EB4Bh
dd 00000EC83h,00000EDB3h,00000EED9h,00000EFF5h,00000F109h,00000F213h,00000F314h,00000F40Ch
dd 00000F4FAh,00000F5DFh,00000F6BAh,00000F78Ch,00000F854h,00000F913h,00000F9C8h,00000FA73h
dd 00000FB15h,00000FBADh,00000FC3Bh,00000FCC0h,00000FD3Bh,00000FDACh,00000FE13h,00000FE71h
dd 00000FEC4h,00000FF0Eh,00000FF4Eh,00000FF85h,00000FFB1h,00000FFD4h,00000FFECh,00000FFFBh
dd 000010000h,00000FFFBh,00000FFECh,00000FFD4h,00000FFB1h,00000FF85h,00000FF4Eh,00000FF0Eh
dd 00000FEC4h,00000FE71h,00000FE13h,00000FDACh,00000FD3Bh,00000FCC0h,00000FC3Bh,00000FBADh
dd 00000FB15h,00000FA73h,00000F9C8h,00000F913h,00000F854h,00000F78Ch,00000F6BAh,00000F5DFh
dd 00000F4FAh,00000F40Ch,00000F314h,00000F213h,00000F109h,00000EFF5h,00000EED9h,00000EDB3h
dd 00000EC83h,00000EB4Bh,00000EA0Ah,00000E8BFh,00000E76Ch,00000E610h,00000E4AAh,00000E33Ch
dd 00000E1C6h,00000E046h,00000DEBEh,00000DD2Dh,00000DB94h,00000D9F2h,00000D848h,00000D696h
dd 00000D4DBh,00000D318h,00000D14Dh,00000CF7Ah,00000CD9Fh,00000CBBCh,00000C9D1h,00000C7DEh
dd 00000C5E4h,00000C3E2h,00000C1D8h,00000BFC7h,00000BDAFh,00000BB8Fh,00000B968h,00000B73Ah
dd 00000B505h,00000B2C9h,00000B086h,00000AE3Ch,00000ABEBh,00000A994h,00000A736h,00000A4D2h
dd 00000A268h,000009FF7h,000009D80h,000009B03h,000009880h,0000095F7h,000009368h,0000090D4h
dd 000008E3Ah,000008B9Ah,0000088F6h,00000864Ch,00000839Ch,0000080E8h,000007E2Fh,000007B70h
dd 0000078ADh,0000075E6h,00000731Ah,000007049h,000006D74h,000006A9Bh,0000067BEh,0000064DDh
dd 0000061F8h,000005F0Fh,000005C22h,000005932h,00000563Eh,000005348h,00000504Dh,000004D50h
dd 000004A50h,00000474Dh,000004447h,00000413Fh,000003E34h,000003B27h,000003817h,000003505h
dd 0000031F1h,000002EDCh,000002BC4h,0000028ABh,000002590h,000002274h,000001F56h,000001C38h
dd 000001918h,0000015F7h,0000012D5h,000000FB3h,000000C90h,00000096Ch,000000648h,000000324h
dd 000000000h,0FFFFFCDCh,0FFFFF9B8h,0FFFFF694h,0FFFFF370h,0FFFFF04Dh,0FFFFED2Bh,0FFFFEA09h
dd 0FFFFE6E8h,0FFFFE3C8h,0FFFFE0AAh,0FFFFDD8Ch,0FFFFDA70h,0FFFFD755h,0FFFFD43Ch,0FFFFD124h
dd 0FFFFCE0Fh,0FFFFCAFBh,0FFFFC7E9h,0FFFFC4D9h,0FFFFC1CCh,0FFFFBEC1h,0FFFFBBB9h,0FFFFB8B3h
dd 0FFFFB5B0h,0FFFFB2B0h,0FFFFAFB3h,0FFFFACB8h,0FFFFA9C2h,0FFFFA6CEh,0FFFFA3DEh,0FFFFA0F1h
dd 0FFFF9E08h,0FFFF9B23h,0FFFF9842h,0FFFF9565h,0FFFF928Ch,0FFFF8FB7h,0FFFF8CE6h,0FFFF8A1Ah
dd 0FFFF8753h,0FFFF8490h,0FFFF81D1h,0FFFF7F18h,0FFFF7C64h,0FFFF79B4h,0FFFF770Ah,0FFFF7466h
dd 0FFFF71C6h,0FFFF6F2Ch,0FFFF6C98h,0FFFF6A09h,0FFFF6780h,0FFFF64FDh,0FFFF6280h,0FFFF6009h
dd 0FFFF5D98h,0FFFF5B2Eh,0FFFF58CAh,0FFFF566Ch,0FFFF5415h,0FFFF51C4h,0FFFF4F7Ah,0FFFF4D37h
dd 0FFFF4AFBh,0FFFF48C6h,0FFFF4698h,0FFFF4471h,0FFFF4251h,0FFFF4039h,0FFFF3E28h,0FFFF3C1Eh
dd 0FFFF3A1Ch,0FFFF3822h,0FFFF362Fh,0FFFF3444h,0FFFF3261h,0FFFF3086h,0FFFF2EB3h,0FFFF2CE8h
dd 0FFFF2B25h,0FFFF296Ah,0FFFF27B8h,0FFFF260Eh,0FFFF246Ch,0FFFF22D3h,0FFFF2142h,0FFFF1FBAh
dd 0FFFF1E3Ah,0FFFF1CC4h,0FFFF1B56h,0FFFF19F0h,0FFFF1894h,0FFFF1741h,0FFFF15F6h,0FFFF14B5h
dd 0FFFF137Dh,0FFFF124Dh,0FFFF1127h,0FFFF100Bh,0FFFF0EF7h,0FFFF0DEDh,0FFFF0CECh,0FFFF0BF4h
dd 0FFFF0B06h,0FFFF0A21h,0FFFF0946h,0FFFF0874h,0FFFF07ACh,0FFFF06EDh,0FFFF0638h,0FFFF058Dh
dd 0FFFF04EBh,0FFFF0453h,0FFFF03C5h,0FFFF0340h,0FFFF02C5h,0FFFF0254h,0FFFF01EDh,0FFFF018Fh
dd 0FFFF013Ch,0FFFF00F2h,0FFFF00B2h,0FFFF007Bh,0FFFF004Fh,0FFFF002Ch,0FFFF0014h,0FFFF0005h
dd 0FFFF0000h,0FFFF0005h,0FFFF0014h,0FFFF002Ch,0FFFF004Fh,0FFFF007Bh,0FFFF00B2h,0FFFF00F2h
dd 0FFFF013Ch,0FFFF018Fh,0FFFF01EDh,0FFFF0254h,0FFFF02C5h,0FFFF0340h,0FFFF03C5h,0FFFF0453h
dd 0FFFF04EBh,0FFFF058Dh,0FFFF0638h,0FFFF06EDh,0FFFF07ACh,0FFFF0874h,0FFFF0946h,0FFFF0A21h
dd 0FFFF0B06h,0FFFF0BF4h,0FFFF0CECh,0FFFF0DEDh,0FFFF0EF7h,0FFFF100Bh,0FFFF1127h,0FFFF124Dh
dd 0FFFF137Dh,0FFFF14B5h,0FFFF15F6h,0FFFF1741h,0FFFF1894h,0FFFF19F0h,0FFFF1B56h,0FFFF1CC4h
dd 0FFFF1E3Ah,0FFFF1FBAh,0FFFF2142h,0FFFF22D3h,0FFFF246Ch,0FFFF260Eh,0FFFF27B8h,0FFFF296Ah
dd 0FFFF2B25h,0FFFF2CE8h,0FFFF2EB3h,0FFFF3086h,0FFFF3261h,0FFFF3444h,0FFFF362Fh,0FFFF3822h
dd 0FFFF3A1Ch,0FFFF3C1Eh,0FFFF3E28h,0FFFF4039h,0FFFF4251h,0FFFF4471h,0FFFF4698h,0FFFF48C6h
dd 0FFFF4AFBh,0FFFF4D37h,0FFFF4F7Ah,0FFFF51C4h,0FFFF5415h,0FFFF566Ch,0FFFF58CAh,0FFFF5B2Eh
dd 0FFFF5D98h,0FFFF6009h,0FFFF6280h,0FFFF64FDh,0FFFF6780h,0FFFF6A09h,0FFFF6C98h,0FFFF6F2Ch
dd 0FFFF71C6h,0FFFF7466h,0FFFF770Ah,0FFFF79B4h,0FFFF7C64h,0FFFF7F18h,0FFFF81D1h,0FFFF8490h
dd 0FFFF8753h,0FFFF8A1Ah,0FFFF8CE6h,0FFFF8FB7h,0FFFF928Ch,0FFFF9565h,0FFFF9842h,0FFFF9B23h
dd 0FFFF9E08h,0FFFFA0F1h,0FFFFA3DEh,0FFFFA6CEh,0FFFFA9C2h,0FFFFACB8h,0FFFFAFB3h,0FFFFB2B0h
dd 0FFFFB5B0h,0FFFFB8B3h,0FFFFBBB9h,0FFFFBEC1h,0FFFFC1CCh,0FFFFC4D9h,0FFFFC7E9h,0FFFFCAFBh
dd 0FFFFCE0Fh,0FFFFD124h,0FFFFD43Ch,0FFFFD755h,0FFFFDA70h,0FFFFDD8Ch,0FFFFE0AAh,0FFFFE3C8h
dd 0FFFFE6E8h,0FFFFEA09h,0FFFFED2Bh,0FFFFF04Dh,0FFFFF370h,0FFFFF694h,0FFFFF9B8h,0FFFFFCDCh
ALIGN 4
casinoMap db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 1,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

View file

@ -0,0 +1,18 @@
ASSEMBLER CASINO - KNOWN LIMITATIONS
====================================
1. Игра официально Windows-only.
Это связано с MASM32, WinAPI, winmm, MCI и консолью Windows.
2. Linux/macOS возможны через Wine/CrossOver/Whisky.
Это сохраняет идею "ассемблерного казино", но не гарантирует идеальную работу звука и вторых окон.
3. Тяжелые ANSI-анимации зависят от скорости консоли.
На слабых ПК лучше использовать профиль Adaptive или Stable.
4. Онлайн пока доступен для дружеских костей и русской рулетки 1v1 через Radmin VPN.
Host/Join и TCP-сокеты Winsock встроены в poker.exe; общего сервера,
синхронизации аккаунтов и сетевых карточных игр пока нет.
5. Дурак - самая рискованная игра по логике.
Перед релизом обязательно руками проверить подкидывание, перевод, бито и завершение партии.

21
docs/ONLINE_RADMIN.txt Normal file
View file

@ -0,0 +1,21 @@
ASSEMBLER CASINO - ONLINE DICE VIA RADMIN VPN
==============================================
This mode is a small built-in LAN match. It does not install a server,
service, database, or extra executable.
1. Both players install and join the same Radmin VPN network.
2. Host starts the casino and selects: 20. Online Casino (Radmin).
3. Host selects: 1. Host room, then chooses Dice or Russian Roulette.
4. Host sends the Radmin IPv4 address to the friend. The port is 27015.
5. Friend selects: 20. Online Casino (Radmin) -> 2. Join room,
then enters the host Radmin IPv4 address.
The host application itself is the room only while the match is open.
After the match it closes the network socket. No shared account balance is
used yet: these are friendly 1v1 matches and do not alter saved money.
In Russian Roulette the host owns the hidden chamber state. The joining player
only sends the trigger action, so both computers always see the same outcome.
If Windows Firewall asks for permission, allow poker.exe on private networks.

54
docs/README_RELEASE.txt Normal file
View file

@ -0,0 +1,54 @@
ASSEMBLER CASINO - RELEASE NOTES
================================
Статус платформ
---------------
Основная версия: Windows x86/x64.
Игра написана на MASM32 и использует WinAPI, WinMM, MCI, консоль Windows и .exe-окружение.
Linux/macOS:
Нативной версии пока нет, потому что тогда пришлось бы переписывать системный слой под другой ассемблер и другие API.
Реальный вариант запуска без потери идеи "Assembler Casino" - Wine / CrossOver / Whisky.
Рекомендуемый запуск
--------------------
Windows:
1. Запустить PokerGameSetup.exe.
2. Выбрать папку установки.
3. Запускать игру через ярлык "Assembler Casino" на рабочем столе.
Linux:
1. Установить Wine.
2. Запустить: wine "Assembler Casino.exe"
3. Если звуки или вторые окна работают нестабильно, в настройках игры выбрать профиль анимаций Adaptive или Stable.
macOS:
1. Использовать CrossOver или Whisky.
2. Запустить "Assembler Casino.exe" внутри bottle.
3. Для слабых Mac или старых ноутбуков выбрать профиль Adaptive / Stable.
Профили анимаций
----------------
Cinematic - рисует все кадры. Лучший вид, максимальная нагрузка.
Adaptive - пропускает часть кадров, но сцены остаются примерно той же длительности.
Stable - еще меньше перерисовок, меньше ряби на слабых ПК.
Важно:
Hakari, DBD, Mambo и интро не отключаются профилем. Профиль только уменьшает количество перерисовок.
Что входит в релиз
------------------
Assembler Casino.exe - красивый лаунчер.
bin/poker.exe - сама MASM32-игра.
assets/ - звуки, анимации, музыка, иконка.
tools/ - вспомогательные окна и preview-скрипты.
docs/ - документация.
Uninstall Assembler Casino.exe - красивый удалятор.
Сохранения
----------
Сохранения аккаунтов лежат в AppData:
%APPDATA%\AssemblerCasino
Удалятор может удалить и игру, и сохранения, если отметить соответствующий пункт.

View file

@ -0,0 +1,60 @@
ASSEMBLER CASINO - RELEASE CHECKLIST
====================================
Перед отдачей сборки проверить:
[ ] Запустить tools\release_smoke_check.ps1 и получить "Release smoke check passed."
[ ] PokerGameSetup.exe запускается без ошибки.
[ ] Установщик ставит игру в выбранную папку.
[ ] На рабочем столе появляется ярлык Assembler Casino с казино-иконкой.
[ ] Assembler Casino.exe запускает bin/poker.exe.
[ ] Uninstall Assembler Casino.exe удаляет игру.
[ ] В Windows "Приложения и возможности" есть Assembler Casino.
[ ] Удалятор удаляет ярлык с рабочего стола.
Основной запуск:
[ ] Интро запускается и Enter его пропускает.
[ ] Можно создать новый аккаунт.
[ ] Можно войти в существующий аккаунт.
[ ] Банк, статистика и покупки сохраняются после перезапуска.
[ ] При банкротстве программа не закрывается мгновенно.
[ ] Победа при достижении цели банка работает.
Настройки:
[ ] Громкость 0-10 меняется.
[ ] Профиль Cinematic показывает все кадры.
[ ] Профиль Adaptive уменьшает рябь.
[ ] Профиль Stable не отключает Hakari/DBD, а только снижает перерисовку.
[ ] Переключатели интро и DBD-окна работают отдельно.
Игры:
[ ] 21 / Очко: добор, стоп, вскрытие AI, результат.
[ ] Poker: фолд, ставки, повышение, комбинации.
[ ] CloverPit: 5x3, комбинации, линии выигрыша, Hakari на jackpot.
[ ] Russian Roulette: уровни, звуки, результат.
[ ] Черепа и шарик: шарик не теряется, перемешивание понятно.
[ ] Орел/решка: звук и анимация броска.
[ ] Кости: ставка и результат.
[ ] Казино-рулетка: число/цвет совпадают с результатом.
[ ] Slot machine: старая слот-машина отдельно от CloverPit.
[ ] Дурак: партия завершается, нет зависания после выбора карты.
[ ] Крючок / Skill Check: шкала двигается, успех/провал работает, второе окно закрывается.
[ ] Buckshot Roulette: зарядка, выстрел, предметы/ходы не ломаются.
Секреты и сервис:
[ ] Чит-коды вводятся вместо ставки/в меню и не ломают обычный ввод ставки.
[ ] Удаленные MAMBO1-4 не лежат в assets/animations и не попадают в установщик.
[ ] Достижения открываются и всплывающее окно не съезжает.
[ ] Магазин применяет купленные рубашки.
[ ] Бестиарий возвращает в Бестиарий, а не в магазин.
[ ] Таблицы лидеров читают доступные аккаунты.
Слабый ПК:
[ ] На Stable интро и большие анимации не превращаются в сильную рябь.
[ ] DBD-окно не мигает через Clear-Host каждый кадр.
[ ] Звук не запускается десятки раз подряд на одной анимации.

74
docs/ROADMAP.txt Normal file
View file

@ -0,0 +1,74 @@
ASSEMBLER CASINO - ROADMAP
==========================
Ближайший релиз
---------------
1. Ручной прогон всех игр по RELEASE_CHECKLIST.txt.
2. Проверка Дурака на зависания после выбора карты, подкидывания и "бито".
3. Проверка Skill Check: второе окно, закрытие окна, успех/провал.
4. Проверка Hakari после jackpot.
5. Проверка сохранений и магазина.
6. Финальная упаковка PokerGameSetup.exe.
Защита
------
1. Установщик уже проверяет SHA-256 payload.
2. Лаунчер проверяет SHA-256 bin/poker.exe перед запуском.
3. Сохранения пишутся с checksum/signature и проверяются при загрузке.
4. В будущем: Authenticode-подпись exe-файлов через signtool.
Онлайн-режим
------------
Идея: Online Casino через Host / Join.
Техническая база:
1. Winsock TCP.
2. Один игрок создает комнату и становится host/server.
3. Остальные подключаются по IP, например через Radmin VPN.
4. Host хранит колоду, банк, очередь ходов и состояние игры.
5. Клиенты отправляют команды, а не "свои карты".
Пример команд:
BET 500
HIT
STAND
FOLD
RAISE 1000
PLAY_CARD 3
READY
CHAT text
Порядок разработки:
1. [Готово] Online Casino: встроенные Host / Join и выбор режима через Radmin VPN.
2. [Готово] Online Dice 1v1.
3. [Готово] Online Russian Roulette 1v1 с барабаном на стороне хоста.
4. Online lobby: имена игроков и ready.
5. Online 21.
6. Online Poker 2-4 игрока.
7. Online Durak последним, потому что логика самая сложная.
Графика online-стола
--------------------
1v1:
верх - соперник, центр - стол, низ - игрок.
3-4 игрока:
верх - игрок 2,
лево/право - игрок 3/4,
центр - общий стол,
низ - текущий игрок.
Чужие карты закрыты, свои открыты.
Ход подсвечивается цветом.
Ставки и банк показываются рядом с именами.
Отложенные идеи
---------------
1. Больше талисманов и бестиарий с эффектами +/-.
2. Казино-налог / VIP-уровень глубже связать с наградами.
3. Секретная концовка казино.
4. Магазин: больше рубашек, косметики и временных талисманов.
5. Турнир/башня: больше этапов, больше событий.
6. Стресс/подозрение казино: сделать больше влияния на игры.
7. Таблицы лидеров по всем аккаунтам и играм.
8. Возможный Linux/macOS запуск через Wine-документацию.

50
docs/SECURITY_NOTES.txt Normal file
View file

@ -0,0 +1,50 @@
ASSEMBLER CASINO - SECURITY NOTES
=================================
Что уже защищено
----------------
1. Установщик проверяет SHA-256 архива игры внутри PokerGameSetup.exe.
Если после сборки кто-то подменит payload установщика, установка остановится.
2. Установщик не распаковывает файлы наружу через пути вида ../.
Каждый путь из архива проверяется, чтобы он оставался внутри выбранной папки установки.
3. Сохранения лежат отдельно в AppData.
Это не защита от взлома, но защищает их от случайного удаления при переустановке.
4. Лаунчер Assembler Casino.exe проверяет SHA-256 bin/poker.exe перед запуском.
Если основной игровой exe подменили после установки, лаунчер остановит запуск.
5. Сохранения получили простую checksum/signature.
Новые save-файлы пишутся с подписью по первым 276 байтам и соли в коде.
Старые 276-байтные сохранения читаются для совместимости, а новые поврежденные/измененные
сохранения не загружают банк и статистику.
Что это НЕ защищает
-------------------
1. Это не DRM.
Если игра лежит на компьютере игрока, ее можно дизассемблировать, патчить и запускать под отладчиком.
2. Это не цифровая подпись издателя.
Чтобы Windows показывал доверенного автора и чтобы было сложнее незаметно подменить сам PokerGameSetup.exe,
нужен Authenticode-сертификат и подпись через signtool.
3. Подпись сохранений не является криптографической защитой.
Она ловит грубую ручную правку и случайное повреждение, но патчер с дизассемблером может
найти алгоритм и пересчитать подпись.
Что можно добавить следующим слоем
---------------------------------
1. Authenticode:
подписывать PokerGameSetup.exe, Assembler Casino.exe, Uninstall Assembler Casino.exe и bin/poker.exe.
2. Release manifest:
хранить список SHA-256 всех файлов релиза в docs/RELEASE_MANIFEST.txt.
3. Более сильная защита сохранений:
вынести save version, HMAC-подобную проверку и явную метку tampered-профиля.
Честный вывод
-------------
Для офлайн-казино цель защиты - не сделать невозможный взлом, а поймать случайную/грубую подмену файлов,
защитить установщик от повреждения и усложнить ручное редактирование прогресса.

View file

@ -0,0 +1,21 @@
╔══════════════════════════════════════════════════════════════╗
║ ║
║ ███████╗ ██████╗ ██╗ █████╗ ███╗ ██╗ ║
║ ██╔════╝ ██╔══██╗██║ ██╔══██╗████╗ ██║ ║
║ █████╗ ██████╔╝██║ ███████║██╔██╗ ██║ ║
║ ██╔══╝ ██╔══██╗██║ ██╔══██║██║╚██╗██║ ║
║ ███████╗ ██████╔╝███████╗██║ ██║██║ ╚████║ ║
║ ╚══════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝ ║
║ ║
║ ██████╗ █████╗ ███╗ ███╗███████╗███████╗ ║
║ ██╔════╝ ██╔══██╗████╗ ████║██╔════╝██╔════╝ ║
║ ██║ ███╗███████║██╔████╔██║█████╗ ███████╗ ║
║ ██║ ██║██╔══██║██║╚██╔╝██║██╔══╝ ╚════██║ ║
║ ╚██████╔╝██║ ██║██║ ╚═╝ ██║███████╗███████║ ║
║ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚══════╝ ║
║ ║
║ >>> P R E S S A N Y K E Y <<< ║
╚══════════════════════════════════════════════════════════════╝
cards poker slots skulls roulette coin
ENTER - START

20
docs/dbd_hook_static.txt Normal file
View file

@ -0,0 +1,20 @@
DBD HOOK - video frame reference
,, ., . ..
. .,. .. . .i;,. .,. ;;.
,;,. ..; ..,,,,i,, ,,,,t; .,,
. . ... .,...,;iiLt;;,;;,. ..,i;;, .;i;,,, ..,,
.. ,; .. .,ii;,,,..,,,C#####8G##G;,,. ...,,,t;,.,, ,,,,,
. . .;;. ,. . . .,,,,,......,;;iiitLG#G;;;, . . ,,. .;;. ...
........,,,.,;...... ....,,,,,..... ... ,,,...... ,t, .,;. ;i, ..;i
;;,;;,,.,ti.;f,,ttii;,;,L@8f;,.,,i; ,;, ...... ;;i;i,,;;,, ,i,,;;ii
,;;,,.,,i;,.,i,,CCLC;tiiG#fiff;,;;i;;;;,..;i;;;,. ,,;;i,.,,,. ,;. ,,,i
;,...,.,ii..,t,,fi;;,,,;;,,,iif;,LC0@Lff,.;,,,,. .,,,i, ;i;..,,, .,,i
,,.,;,.;,,,.it,... .... ..,;tti;0L;,,;,,....,iLf,,, ,. ,....,i;.,
,. ....,.. ,,. .. .,,. .,i;;88L,,,,.;tfi;i;,..,i,,,,. . .i,,,,,,
, . .... .,. ... .8##@;;,,fCi,,;;;;iii;;;i;,i,;,. .. ;,,,,iii;
. .,;iitti;ii;;;;;,,,..,,;itt;. .;0##,.;LLCG@####8i,...,,,...i,. ....
,,;iL#############808Cf;,tCC#f,;,.,..,f8,,t0fiittttti;;;. ti;, ;i.
iffLC@0LffLLG0@G0GCCLLtii;t##,,L,.,, ....ti;,ii;iitfffG, .,. ,t,
,,;;;;;,.,,;;;;;;;;;;,;##;;Li.... . .;;,,,,,;tfLtC8, .t.
;;;;;;;iiiiii;;;;;;;;iiitii;, . ,;;;;;,,,;;;;;; . .
SPACE / ENTER - ?????? skill check

View file

@ -0,0 +1,373 @@
rrGunUp
uu$`$$$uu$$$
P*$`$$$$$$$$
?*$ $$$$$$$$
$:$ $$$$$$$$
":$ $$$$$$$$
N$ $$$$$$$$
$ $$$$$$$$
$ $$$$$$$$
$ $$$$$$$$
$$$$$$$$$$
$$$$$$$$$$
$$RR$$$$$$
$$$$$$$$$$
$ $$$$$@$$
$ $$$$$$$$
$ $$$$$$$$$uuL
$ $$$$$$$$$uu***u..
$ $$$$$$$$$ `***u$*t
$xxuu$u$$$$uuuk.$$$?
$x$uu8u```$uuu6."$??
$$$?$$$```$$$$$`""??
$$$?$$$ $$$$K $$ ..
$$$H$$$ $$$$K. $$$$$Ns.
$$$$$$$ $$$$X. R"$$$%%.N
$$$%uu$ uuu$:: Ruuu "??:
$$$%uu! $u$$$: ||uuuu*?$$
$??N $'$$$ $$*uuu!':$
$??........$$$$ $**` dd""
$.$Rd....$.."?7$uo 5uu..+***
'*@R.``""**@""`uuouxxu``U+!`
**@**xuu***" *RRux$"``%%
**xN**%% ..u.d$..u%$$o.
"NN`%.. $..".du$$$$$$$$$uu..
88@.m":::R*""x$$$$$$$$$$$$$$$$$$$$$$$$$c
$$e""":N@ $$N`"$$$$$$$$$$$$$$$$$$$$$>
$@ "N%uu. ??uuu$$$$$$$$$$$$$$$$$$$$$>
```"*u$$$$$$$$$$$$$$$$$$$$$$$$$$>
$$$$$$$$$$$$$$$$$$$$$$$$$$>
""$$$$$$$$$$$$$$$$$$$$$$$$>
^^$$$$$$$$$$$$$$$$$$$$$>
"*$$$$$$$$$$$$$$$$$$$>
`**$$$$$$$$$$$$$$$$>
``"+$$$*$$$$$$>
rrGunUpLeft
$ c
$$$$ $$>
u $$$ $$ $>
$$$$$$$$ $$$$$$>>
$ $$$ $$ $ . N: $$ $$$ $>
$ $$ $$$ $$ .t s.? $ $ $$$ $$ $>
$`$$$$$$$$$$$$ .$$?? .$N%"?$$" $$$$$$$$$$$$>
u $ $$$ $$ $$$ *u $? ? $ $ *'" .$$ $$ $$$ $$ $
P*$$ $$$$$$$$$$$$ uL**.$$"?$$$$uuu!d** u.$$$$$$$$$$$$$$
?: $ $$$ $$ $$ $ u u* k." $ "u uu *` u $$ $$ $$$ $$ $
$: $ $ $$ $$$ $$ $u `u6 ` Ru uu +! . $$ $$$ $$ $$$ $
" N$$ $$$$$$$@$$$$$ uu$$K. ||$*`.U% $$$$$$$$$$$$$$$*$
$$$ R$ $$ $$$ $u $$K . $ *u` %$ $$$ $$ $$ $$$ $
$$$R$$$$$$$$$$`$$$$$X:: $uu``%$$$$$$$$$$$$$$$$
$$ $$$ $$ $` `$$ $$ $ x ".$ $$ $$ $$$ $$ +
$$ $$$$$$u``` $$u$$$$o ux$.$$$$$$$$$$$$$$`"
$ $$ u8$ uu $$ uo udu $" $$$ $$ $$ `
$ $ uu $$ $' $$u R. d$` u$ $$ $$$
$$xx$?$$$$$ $.$7`*R.".$$uu$$$$$$$**
$x $?$ $$ . "" . ."$ ?$ $$$ *`
$$$$$$$uu! ...@" $." ?$$$$^^"
$$ $% u . $* " R u$ "
$$$ % ..* * : .* "
$$$$?..."**%..:N@u`"
$? ?.` u* %": %`
$$?d.xu*N`m""N `
$R *xN @"
. @** "8 e
$'*@ * 8$$@
* $
rrGunLeft
c>>>>>>>>>
$$$$$$$$$$
$$$$$$$$$$
$$$$$$$$$$
$$$$$$$$$$
$$$$$$$$$$
$$$$$$$$$$
$$$$$$$$$*
$$$$$$$$$$
$$$$$$$$$$
$$$$$$$$$$
.$$$$$$$$$+
.$$$$$$$$$"
u$$$$$$$$$`
u$$$$$$$$$`
:$$" $$$$$$$$$$
N?$:"* .$$$$$$$$$$
..??'d*` o$$$$$$$$$*
s%"*!d*! $$$$$$$$$$*
N% uu ++%$$$$$$$$$$`
.$$ uu .U%%$$$$$$$$*
.$$uuu`.``u$$$$$$$$"
$$uu**u``.$$"u$$$^
t???$$"u|$*uu".$$`u$$$^
.*$??$$RR|$$5x$$u$Nu$$$
.$$$" xxdd$$?$$"
uu$"" uu..x$?$$"
**..` ..:: ooRu"" u
**k6$KKX:$$$uuR.." *
L**uu$$$$$$$$$u*..* ."
uu`uu$$$$u$$$7` $R u`
uu uu$$$$uu'$?" :@u`
$$$$$$$$$u$$."" :N%`
$$$$$$$$$$$$$$$$$$$`` ..@" .::N
$$$$$$$$$$$$$$$$$$$`` ..**%."""
$$$$$$$$$$$$$@$$$$$`` .$**%%m"
u$$$$$$$$$$$$$$$$$uu$$$$$! .."**`."
u$$$$$$$$$$$$$$$$$$8$$$$uu .."u*N@e
$$$$$$$$$$$$$$$$$$uu$$$$uu ..`uNN8$@
$$$$$$$$$$$R$$$$$$uu??H$%%N..`xx"8$$
$$$$$$$$$$$R$$$$$$x$$$$$$$??d.**
`` $$$$ xx$$$$$$??RR**
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@@
u**::N .**
uP?$" $'*
rrGunDownLeft
>$
>$ $
>>$$$$$
>$ $$$ $
>$ $$ $$ $
>$$$$$$$$$*$
c$ $$ $$$ $$ $
$$$$$$$$$$$$$+
$$ $$ $$ $$$ "
$$$$$$$$$$$$``
$ $$$ $$ $$$
$$ $$ $$$ $$
$$$$$$$$$$$$*
$$ $$ $$$ $*
.$$$$$$$$$$$`
.$ $$$ $$ $*
u $$ $$$ $$ "
u$$$$$$$$$$^
$$$ $$ $$^
.$$$$$$$$$$
$ $$$ u$ $"
" *` $$ $" u$$ "
$$"**!%%%$$$`u?$$
: $'d +U `.$ $$ ?u
N??*! .``".ud$$ *"
." uu `uu $d ." .`
.s% uuu**uxxu."." u``
N$u u$ $ u R. .R @%
$ $u |$ o R.$ :N N
.$$"u| ouu* ::"
$ R $ $` .""
?$$ :$$$$7""" .%m"e@
? ? .: $$ $"@ *% `@ $$
??" . X$$ '. .* **N 8$
t$$$"`KK$$uu$$..$**u*N"8
.$ $. $$$ $u . ." ux
.u.k6$$$$$ ...`x***
** uu $$ ! ... *
**`uu$` $$uu .?dR@@
Lu $` ` $$u %? ?$ **
u u$ $`` $$ $% $?$ .'
u$$$$$`$$$$$$$$$$ $
$$$ u8 $?$ $$
$$$$$$$uu?$$$$$
$ $$ $$$ u$ $$
$$ @$$ $$ xx$
$$$$$$$$$$$$x$$
$$$ $$ $$$ $
$$$$$$$$$$$$ $$
$ $$ $$ $R$ $
$$ $$$ $$ R$$
$$$$$$$$$$$$$$$
$$$ $$ $$ $$$
$$$$$$$$$$$ $$
$ $$ $$$ $
u$$$$$$ $$
$ $$ $ N
$ $ $ :
$`$$:$"
$ *?
uP
rrGunDown
>$$$$$$*$$$+"``
>$$$$$$$$$$$$$$$$**`
>$$$$$$$$$$$$$$$$$$$*"
>$$$$$$$$$$$$$$$$$$$$$^^
>$$$$$$$$$$$$$$$$$$$$$$$$""
>$$$$$$$$$$$$$$$$$$$$$$$$$$
>$$$$$$$$$$$$$$$$$$$$$$$$$$u*"```
>$$$$$$$$$$$$$$$$$$$$$uuu?? .uu%N" @$
>$$$$$$$$$$$$$$$$$$$$$"`N$$ @N:"""e$$
c$$$$$$$$$$$$$$$$$$$$$$$$$x""*R:::"m.@88
..uu$$$$$$$$$ud."..$ ..%`NN"
.o$$%u..$d.u.. %%**Nx**
%%``"$xuRR* "***uux**@**
`!+U``uxxuouu`""@**""``.R@*'
***+..uu5 ou$7?"..$....dR$.$
""dd `**$ $$$$........??$
$:'!uuu*$$ $$$'$ N??$
$$?*uuuu|| :$$$u$ !uu%$$$
:??" uuuR ::$uuu $uu%$$$
N.%%$$$"R .X$$$$ $$$$$$$
.sN$$$$$ .K$$$$ $$$H$$$
.. $$ K$$$$ $$$?$$$
??""`$$$$$```$$$?$$$
??$".6uuu$```u8uu$x$
?$$$.kuuu$$$$u$uuxx$
t*$u***` $$$$$$$$$ $
..u***uu$$$$$$$$$ $
Luu$$$$$$$$$ $
$$$$$$$$ $
$$@$$$$$ $
$$$$$$$$$$
$$$$$$RR$$
$$$$$$$$$$
$$$$$$$$$$
$$$$$$$$ $
$$$$$$$$ $
$$$$$$$$ $
$$$$$$$$ $N
$$$$$$$$ $:"
$$$$$$$$ $:$
$$$$$$$$ $*?
$$$$$$$$`$*P
$$$uu$$$`$uu
rrGunDownRight
$ *
@$$8 * @*'$
e 8" **@ .
"@ Nx* R$
` N""m`N*ux.d?$$
`% :"% *u `.? ?$
"`u@N:..%**"...?$$$$
" *. : * *.. % $$$
" $u R " *$ . u %$ $$
"^^$$$$? ".$ "@... !uu$$$$$$$
`* $$$ $? $". . "" . $$ $?$ x$
**$$$$$$$uu$$.".R*`7$.$ $$$$$?$xx$$
$$$ $$ $u `$d .R u$$ '$ $$ uu $ $
` $$ $$ $$$ "$ udu ou $$ uu $8u $$ $
"`$$$$$$$$$$$$$$.$xu o$$$$u$$ ```u$$$$$$ $$
+ $$ $$$ $$ $$ $." x $ $$ $$` `$ $$ $$$ $$
$$$$$$$$$$$$$$$$%``uu$ ::X$$$$$`$$$$$$$$$$R$$$
$ $$$ $$ $$ $$$ $% `u* $ . K$$ u$ $$$ $$ $R $$$
$*$$$$$$$$$$$$$$$ %U.`*$|| .K$$uu $$$$$@$$$$$$$ $$N "
$ $$$ $$ $$$ $$ . !+ uu uR ` 6u` u$ $$ $$$ $$ $ $ :$
$ $$ $$$ $$ $$ u `* uu u" $ ".k *u u $ $$ $$ $$$ $ :?
$$$$$$$$$$$$$$.u **d!uuu$$$$?"$$.**Lu $$$$$$$$$$$$ $$*P
$ $$ $$$ $$ $$. "'* $ $ ? ?$ u* $$$ $$ $$$ $ u
>$$$$$$$$$$$$ "$$?"%N$. ??$$. $$$$$$$$$$$$`$
>$ $$ $$$ $ $ ?.s t. $$ $$$ $$ $
>$ $$$ $$ :N . $ $$ $$$ $
>>$$$$$$ $$$$$$$$
>$ $$ $$$ u
>$$ $$$$
c $
rrGunRight
*'$ "$?Pu
**. N::**u
@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
**RR??$$$$$$xx $$$$ ``
**.d??$$$$$$$x$$$$$$R$$$$$$$$$$$
$$8"xx`..N%%$H??uu$$$$$$R$$$$$$$$$$$
@$8NNu`.. uu$$$$uu$$$$$$$$$$$$$$$$$$
e@N*u".. uu$$$$8$$$$$$$$$$$$$$$$$$u
".`**".. !$$$$$uu$$$$$$$$$$$$$$$$$u
"m%%**$. ``$$$$$@$$$$$$$$$$$$$
""".%**.. ``$$$$$$$$$$$$$$$$$$$
N::. "@.. ``$$$$$$$$$$$$$$$$$$$
`%N: "".$$u$$$$$$$$$
`u@: "?$'uu$$$$uu uu
`u R$ `7$$$u$$$$uu`uu
". *..*u$$$$$$$$$uu**L
* "..Ruu$$$:XKK$6k**
u ""uRoo ::.. `..**
"$$?$x..uu ""$uu
"$$?$$ddxx "$$$.
$$$uN$u$$x5$$|RR$$??$*.
^$$$u`$$."uu*$|u"$$???t
^$$$u"$$.``u**uu$$
"$$$$$$$$u``.`uuu$$.
*$$$$$$$$%%U. uu $$.
`$$$$$$$$$$%++ uu %N
*$$$$$$$$$$ !*d!*"%s
*$$$$$$$$$o `*d'??..
$$$$$$$$$$. *":$?N
$$$$$$$$$$ "$$:
`$$$$$$$$$u
`$$$$$$$$$u
"$$$$$$$$$.
+$$$$$$$$$.
$$$$$$$$$$
$$$$$$$$$$
$$$$$$$$$$
*$$$$$$$$$
$$$$$$$$$$
$$$$$$$$$$
$$$$$$$$$$
$$$$$$$$$$
$$$$$$$$$$
$$$$$$$$$$
>>>>>>>>>c
rrGunUpRight
Pu
?* $
"$:$$`$
: $ $ $
N $ $$ $
$$ $$$$$$u
$ $$$ $$ $
$$ $$$$$$$$$$$
$$$ $$ $$ $$$
$$$$$$$$$$$$$$$
$$R $$ $$$ $$
$ $R$ $$ $$ $
$$ $$$$$$$$$$$$
$ $$$ $$ $$$
$$x$$$$$$$$$$$$
$xx $$ $$@ $$
$$ $u $$$ $$ $
$$$$$?uu$$$$$$$
$$ $?$ 8u $$$
$ $$$$$$$$$$`$$$$$u
'. $?$ %$ $$ ``$ $u u
** $? ?% u$$ ` `$ uL
@@Rd?. uu$$ `$uu`**
* ... ! $$ uu **
***x`... $$$$$6k.u.
xu ". . u$ $$$ .$ $.
8"N*u**$..$$uu$$KK`"$$$t
$8 N** *. .' $$X . "??
$$ @` %* @"$ $$ :. ? ?
@e"m%. """7$$$$: $$?
"". `$ $ R $
":: *uuo |u"$$.
N N: $.R o $| u$ $
%@ R. .R u $ $u u$N
``u ".".uxxu**uuu %s.
`. ". d$ uu` uu ".
"* $$du."``. !*??N
u? $$ $.` U+ d'$ :
$$?u`$$$%%%!**"$$
" $$u "$ $$ `* "
"$ $u $$$ $
$$$$$$$$$$.
^$$ $$ $$$
^$$$$$$$$$$u
" $$ $$$ $$ u
*$ $$ $$$ $.
`$$$$$$$$$$$.
*$ $$$ $$ $$
*$$$$$$$$$$$$
$$ $$$ $$ $$
$$$ $$ $$$ $
``$$$$$$$$$$$$
" $$$ $$ $$ $$
+$$$$$$$$$$$$$
$ $$ $$$ $$ $c
$*$$$$$$$$$>
$ $$ $$ $>
$ $$$ $>
$$$$$>>
$ $>
$>

Binary file not shown.

View file

@ -0,0 +1,371 @@
логотип, палитра и необходимые управляющие символы.
ESC_SEQ db 1Bh, '['
CLEAR_SCREEN db 1Bh, '[2J', 1Bh, '[H', 0
HIDE_CURSOR db 1Bh, '[?25l', 0
SHOW_CURSOR db 1Bh, '[?25h', 0
MOVE_HOME db 1Bh, '[H', 0
RESET_COLOR db 1Bh, '[0m', 0
; Палитра 256 цветов (синие и голубые оттенки)
palette db 21, 27, 33, 39, 45, 51, 81, 123, 159
PAL_SIZE equ 9
GLITCH_CHARS db "@#$%&X*01?<>", 0
GLITCH_LEN equ 12
; Твой логотип (убедись, что строки заканчиваются на 0)
intro_line1 db "╔══════════════════════════════════════════════════════════════╗", 0
intro_line2 db "║ ║", 0
intro_line3 db "║ ███████╗ ██████╗ ██╗ █████╗ ███╗ ██╗ ║", 0
intro_line4 db "║ ██╔════╝ ██╔══██╗██║ ██╔══██╗████╗ ██║ ║", 0
intro_line5 db "║ █████╗ ██████╔╝██║ ███████║██╔██╗ ██║ ║", 0
intro_line6 db "║ ██╔══╝ ██╔══██╗██║ ██╔══██║██║╚██╗██║ ║", 0
intro_line7 db "║ ███████╗ ██████╔╝███████╗██║ ██║██║ ╚████║ ║", 0
intro_line8 db "║ ╚══════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝ ║", 0
intro_line9 db "║ ║", 0
intro_line10 db "║ ██████╗ █████╗ ███╗ ███╗███████╗███████╗ ║", 0
intro_line11 db "║ ██╔════╝ ██╔══██╗████╗ ████║██╔════╝██╔════╝ ║", 0
intro_line12 db "║ ██║ ███╗███████║██╔████╔██║█████╗ ███████╗ ║", 0
intro_line13 db "║ ██║ ██║██╔══██║██║╚██╔╝██║██╔══╝ ╚════██║ ║", 0
intro_line14 db "║ ╚██████╔╝██║ ██║██║ ╚═╝ ██║███████╗███████║ ║", 0
intro_line15 db "║ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚══════╝ ║", 0
intro_line16 db "║ ║", 0
intro_line17 db "║ >>> P R E S S A N Y K E Y <<< ║", 0
intro_line18 db "╚══════════════════════════════════════════════════════════════╝", 0
intro_ptrs dd offset intro_line1, offset intro_line2, offset intro_line3
dd offset intro_line4, offset intro_line5, offset intro_line6
dd offset intro_line7, offset intro_line8, offset intro_line9
dd offset intro_line10, offset intro_line11, offset intro_line12
dd offset intro_line13, offset intro_line14, offset intro_line15
dd offset intro_line16, offset intro_line17, offset intro_line18, 0
; Переменные состояния
frame_counter dd 0
glitch_timer dd 0
temp_color_buf db 32 dup(0)
bytesWritten dd 0
hConsole dd 0
cMode dd 0
2. Добавь функции в .code
Этот блок реализует саму анимацию. Тебе нужно вызвать call ShowIntro в самом начале _start.
Фрагмент кода
; Функция включения ANSI в Windows 10+
EnableANSI PROC
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hConsole, eax
invoke GetConsoleMode, hConsole, addr cMode
or cMode, 0004h ; ENABLE_VIRTUAL_TERMINAL_PROCESSING
invoke SetConsoleMode, hConsole, cMode
ret
EnableANSI ENDP
; Печать строки через WinAPI
PrintWinStr PROC USES edx esi, pStr:DWORD
mov esi, pStr
xor edx, edx
@@:
cmp byte ptr [esi+edx], 0
je @f
inc edx
jmp @b
@@:
invoke WriteFile, hConsole, esi, edx, addr bytesWritten, 0
ret
PrintWinStr ENDP
; Установка цвета ANSI (256 цветов)
SetAnsiColor PROC colorIdx:DWORD
push eax
; Формируем строку ESC[38;5;Nm
; Для простоты используем предопределенные части
invoke WriteFile, hConsole, addr ESC_SEQ, 2, addr bytesWritten, 0
invoke PrintWinStr, addr colorPrefix ; "38;5;"
; Преобразование индекса цвета в текст (упрощенно для примера)
; В идеале тут нужен dwtoa, но для краткости опустим
pop eax
ret
SetAnsiColor ENDP
ShowIntro PROC
call EnableANSI
invoke PrintWinStr, addr CLEAR_SCREEN
invoke PrintWinStr, addr HIDE_CURSOR
intro_loop:
invoke PrintWinStr, addr MOVE_HOME
inc frame_counter
; Логика таймера глитча
mov eax, frame_counter
xor edx, edx
mov ecx, 120 ; Раз в 6 секунд при 20 FPS
div ecx
test edx, edx
jnz @f
mov glitch_timer, 8 ; Глитч на 8 кадров
@@:
xor ebx, ebx ; Индекс строки
line_loop:
mov esi, [intro_ptrs + ebx*4]
test esi, esi
jz check_input
xor edi, edi ; Позиция в строке
char_loop:
mov al, [esi+edi]
test al, al
jz next_line
; --- ГРАДИЕНТ ---
; Цвет = (позиция + кадр) % PAL_SIZE
mov eax, edi
add eax, frame_counter
xor edx, edx
mov ecx, PAL_SIZE
div ecx
movzx eax, [palette + edx]
; Вывод ANSI цвета вручную для скорости
push eax
invoke WriteConsoleA, hConsole, addr ESC_SEQ, 2, addr bytesWritten, 0
; Здесь должен быть код вывода "38;5;XXXm"
; Чтобы не усложнять ASM, можно использовать фиксированные цвета из 16-цветовой палитры
; или дописать процедуру конвертации числа в строку.
pop eax
; --- ГЛИТЧ ---
cmp glitch_timer, 0
jle print_char
; Шанс глитча через системное время или rdtsc
rdtsc
test al, 0Fh
jnz print_char
movzx eax, byte ptr [GLITCH_CHARS] ; Упрощенно берем первый символ глитча
print_char:
mov [temp_color_buf], al
invoke WriteFile, hConsole, addr temp_color_buf, 1, addr bytesWritten, 0
inc edi
jmp char_loop
next_line:
mov byte ptr [temp_color_buf], 10
invoke WriteFile, hConsole, addr temp_color_buf, 1, addr bytesWritten, 0
inc ebx
jmp line_loop
check_input:
cmp glitch_timer, 0
jle @f
dec glitch_timer
@@:
; Неблокирующая проверка нажатия клавиши
invoke GetNumberOfConsoleInputEvents, hInput, addr bytesWritten ; hInput должен быть STD_INPUT_HANDLE
cmp bytesWritten, 1 ; Если событий больше чем "ничего"
jg exit_intro
invoke Sleep, 50 ; 20 FPS
jmp intro_loop
exit_intro:
invoke PrintWinStr, addr RESET_COLOR
invoke PrintWinStr, addr SHOW_CURSOR
invoke PrintWinStr, addr CLEAR_SCREEN
ret
ShowIntro ENDP
Дескриптор консоли: В начале программы обязательно вызови GetStdHandle, чтобы получить hConsole. В твоем коде это, скорее всего, уже делается, просто сохрани результат в переменную.
Фрагмент кода
start:
; Инициализация консоли
call ShowIntro ; Сначала показываем заставку
call MainMenu ; Потом переходим в твое меню
...
1. Обнови секцию .data
Добавь эти строки (я добавил управляющие коды для вспышек):
Фрагмент кода
; Коды для вспышек цвета
GLITCH_WHITE db 1Bh, '[38;5;15m', 0
GLITCH_RED db 1Bh, '[38;5;196m', 0
; Строка для смещения (Shake)
SHAKE_SPACE db " ", 0 ; Два пробела для максимальной тряски
; Добавим префикс для 256-цветов
COLOR_PFX db 1Bh, '[38;5;', 0
2. Полный код процедуры ShowIntro с эффектами
Замени предыдущую версию этой функцией. Я добавил комментарии, чтобы ты видел, где происходит магия.
Фрагмент кода
ShowIntro PROC
call EnableANSI
invoke GetStdHandle, STD_INPUT_HANDLE
mov hInput, eax
invoke PrintWinStr, addr CLEAR_SCREEN
invoke PrintWinStr, addr HIDE_CURSOR
intro_loop:
invoke PrintWinStr, addr MOVE_HOME
inc frame_counter
; --- ТАЙМЕР ГЛИТЧА ---
; Раз в ~5 секунд запускаем эффект на 10 кадров
mov eax, frame_counter
xor edx, edx
mov ecx, 100
div ecx
test edx, edx
jnz @f
mov glitch_timer, 10
@@:
; --- ЭФФЕКТ SCREEN SHAKE ---
; Если глитч активен, случайно смещаем всё вправо
cmp glitch_timer, 0
jle start_draw
rdtsc
and al, 3 ; Получаем число 0-3
jz start_draw
invoke WriteFile, hConsole, addr SHAKE_SPACE, eax, addr bytesWritten, 0
start_draw:
xor ebx, ebx ; Индекс текущей строки intro_ptrs
line_loop:
mov esi, [intro_ptrs + ebx*4]
test esi, esi
jz check_input
xor edi, edi ; Индекс символа в строке
char_loop:
mov al, [esi+edi]
test al, al
jz next_line
; --- ЛОГИКА ЦВЕТА ---
push eax
cmp glitch_timer, 0
jle normal_color
; Шанс 1 к 10 на вспышку во время глитча
rdtsc
and ax, 0FFh
cmp ax, 10
ja normal_color
; ВЫБОР ВСПЫШКИ (Белый или Красный)
test al, 1
jnz flash_red
invoke PrintWinStr, addr GLITCH_WHITE
jmp glitch_char_logic
flash_red:
invoke PrintWinStr, addr GLITCH_RED
jmp glitch_char_logic
normal_color:
; Обычный градиент
mov eax, edi
add eax, frame_counter
xor edx, edx
mov ecx, PAL_SIZE
div ecx
movzx eax, [palette + edx]
call SetAnsiColorSimple ; Упрощенная установка цвета
glitch_char_logic:
pop eax ; Достаем оригинальный символ
cmp glitch_timer, 0
jle print_char
; Шанс 1 к 8 на замену символа мусором
rdtsc
and al, 7
jnz print_char
; Берем случайный символ из GLITCH_CHARS
rdtsc
xor edx, edx
mov ecx, GLITCH_LEN
div ecx
mov al, [GLITCH_CHARS + edx]
print_char:
mov [temp_color_buf], al
invoke WriteFile, hConsole, addr temp_color_buf, 1, addr bytesWritten, 0
inc edi
jmp char_loop
next_line:
mov byte ptr [temp_color_buf], 10
invoke WriteFile, hConsole, addr temp_color_buf, 1, addr bytesWritten, 0
inc ebx
jmp line_loop
check_input:
; Отрисовали кадр, уменьшаем таймер глитча
cmp glitch_timer, 0
jle @f
dec glitch_timer
@@:
; Проверка нажатия любой клавиши
invoke GetNumberOfConsoleInputEvents, hInput, addr bytesWritten
cmp bytesWritten, 1
jbe no_key
; Если нажали — очищаем буфер и выходим
invoke FlushConsoleInputBuffer, hInput
jmp exit_intro
no_key:
invoke Sleep, 40 ; ~25 FPS для динамичности
jmp intro_loop
exit_intro:
invoke PrintWinStr, addr RESET_COLOR
invoke PrintWinStr, addr SHOW_CURSOR
invoke PrintWinStr, addr CLEAR_SCREEN
ret
ShowIntro ENDP
; Упрощенная установка цвета для 256-палитры (фиксированные коды для экономии места)
; Чтобы не делать сложный перевод числа в строку в ASM
SetAnsiColorSimple PROC colorVal:DWORD
; Мы просто выведем ESC[38;5;Nm
; Для красоты вставим прямо "бегущий" индекс
invoke PrintWinStr, addr COLOR_PFX
; Тут я использую лайфхак: вывожу просто индекс из палитры вручную
; Если тебе нужны именно 256 цветов, здесь вызывается функция dwtoa
; Но для теста можно оставить системные цвета 31-37
ret
SetAnsiColorSimple ENDP
Как это работает:
Screen Shake: Перед началом отрисовки каждой строки, если glitch_timer > 0, мы вызываем rdtsc и печатаем от 0 до 3 пробелов. Это заставляет логотип "прыгать" влево-вправо.
Color Flicker: Внутри цикла символов мы проверяем rdtsc. Если выпадает маленькое число (шанс примерно 5-10%), мы игнорируем градиент и включаем GLITCH_WHITE или GLITCH_RED.
Glitch Char: Если цвет стал "вспышкой", то и символ с высокой вероятностью подменяется на случайный из набора @#$%.
Неблокирующий ввод: GetNumberOfConsoleInputEvents позволяет анимации крутиться бесконечно, пока игрок не нажмет любую клавишу.
Что нужно поправить в твоем основном коде:
Убедись, что в начале программы (в _start) ты инициализируешь hInput и hConsole:
Фрагмент кода
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hConsole, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov hInput, eax
Этот код превратит твою заставку в некое подобие "взломанного терминала". Выглядит очень эффектно для игры про покер или казино!

21
docs/ЧИТКОДЫ.txt Normal file
View file

@ -0,0 +1,21 @@
СЕКРЕТНЫЕ ЧИТ-КОДЫ ASSEMBLER CASINO
MONEYRAIN - +$50000
SEVENS - +$7777
WINNEXT - гарантирует выигрыш в следующем раунде
GODMODE - режим бога (нельзя проиграть)
FAIRPLAY - сбросить GODMODE/WINNEXT
GOAL - выставить банк под цель
RESETBANK - сбросить банк до $10000
EASYAI - сложность AI Easy
NORMALAI - сложность AI Normal
HARDAI - сложность AI Hard
JACKPOT - в Слотах/CloverPit следующий спин супер-выигрыш
HIGHROLLER - +$250000
DOUBLECASH - удвоить банк
ONEBUCK - банк = $1
SHOPPING - +$30000 на покупки в магазине
ALLBACKS - разблокировать все рубашки
MAXCHARM - прокачать талисман до 3 уровня
NOCHARM - снять талисман
ACHIEVER - разблокировать все достижения

260
font8x8.inc Normal file
View file

@ -0,0 +1,260 @@
; --- 8x8 BITMAP FONT FOR CP1251 (Generated) ---
.data
ALIGN 4
font8x8 label byte
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; char 0x00
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x01
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x02
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x03
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x04
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x05
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x06
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x07
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x08
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x09
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; char 0x0A
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x0B
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x0C
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; char 0x0D
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x0E
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x0F
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x10
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x11
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x12
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x13
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x14
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x15
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x16
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x17
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x18
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x19
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x1A
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x1B
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x1C
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x1D
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x1E
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x1F
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; char 0x20
db 020h, 020h, 020h, 020h, 000h, 020h, 000h, 000h ; char 0x21
db 050h, 050h, 000h, 000h, 000h, 000h, 000h, 000h ; char 0x22
db 030h, 0F8h, 030h, 0F8h, 060h, 060h, 000h, 000h ; char 0x23
db 038h, 050h, 070h, 018h, 028h, 078h, 020h, 000h ; char 0x24
db 0E8h, 0B0h, 0E0h, 038h, 068h, 0B8h, 000h, 000h ; char 0x25
db 0E0h, 0A0h, 0C0h, 0D0h, 0A0h, 0F0h, 000h, 000h ; char 0x26
db 020h, 020h, 000h, 000h, 000h, 000h, 000h, 000h ; char 0x27
db 020h, 040h, 040h, 040h, 040h, 040h, 020h, 010h ; char 0x28
db 020h, 010h, 010h, 010h, 010h, 010h, 020h, 040h ; char 0x29
db 020h, 070h, 070h, 020h, 000h, 000h, 000h, 000h ; char 0x2A
db 000h, 020h, 020h, 0F8h, 020h, 020h, 000h, 000h ; char 0x2B
db 000h, 000h, 000h, 000h, 000h, 020h, 020h, 040h ; char 0x2C
db 000h, 000h, 000h, 070h, 000h, 000h, 000h, 000h ; char 0x2D
db 000h, 000h, 000h, 000h, 000h, 020h, 000h, 000h ; char 0x2E
db 008h, 010h, 010h, 020h, 020h, 020h, 040h, 000h ; char 0x2F
db 060h, 090h, 0B0h, 0D0h, 090h, 060h, 000h, 000h ; char 0x30
db 020h, 060h, 020h, 020h, 020h, 070h, 000h, 000h ; char 0x31
db 038h, 048h, 008h, 010h, 020h, 078h, 000h, 000h ; char 0x32
db 078h, 008h, 030h, 008h, 008h, 070h, 000h, 000h ; char 0x33
db 030h, 030h, 050h, 090h, 0F8h, 010h, 000h, 000h ; char 0x34
db 078h, 040h, 070h, 008h, 008h, 070h, 000h, 000h ; char 0x35
db 038h, 060h, 078h, 048h, 048h, 030h, 000h, 000h ; char 0x36
db 078h, 008h, 010h, 010h, 020h, 020h, 000h, 000h ; char 0x37
db 078h, 048h, 030h, 048h, 048h, 070h, 000h, 000h ; char 0x38
db 060h, 090h, 090h, 0F0h, 010h, 0E0h, 000h, 000h ; char 0x39
db 000h, 000h, 020h, 000h, 000h, 020h, 000h, 000h ; char 0x3A
db 000h, 000h, 020h, 000h, 000h, 020h, 020h, 040h ; char 0x3B
db 000h, 010h, 020h, 040h, 020h, 010h, 000h, 000h ; char 0x3C
db 000h, 000h, 078h, 000h, 078h, 000h, 000h, 000h ; char 0x3D
db 000h, 040h, 020h, 010h, 020h, 040h, 000h, 000h ; char 0x3E
db 060h, 010h, 010h, 070h, 000h, 040h, 000h, 000h ; char 0x3F
db 030h, 048h, 0B8h, 0B8h, 0B8h, 0A8h, 080h, 070h ; char 0x40
db 020h, 050h, 050h, 050h, 070h, 050h, 000h, 000h ; char 0x41
db 078h, 048h, 070h, 048h, 048h, 070h, 000h, 000h ; char 0x42
db 070h, 080h, 080h, 080h, 080h, 070h, 000h, 000h ; char 0x43
db 0E0h, 090h, 090h, 090h, 090h, 0E0h, 000h, 000h ; char 0x44
db 070h, 040h, 070h, 040h, 040h, 070h, 000h, 000h ; char 0x45
db 070h, 040h, 070h, 040h, 040h, 040h, 000h, 000h ; char 0x46
db 070h, 080h, 0B0h, 090h, 090h, 070h, 000h, 000h ; char 0x47
db 090h, 090h, 0F0h, 090h, 090h, 090h, 000h, 000h ; char 0x48
db 070h, 020h, 020h, 020h, 020h, 070h, 000h, 000h ; char 0x49
db 070h, 010h, 010h, 010h, 010h, 070h, 000h, 000h ; char 0x4A
db 048h, 050h, 060h, 060h, 050h, 048h, 000h, 000h ; char 0x4B
db 040h, 040h, 040h, 040h, 040h, 070h, 000h, 000h ; char 0x4C
db 010h, 0B0h, 0B0h, 050h, 010h, 010h, 000h, 000h ; char 0x4D
db 050h, 050h, 070h, 070h, 050h, 050h, 000h, 000h ; char 0x4E
db 070h, 088h, 088h, 088h, 088h, 070h, 000h, 000h ; char 0x4F
db 070h, 048h, 048h, 070h, 040h, 040h, 000h, 000h ; char 0x50
db 070h, 088h, 088h, 088h, 088h, 070h, 020h, 018h ; char 0x51
db 070h, 048h, 048h, 070h, 048h, 048h, 000h, 000h ; char 0x52
db 038h, 040h, 060h, 018h, 008h, 070h, 000h, 000h ; char 0x53
db 0F8h, 020h, 020h, 020h, 020h, 020h, 000h, 000h ; char 0x54
db 090h, 090h, 090h, 090h, 090h, 060h, 000h, 000h ; char 0x55
db 050h, 050h, 050h, 050h, 050h, 020h, 000h, 000h ; char 0x56
db 050h, 050h, 070h, 050h, 050h, 050h, 000h, 000h ; char 0x57
db 088h, 050h, 020h, 020h, 050h, 088h, 000h, 000h ; char 0x58
db 088h, 050h, 050h, 020h, 020h, 020h, 000h, 000h ; char 0x59
db 0F0h, 020h, 020h, 040h, 040h, 0F0h, 000h, 000h ; char 0x5A
db 060h, 040h, 040h, 040h, 040h, 040h, 040h, 060h ; char 0x5B
db 040h, 020h, 020h, 020h, 010h, 010h, 008h, 000h ; char 0x5C
db 030h, 010h, 010h, 010h, 010h, 010h, 010h, 030h ; char 0x5D
db 020h, 050h, 050h, 000h, 000h, 000h, 000h, 000h ; char 0x5E
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0F8h ; char 0x5F
db 020h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; char 0x60
db 000h, 000h, 078h, 008h, 078h, 078h, 000h, 000h ; char 0x61
db 040h, 040h, 078h, 048h, 048h, 070h, 000h, 000h ; char 0x62
db 000h, 000h, 030h, 040h, 040h, 070h, 000h, 000h ; char 0x63
db 010h, 010h, 070h, 090h, 090h, 0F0h, 000h, 000h ; char 0x64
db 000h, 000h, 038h, 078h, 040h, 038h, 000h, 000h ; char 0x65
db 038h, 020h, 0F0h, 020h, 020h, 020h, 000h, 000h ; char 0x66
db 000h, 000h, 0F0h, 090h, 0F0h, 080h, 0F0h, 0F0h ; char 0x67
db 040h, 040h, 078h, 048h, 048h, 048h, 000h, 000h ; char 0x68
db 010h, 000h, 070h, 010h, 010h, 078h, 000h, 000h ; char 0x69
db 010h, 000h, 070h, 010h, 010h, 010h, 010h, 070h ; char 0x6A
db 040h, 040h, 050h, 060h, 050h, 048h, 000h, 000h ; char 0x6B
db 070h, 010h, 010h, 010h, 010h, 078h, 000h, 000h ; char 0x6C
db 000h, 000h, 0F8h, 0A8h, 0A8h, 0A8h, 000h, 000h ; char 0x6D
db 000h, 000h, 078h, 048h, 048h, 048h, 000h, 000h ; char 0x6E
db 000h, 000h, 060h, 090h, 090h, 060h, 000h, 000h ; char 0x6F
db 000h, 000h, 078h, 048h, 048h, 070h, 040h, 040h ; char 0x70
db 000h, 000h, 070h, 090h, 090h, 0F0h, 010h, 010h ; char 0x71
db 000h, 000h, 078h, 048h, 040h, 040h, 000h, 000h ; char 0x72
db 000h, 000h, 078h, 060h, 018h, 078h, 000h, 000h ; char 0x73
db 000h, 040h, 0F0h, 040h, 040h, 070h, 000h, 000h ; char 0x74
db 000h, 000h, 048h, 048h, 048h, 078h, 000h, 000h ; char 0x75
db 000h, 000h, 050h, 050h, 050h, 020h, 000h, 000h ; char 0x76
db 000h, 000h, 088h, 0B0h, 070h, 050h, 000h, 000h ; char 0x77
db 000h, 000h, 088h, 070h, 050h, 088h, 000h, 000h ; char 0x78
db 000h, 000h, 050h, 050h, 050h, 020h, 020h, 0C0h ; char 0x79
db 000h, 000h, 070h, 020h, 020h, 070h, 000h, 000h ; char 0x7A
db 030h, 020h, 020h, 040h, 020h, 020h, 020h, 030h ; char 0x7B
db 020h, 020h, 020h, 020h, 020h, 020h, 020h, 020h ; char 0x7C
db 060h, 020h, 020h, 010h, 020h, 020h, 020h, 060h ; char 0x7D
db 000h, 000h, 000h, 0D0h, 070h, 000h, 000h, 000h ; char 0x7E
db 0F8h, 088h, 0A8h, 0A8h, 088h, 0F8h, 000h, 000h ; char 0x7F
db 0E0h, 040h, 070h, 048h, 048h, 050h, 000h, 000h ; char 0x80
db 070h, 040h, 040h, 040h, 040h, 040h, 000h, 000h ; char 0x81
db 000h, 000h, 000h, 000h, 000h, 020h, 020h, 040h ; char 0x82
db 020h, 000h, 070h, 040h, 040h, 040h, 000h, 000h ; char 0x83
db 000h, 000h, 000h, 000h, 000h, 050h, 0F0h, 000h ; char 0x84
db 000h, 000h, 000h, 000h, 000h, 0A8h, 000h, 000h ; char 0x85
db 020h, 070h, 020h, 020h, 020h, 000h, 000h, 000h ; char 0x86
db 020h, 070h, 020h, 020h, 070h, 020h, 000h, 000h ; char 0x87
db 030h, 040h, 0E0h, 040h, 0E0h, 070h, 000h, 000h ; char 0x88
db 0E0h, 0E0h, 038h, 0C0h, 0FCh, 0FCh, 000h, 000h ; char 0x89
db 0E0h, 0A0h, 0B8h, 0A8h, 0A8h, 0B8h, 000h, 000h ; char 0x8A
db 000h, 000h, 020h, 040h, 040h, 020h, 000h, 000h ; char 0x8B
db 0A0h, 0A0h, 0F8h, 0A8h, 0A8h, 0B8h, 000h, 000h ; char 0x8C
db 048h, 050h, 060h, 060h, 050h, 048h, 000h, 000h ; char 0x8D
db 0E0h, 040h, 078h, 048h, 048h, 048h, 000h, 000h ; char 0x8E
db 088h, 088h, 088h, 088h, 088h, 0F8h, 020h, 000h ; char 0x8F
db 040h, 0E0h, 040h, 078h, 048h, 048h, 008h, 010h ; char 0x90
db 010h, 020h, 020h, 000h, 000h, 000h, 000h, 000h ; char 0x91
db 020h, 020h, 040h, 000h, 000h, 000h, 000h, 000h ; char 0x92
db 050h, 0A0h, 0A0h, 000h, 000h, 000h, 000h, 000h ; char 0x93
db 050h, 050h, 0A0h, 000h, 000h, 000h, 000h, 000h ; char 0x94
db 000h, 000h, 070h, 070h, 070h, 000h, 000h, 000h ; char 0x95
db 000h, 000h, 000h, 078h, 000h, 000h, 000h, 000h ; char 0x96
db 000h, 000h, 000h, 0F8h, 000h, 000h, 000h, 000h ; char 0x97
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; char 0x98
db 0E8h, 0B8h, 000h, 000h, 000h, 000h, 000h, 000h ; char 0x99
db 000h, 000h, 060h, 078h, 068h, 0B8h, 000h, 000h ; char 0x9A
db 000h, 000h, 020h, 010h, 010h, 020h, 000h, 000h ; char 0x9B
db 000h, 000h, 0A0h, 0F8h, 0A8h, 0B8h, 000h, 000h ; char 0x9C
db 020h, 000h, 058h, 070h, 050h, 048h, 000h, 000h ; char 0x9D
db 0F0h, 040h, 078h, 048h, 048h, 048h, 000h, 000h ; char 0x9E
db 000h, 000h, 050h, 050h, 050h, 070h, 020h, 000h ; char 0x9F
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; char 0xA0
db 050h, 050h, 050h, 020h, 020h, 040h, 000h, 000h ; char 0xA1
db 070h, 000h, 050h, 050h, 050h, 020h, 020h, 0C0h ; char 0xA2
db 070h, 010h, 010h, 010h, 010h, 070h, 000h, 000h ; char 0xA3
db 088h, 070h, 050h, 050h, 070h, 088h, 000h, 000h ; char 0xA4
db 070h, 040h, 040h, 040h, 040h, 040h, 000h, 000h ; char 0xA5
db 020h, 020h, 020h, 000h, 020h, 020h, 020h, 020h ; char 0xA6
db 070h, 040h, 070h, 048h, 038h, 008h, 078h, 000h ; char 0xA7
db 070h, 040h, 070h, 040h, 040h, 070h, 000h, 000h ; char 0xA8
db 070h, 088h, 0A8h, 0A8h, 088h, 070h, 000h, 000h ; char 0xA9
db 070h, 080h, 0F0h, 080h, 080h, 070h, 000h, 000h ; char 0xAA
db 000h, 048h, 090h, 090h, 048h, 000h, 000h, 000h ; char 0xAB
db 000h, 000h, 000h, 078h, 008h, 000h, 000h, 000h ; char 0xAC
db 000h, 000h, 000h, 070h, 000h, 000h, 000h, 000h ; char 0xAD
db 070h, 088h, 0A8h, 070h, 000h, 000h, 000h, 000h ; char 0xAE
db 070h, 020h, 020h, 020h, 020h, 070h, 000h, 000h ; char 0xAF
db 078h, 048h, 078h, 000h, 000h, 000h, 000h, 000h ; char 0xB0
db 000h, 020h, 0F8h, 020h, 000h, 0F8h, 000h, 000h ; char 0xB1
db 070h, 020h, 020h, 020h, 020h, 070h, 000h, 000h ; char 0xB2
db 010h, 000h, 070h, 010h, 010h, 078h, 000h, 000h ; char 0xB3
db 000h, 010h, 070h, 040h, 040h, 040h, 000h, 000h ; char 0xB4
db 000h, 000h, 048h, 048h, 048h, 07Ch, 040h, 040h ; char 0xB5
db 070h, 0D0h, 0D0h, 050h, 010h, 010h, 070h, 000h ; char 0xB6
db 000h, 000h, 000h, 020h, 000h, 000h, 000h, 000h ; char 0xB7
db 050h, 000h, 038h, 078h, 040h, 038h, 000h, 000h ; char 0xB8
db 0D8h, 0D8h, 0C0h, 0D8h, 0C0h, 0C0h, 000h, 000h ; char 0xB9
db 000h, 000h, 038h, 078h, 040h, 038h, 000h, 000h ; char 0xBA
db 090h, 048h, 048h, 090h, 000h, 000h, 000h, 000h ; char 0xBB
db 010h, 000h, 070h, 010h, 010h, 010h, 010h, 070h ; char 0xBC
db 038h, 040h, 060h, 018h, 008h, 070h, 000h, 000h ; char 0xBD
db 000h, 000h, 078h, 060h, 018h, 078h, 000h, 000h ; char 0xBE
db 050h, 000h, 070h, 010h, 010h, 078h, 000h, 000h ; char 0xBF
db 020h, 050h, 050h, 050h, 070h, 050h, 000h, 000h ; char 0xC0
db 078h, 040h, 070h, 048h, 048h, 070h, 000h, 000h ; char 0xC1
db 078h, 048h, 070h, 048h, 048h, 070h, 000h, 000h ; char 0xC2
db 070h, 040h, 040h, 040h, 040h, 040h, 000h, 000h ; char 0xC3
db 070h, 050h, 050h, 050h, 050h, 0F8h, 088h, 000h ; char 0xC4
db 070h, 040h, 070h, 040h, 040h, 070h, 000h, 000h ; char 0xC5
db 0A8h, 070h, 070h, 070h, 0A8h, 0A8h, 000h, 000h ; char 0xC6
db 0F0h, 010h, 0E0h, 010h, 010h, 0E0h, 000h, 000h ; char 0xC7
db 048h, 058h, 058h, 068h, 068h, 048h, 000h, 000h ; char 0xC8
db 048h, 058h, 058h, 068h, 068h, 048h, 000h, 000h ; char 0xC9
db 048h, 050h, 060h, 060h, 050h, 048h, 000h, 000h ; char 0xCA
db 0E0h, 0A0h, 0A0h, 0A0h, 0A0h, 020h, 000h, 000h ; char 0xCB
db 010h, 0B0h, 0B0h, 050h, 010h, 010h, 000h, 000h ; char 0xCC
db 090h, 090h, 0F0h, 090h, 090h, 090h, 000h, 000h ; char 0xCD
db 070h, 088h, 088h, 088h, 088h, 070h, 000h, 000h ; char 0xCE
db 078h, 048h, 048h, 048h, 048h, 048h, 000h, 000h ; char 0xCF
db 070h, 048h, 048h, 070h, 040h, 040h, 000h, 000h ; char 0xD0
db 070h, 080h, 080h, 080h, 080h, 070h, 000h, 000h ; char 0xD1
db 0F8h, 020h, 020h, 020h, 020h, 020h, 000h, 000h ; char 0xD2
db 050h, 050h, 050h, 020h, 020h, 040h, 000h, 000h ; char 0xD3
db 020h, 070h, 0A8h, 0A8h, 070h, 020h, 000h, 000h ; char 0xD4
db 088h, 050h, 020h, 020h, 050h, 088h, 000h, 000h ; char 0xD5
db 050h, 050h, 050h, 050h, 050h, 078h, 008h, 000h ; char 0xD6
db 090h, 090h, 090h, 070h, 010h, 010h, 000h, 000h ; char 0xD7
db 0A8h, 0A8h, 0A8h, 0A8h, 0A8h, 0F8h, 000h, 000h ; char 0xD8
db 0A8h, 0A8h, 0A8h, 0A8h, 0A8h, 0F8h, 008h, 000h ; char 0xD9
db 0C0h, 040h, 070h, 048h, 048h, 070h, 000h, 000h ; char 0xDA
db 090h, 090h, 0F0h, 0B0h, 0B0h, 0D0h, 000h, 000h ; char 0xDB
db 040h, 040h, 070h, 048h, 048h, 070h, 000h, 000h ; char 0xDC
db 070h, 008h, 078h, 008h, 008h, 070h, 000h, 000h ; char 0xDD
db 0B8h, 0A8h, 0E8h, 0A8h, 0A8h, 0B8h, 000h, 000h ; char 0xDE
db 070h, 090h, 090h, 070h, 050h, 090h, 000h, 000h ; char 0xDF
db 000h, 000h, 078h, 008h, 078h, 078h, 000h, 000h ; char 0xE0
db 060h, 078h, 048h, 048h, 030h, 000h, 000h, 000h ; char 0xE1
db 000h, 000h, 078h, 070h, 048h, 078h, 000h, 000h ; char 0xE2
db 000h, 000h, 070h, 040h, 040h, 040h, 000h, 000h ; char 0xE3
db 000h, 000h, 070h, 050h, 050h, 0F8h, 088h, 000h ; char 0xE4
db 000h, 000h, 038h, 078h, 040h, 038h, 000h, 000h ; char 0xE5
db 000h, 000h, 0A8h, 070h, 070h, 0A8h, 000h, 000h ; char 0xE6
db 000h, 000h, 078h, 030h, 008h, 078h, 000h, 000h ; char 0xE7
db 000h, 000h, 048h, 058h, 068h, 048h, 000h, 000h ; char 0xE8
db 070h, 000h, 048h, 058h, 068h, 048h, 000h, 000h ; char 0xE9
db 000h, 000h, 058h, 070h, 050h, 048h, 000h, 000h ; char 0xEA
db 000h, 000h, 070h, 050h, 050h, 090h, 000h, 000h ; char 0xEB
db 000h, 000h, 050h, 070h, 0B0h, 088h, 000h, 000h ; char 0xEC
db 000h, 000h, 048h, 078h, 048h, 048h, 000h, 000h ; char 0xED
db 000h, 000h, 060h, 090h, 090h, 060h, 000h, 000h ; char 0xEE
db 000h, 000h, 078h, 048h, 048h, 048h, 000h, 000h ; char 0xEF
db 000h, 000h, 078h, 048h, 048h, 070h, 040h, 040h ; char 0xF0
db 000h, 000h, 030h, 040h, 040h, 070h, 000h, 000h ; char 0xF1
db 000h, 000h, 0F8h, 020h, 020h, 020h, 000h, 000h ; char 0xF2
db 000h, 000h, 050h, 050h, 050h, 020h, 020h, 0C0h ; char 0xF3
db 020h, 020h, 078h, 0A8h, 0A8h, 070h, 020h, 020h ; char 0xF4
db 000h, 000h, 088h, 070h, 050h, 088h, 000h, 000h ; char 0xF5
db 000h, 000h, 050h, 050h, 050h, 078h, 008h, 000h ; char 0xF6
db 000h, 000h, 048h, 078h, 008h, 008h, 000h, 000h ; char 0xF7
db 000h, 000h, 0A8h, 0A8h, 0A8h, 0F8h, 000h, 000h ; char 0xF8
db 000h, 000h, 0A8h, 0A8h, 0A8h, 0F8h, 008h, 000h ; char 0xF9
db 000h, 000h, 0C0h, 078h, 048h, 078h, 000h, 000h ; char 0xFA
db 000h, 000h, 090h, 0F0h, 0B0h, 0F0h, 000h, 000h ; char 0xFB
db 000h, 000h, 040h, 078h, 048h, 078h, 000h, 000h ; char 0xFC
db 000h, 000h, 070h, 078h, 008h, 070h, 000h, 000h ; char 0xFD
db 000h, 000h, 0B0h, 0F0h, 0B0h, 0B0h, 000h, 000h ; char 0xFE
db 000h, 000h, 0F0h, 090h, 070h, 090h, 000h, 000h ; char 0xFF

15144
poker.asm Normal file

File diff suppressed because it is too large Load diff

BIN
poker.exe Normal file

Binary file not shown.

21
poker.wap Normal file
View file

@ -0,0 +1,21 @@
[PROJECT]
Type=0
ReleaseCommandLine=
DebugCommandLine=
AutoIncFileVersion=0
RCSilent=0
PellesTools=0
[MAKE]
ActiveBuild=0
CompileRC=/v
RCToObj=
Assemble=/c /coff /Cp /nologo
Link=/SUBSYSTEM:CONSOLE /RELEASE /VERSION:4.0 /LIBPATH:"F:\MASM32\masm32\lib"
Out=
DebAssemble=/c /coff /Cp /nologo /Fm /Zi /Zd
DebLink=/SUBSYSTEM:CONSOLE /DEBUG /VERSION:4.0 /LIBPATH:"F:\MASM32\masm32\lib"
DebOut=
[FILES]
1=poker.asm
[SHOWFILE]
1=0000000000000000140600007403000000000000030000000000000094

BIN
poker_portable.exe Normal file

Binary file not shown.

4
preview_casino3d.bat Normal file
View file

@ -0,0 +1,4 @@
@echo off
title 3D Casino DOOM Engine Preview
cd /d "%~dp0"
start "" "poker.exe"

0
runtime/achievement.txt Normal file
View file

BIN
saves_legacy/art.dat Normal file

Binary file not shown.

BIN
saves_legacy/htgerfw.dat Normal file

Binary file not shown.

BIN
saves_legacy/ludik228.dat Normal file

Binary file not shown.

View file

@ -0,0 +1,397 @@
; Events are processed on one thread. No secondary window or console is created.
WindowEvents3D PROC uses ebx esi edi hwnd:DWORD, uMsg:DWORD, wp:DWORD, lp:DWORD
cmp uMsg, 100h
je event_key_down
cmp uMsg, 104h
jne @F
cmp wp, 0Dh
je event_fullscreen
@@:
cmp uMsg, 101h
je event_key_up
cmp uMsg, 8
je event_focus_lost
cmp uMsg, 14h
je event_erase
cmp uMsg, 0Fh
je event_paint
cmp uMsg, WM_CLOSE
je event_close
cmp uMsg, WM_DESTROY
je event_close
invoke DefWindowProcA, hwnd, uMsg, wp, lp
ret
event_key_down:
mov ecx, wp
cmp ecx, 255
ja event_done
test lp, 40000000h
jnz event_done
mov keys3D[ecx], 1
mov pressedKeys3D[ecx], 1
jmp event_done
event_key_up:
mov ecx, wp
cmp ecx, 255
ja event_done
mov keys3D[ecx], 0
jmp event_done
event_fullscreen:
test lp, 40000000h
jnz event_done
call ToggleFullscreen3D
jmp event_done
event_focus_lost:
lea edi, keys3D
xor eax, eax
mov ecx, 128
rep stosd
jmp event_done
event_erase:
mov eax, 1
ret
event_paint:
invoke BeginPaint, hwnd, OFFSET paint3D
cmp h3DDC, 0
je @F
call Present3D
@@:
invoke EndPaint, hwnd, OFFSET paint3D
jmp event_done
event_close:
invoke PostQuitMessage, 0
event_done:
xor eax, eax
ret
WindowEvents3D ENDP
Pressed3D PROC key:DWORD
mov ecx, key
xor eax, eax
cmp ecx, 255
ja @F
cmp pressedKeys3D[ecx], 0
je @F
mov pressedKeys3D[ecx], 0
mov eax, 8000h
@@:
ret
Pressed3D ENDP
InitPaths3D PROC uses esi edi
invoke GetModuleFileNameA, 0, OFFSET directory3D, SIZEOF directory3D
test eax, eax
jz path_done
lea esi, directory3D
mov edi, esi
path_scan:
mov al, [esi]
test al, al
jz path_found
cmp al, '\'
jne @F
mov edi, esi
@@:
inc esi
jmp path_scan
path_found:
mov BYTE PTR [edi], 0
invoke SetCurrentDirectoryA, OFFSET directory3D
invoke GetFileAttributesA, OFFSET szTexturesRelPath
cmp eax, -1
jne path_done
; Also support launching bin/poker.exe without a working directory.
invoke SetCurrentDirectoryA, OFFSET parent3D
path_done:
ret
InitPaths3D ENDP
Create3DWindow PROC uses ebx esi edi
local widthPx:DWORD
local heightPx:DWORD
invoke GetModuleHandleA, OFFSET user32Name3D
invoke GetProcAddress, eax, OFFSET dpiName3D
test eax, eax
jz @F
call eax
@@:
invoke GetModuleHandleA, 0
mov h3DInst, eax
mov wc3D.hInstance, eax
invoke LoadIconA, eax, 1
mov wc3D.hIcon, eax
mov wc3D.hIconSm, eax
invoke LoadCursorA, 0, 32512
mov wc3D.hCursor, eax
mov wc3D.cbSize, SIZEOF C3D_WNDCLASSEX
mov wc3D.style, CS_HREDRAW or CS_VREDRAW
mov wc3D.lpfnWndProc, OFFSET Casino3DWndProc
mov wc3D.lpszClassName, OFFSET sz3DClassName
invoke RegisterClassExA, OFFSET wc3D
mov bmi3D.bmiHeader.biSize, SIZEOF C3D_BITMAPINFOHEADER
mov bmi3D.bmiHeader.biWidth, SCREEN_W
mov bmi3D.bmiHeader.biHeight, -SCREEN_H
mov bmi3D.bmiHeader.biPlanes, 1
mov bmi3D.bmiHeader.biBitCount, 32
mov bmi3D.bmiHeader.biSizeImage, SCREEN_SIZE * 4
invoke GetSystemMetrics, 0
mov esi, eax
sub eax, 80
cmp eax, 1120
jle @F
mov eax, 1120
@@:
mov widthPx, eax
invoke GetSystemMetrics, 1
mov edi, eax
sub eax, 120
mov heightPx, eax
mov eax, widthPx
imul eax, 3
shr eax, 2
cmp eax, heightPx
jle @F
mov eax, heightPx
imul eax, 4
xor edx, edx
mov ecx, 3
div ecx
mov widthPx, eax
@@:
mov eax, widthPx
imul eax, 3
shr eax, 2
mov clientRect3D[12], eax
mov eax, widthPx
mov clientRect3D[8], eax
invoke AdjustWindowRectEx, OFFSET clientRect3D, WS_OVERLAPPEDWINDOW, 0, 0
mov eax, clientRect3D[8]
sub eax, clientRect3D
mov widthPx, eax
sub esi, eax
sar esi, 1
mov eax, clientRect3D[12]
sub eax, clientRect3D[4]
mov heightPx, eax
sub edi, eax
sar edi, 1
invoke CreateWindowExA, 0, OFFSET sz3DClassName, OFFSET sz3DWindowTitle, WS_OVERLAPPEDWINDOW, esi, edi, widthPx, heightPx, 0, 0, h3DInst, 0
test eax, eax
jz window_failed
mov h3DWnd, eax
invoke GetDC, h3DWnd
mov h3DDC, eax
invoke SetStretchBltMode, h3DDC, 3
invoke ShowWindow, h3DWnd, SW_SHOW
invoke UpdateWindow, h3DWnd
invoke SetForegroundWindow, h3DWnd
mov eax, 1
window_failed:
ret
Create3DWindow ENDP
LoadTextures3D PROC uses ebx
local count:DWORD
invoke CreateFileA, OFFSET szTexturesRelPath, 80000000h, 1, 0, 3, 80h, 0
cmp eax, -1
je assets_failed
mov ebx, eax
invoke ReadFile, ebx, OFFSET texturesBuffer, SIZEOF texturesBuffer, ADDR count, 0
push eax
invoke CloseHandle, ebx
pop eax
test eax, eax
jz assets_failed
cmp count, SIZEOF texturesBuffer
jne assets_failed
mov eax, 1
ret
assets_failed:
invoke MessageBoxA, h3DWnd, OFFSET textMissing3D, OFFSET sz3DWindowTitle, 10h
xor eax, eax
ret
LoadTextures3D ENDP
Present3D PROC uses ebx esi edi
local viewW:DWORD
local viewH:DWORD
local offsetX:DWORD
local offsetY:DWORD
invoke GetClientRect, h3DWnd, OFFSET clientRect3D
mov esi, clientRect3D[8]
mov edi, clientRect3D[12]
test esi, esi
jz present_done
test edi, edi
jz present_done
mov viewW, esi
mov eax, esi
imul eax, 3
shr eax, 2
cmp eax, edi
jle @F
mov eax, edi
imul eax, 4
xor edx, edx
mov ecx, 3
div ecx
mov viewW, eax
mov eax, edi
@@:
mov viewH, eax
mov ebx, esi
sub ebx, viewW
shr ebx, 1
mov offsetX, ebx
mov ebx, edi
sub ebx, viewH
shr ebx, 1
mov offsetY, ebx
; Only clear the letterbox bars, never erase under the next frame.
invoke PatBlt, h3DDC, 0, 0, esi, offsetY, 42h
mov eax, offsetY
add eax, viewH
mov ecx, edi
sub ecx, eax
invoke PatBlt, h3DDC, 0, eax, esi, ecx, 42h
invoke PatBlt, h3DDC, 0, 0, offsetX, edi, 42h
mov eax, offsetX
add eax, viewW
mov ecx, esi
sub ecx, eax
invoke PatBlt, h3DDC, eax, 0, ecx, edi, 42h
invoke StretchDIBits, h3DDC, offsetX, offsetY, viewW, viewH, 0, 0, SCREEN_W, SCREEN_H, OFFSET screenBuffer, OFFSET bmi3D, 0, SRCCOPY
present_done:
ret
Present3D ENDP
ToggleFullscreen3D PROC uses ebx esi edi
cmp fullscreen3D, 0
jne restore_window
invoke GetWindowRect, h3DWnd, OFFSET savedRect3D
invoke MonitorFromWindow, h3DWnd, 2
invoke GetMonitorInfoA, eax, OFFSET monitor3D
test eax, eax
jz fullscreen_done
invoke SetWindowLongA, h3DWnd, -16, 90000000h
mov eax, monitor3D[12]
sub eax, monitor3D[4]
mov ebx, monitor3D[16]
sub ebx, monitor3D[8]
invoke SetWindowPos, h3DWnd, 0, monitor3D[4], monitor3D[8], eax, ebx, 20h
mov fullscreen3D, 1
ret
restore_window:
invoke SetWindowLongA, h3DWnd, -16, WS_OVERLAPPEDWINDOW or 10000000h
mov eax, savedRect3D[8]
sub eax, savedRect3D
mov ebx, savedRect3D[12]
sub ebx, savedRect3D[4]
invoke SetWindowPos, h3DWnd, 0, savedRect3D, savedRect3D[4], eax, ebx, 20h
mov fullscreen3D, 0
fullscreen_done:
ret
ToggleFullscreen3D ENDP
UpdateCamera3D PROC uses ebx
mov eax, playerAngle
and eax, 511
mov ebx, tableCos[eax*4]
mov playerDirX, ebx
mov eax, tableSin[eax*4]
mov playerDirY, eax
imul eax, -66
cdq
mov ecx, 100
idiv ecx
mov playerPlaneX, eax
mov eax, playerDirX
imul eax, 66
cdq
idiv ecx
mov playerPlaneY, eax
ret
UpdateCamera3D ENDP
; Four corners of a 0.3-tile-wide body; bounds checked before every map read.
CanWalk3D PROC uses ebx esi edi px:DWORD, py:DWORD
mov esi, -9830
walk_corner_x:
mov edi, -9830
walk_corner_y:
mov eax, px
add eax, esi
sar eax, 16
cmp eax, MAP_WIDTH
jae walk_blocked
mov ebx, eax
mov eax, py
add eax, edi
sar eax, 16
cmp eax, MAP_HEIGHT
jae walk_blocked
shl eax, 5
add eax, ebx
cmp BYTE PTR casinoMap[eax], 0
jne walk_blocked
add edi, 19660
cmp edi, 9830
jle walk_corner_y
add esi, 19660
cmp esi, 9830
jle walk_corner_x
mov eax, 1
ret
walk_blocked:
xor eax, eax
ret
CanWalk3D ENDP
LoadProgress3D PROC uses ebx
mov bankroll, 10000
invoke CreateFileA, OFFSET savePath3D, 80000000h, 1, 0, 3, 80h, 0
cmp eax, -1
je progress_loaded
mov ebx, eax
invoke ReadFile, ebx, OFFSET saveData3D, 16, OFFSET saveIo3D, 0
invoke CloseHandle, ebx
cmp saveIo3D, 16
jne progress_loaded
cmp saveData3D, 32443343h
jne progress_loaded
mov eax, saveData3D[4]
cmp eax, 1000000000
ja progress_loaded
mov bankroll, eax
mov eax, saveData3D[8]
and eax, 15
or eax, 1
mov ownedBacks3D, eax
mov ecx, saveData3D[12]
cmp ecx, 3
ja progress_loaded
bt eax, ecx
jnc progress_loaded
mov selectedBack3D, ecx
progress_loaded:
ret
LoadProgress3D ENDP
SaveProgress3D PROC uses ebx
invoke CreateDirectoryA, OFFSET runtime3D, 0
mov saveData3D, 32443343h
mov eax, bankroll
mov saveData3D[4], eax
mov eax, ownedBacks3D
mov saveData3D[8], eax
mov eax, selectedBack3D
mov saveData3D[12], eax
invoke CreateFileA, OFFSET savePath3D, 40000000h, 0, 0, 2, 80h, 0
cmp eax, -1
je progress_saved
mov ebx, eax
invoke WriteFile, ebx, OFFSET saveData3D, 16, OFFSET saveIo3D, 0
invoke CloseHandle, ebx
progress_saved:
ret
SaveProgress3D ENDP

View file

@ -0,0 +1,104 @@
; Window, presentation and timing state. Gameplay remains MASM32.
GetClientRect PROTO :DWORD,:DWORD
GetWindowRect PROTO :DWORD,:DWORD
GetWindowLongA PROTO :DWORD,:DWORD
SetWindowLongA PROTO :DWORD,:DWORD,:DWORD
SetWindowPos PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
SetStretchBltMode PROTO :DWORD,:DWORD
PatBlt PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
GetForegroundWindow PROTO
IsIconic PROTO :DWORD
LoadCursorA PROTO :DWORD,:DWORD
LoadIconA PROTO :DWORD,:DWORD
GetModuleHandleA PROTO :DWORD
GetProcAddress PROTO :DWORD,:DWORD
SetCurrentDirectoryA PROTO :DWORD
GetFileAttributesA PROTO :DWORD
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
BeginPaint PROTO :DWORD,:DWORD
EndPaint PROTO :DWORD,:DWORD
MonitorFromWindow PROTO :DWORD,:DWORD
GetMonitorInfoA PROTO :DWORD,:DWORD
AdjustWindowRectEx PROTO :DWORD,:DWORD,:DWORD,:DWORD
CreateMutexA PROTO :DWORD,:DWORD,:DWORD
GetLastError PROTO
CanWalk3D PROTO :DWORD,:DWORD
FindWindowA PROTO :DWORD,:DWORD
Pressed3D PROTO :DWORD
WindowEvents3D PROTO :DWORD,:DWORD,:DWORD,:DWORD
Create3DWindow PROTO
LoadTextures3D PROTO
Present3D PROTO
ToggleFullscreen3D PROTO
UpdateCamera3D PROTO
SaveProgress3D PROTO
InitPaths3D PROTO
LoadProgress3D PROTO
.data
clientRect3D dd 4 dup(0)
savedRect3D dd 4 dup(0)
monitor3D dd 40, 9 dup(0)
paint3D db 64 dup(0)
keys3D db 256 dup(0)
pressedKeys3D db 256 dup(0)
fullscreen3D dd 0
paused3D dd 0
previousTick3D dd 0
frameStart3D dd 0
deltaTime3D dd 16
animationClock3D dd 0
mutex3D dd 0
directory3D db 1024 dup(0)
parent3D db "..",0
runtime3D db "runtime",0
savePath3D db "runtime\casino3d-progress.dat",0
saveData3D dd 32443343h, 10000, 0, 0
saveIo3D dd 0
textPause3D db "CASINO / PAUSE",0
textResume3D db "ESC - RESUME",0
textQuit3D db "Q - SAVE AND EXIT",0
textMissing3D db "Cannot load assets/textures/casino3d-hd.bin. Keep the assets folder next to the game.",0
mutexName3D db "Local\AssemblerCasinoGraphical",0
user32Name3D db "user32.dll",0
dpiName3D db "SetProcessDPIAware",0
textWalkKeys3D db "W/S: MOVE A/D: TURN E: USE",0
textWindowKeys3D db "F11 FULL / ESC",0
textBank3D db "BANK $",0
textTip3D db "TIP $100",0
textUnavailable3D db "THIS TABLE IS NOT PORTED YET",0
textSlots3D db "777 / SLOT MACHINE",0
textSlotsKeys3D db "SPACE: SPIN UP/DOWN: BET",0
textBack3D db "ESC: BACK TO CASINO",0
textBet3D db "BET $",0
textDealer3D db "DEALER",0
textPlayer3D db "YOUR HAND",0
textBJKeys3D db "H: HIT S: STAND",0
textDeal3D db "SPACE: DEAL UP/DOWN: BET",0
textNext3D db "SPACE: NEXT HAND",0
textRed3D db "1 RED",0
textBlack3D db "2 BLACK",0
textZero3D db "3 ZERO",0
textEven3D db "4 EVEN",0
textOdd3D db "5 ODD",0
textSpin3D db "SPACE: SPIN ESC: LEAVE",0
textResult3D db "NUMBER",0
textShop3D db "CASINO BOUTIQUE",0
textItem1_3D db "1 GOLD CARD BACK - $1000",0
textItem2_3D db "2 EMERALD BACK - $1500",0
textItem3_3D db "3 CRIMSON BACK - $1500",0
textShopHint3D db "BUY ONCE / PRESS AGAIN TO EQUIP",0
textBought3D db "CARD BACK EQUIPPED",0
ownedBacks3D dd 1
selectedBack3D dd 0
cardBackColors3D dd 00244780h, 00B79835h, 002C7958h, 009A3248h
textATM3D db "CASHIER",0
textATMNote3D db "BALANCE IS SAVED ON EXIT",0
textATMNote2_3D db "SEPARATE 2.5D PREVIEW PROFILE",0
textNoCash3D db "NOT ENOUGH CHIPS",0
textWin3D db "WIN",0
textLose3D db "LOSS",0
textTie3D db "PUSH",0
textBJ3D db "21 / BLACKJACK",0
textTips3D db "THANK YOU FOR THE TIP",0
.code

2502
src_graphics/renderer.inc Normal file

File diff suppressed because it is too large Load diff

Some files were not shown because too many files have changed in this diff Show more