Add Assembler Casino project with 2.5D graphics and tools
25
.gitignore
vendored
Normal 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
|
|
@ -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
13
CMakeLists.txt
Normal 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
|
|
@ -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
|
||||
BIN
Uninstall Assembler Casino.exe
Normal file
2101
assets/animations/casino_intro.ans
Normal file
6233
assets/animations/dbd_hook.ans
Normal file
8471
assets/animations/hakari_dance.ans
Normal file
BIN
assets/audio/b05e1ac8be34248.wav
Normal file
BIN
assets/audio/hKhoJArfEGAxxMewx0UQiddakTdBjFc.wav
Normal file
BIN
assets/audio/hakari_dance.wav
Normal file
BIN
assets/audio/moving-stone.wav
Normal file
BIN
assets/audio/playing_cards_deck_flick_through_001_20485.wav
Normal file
BIN
assets/audio/revolverdryfirec.wav
Normal file
BIN
assets/audio/roulette-wheel-throw-2.wav
Normal file
BIN
assets/audio/toy-gun-revolver-close-chamber-spin_f1ruc5nd.wav
Normal file
BIN
assets/audio/victory-tf2.wav
Normal file
BIN
assets/audio/Джэк пот.wav
Normal file
BIN
assets/audio/Звук монеты в игре Ultrakill.wav
Normal file
BIN
assets/audio/Летс гоу гэмблинг.wav
Normal file
BIN
assets/audio/Проигрыш.wav
Normal file
17
assets/data/dealer_phrases.txt
Normal 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
|
After Width: | Height: | Size: 361 KiB |
BIN
assets/icons/casino_preview.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
assets/music/tower/KEYGEN_CHURCH_-_Hareklavit_75543927.mp3
Normal file
BIN
assets/music/tower/KEYGEN_CHURCH_-_Ladikerfos_75543991.mp3
Normal file
BIN
assets/music/tower/KEYGEN_CHURCH_-_Tilaskarot_75546826.mp3
Normal file
BIN
assets/music/tower/Mick_Gordon_-_BFG_Division_48126042.mp3
Normal file
BIN
assets/music/tower/Mick_Gordon_-_Rip_Tear_48126019.mp3
Normal file
BIN
assets/sprites/cabaret-loop-v1.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
assets/sprites/casino-atlas-v1.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
assets/textures/casino3d-hd.bin
Normal file
BIN
assets/textures/casino3d.bin
Normal file
BIN
assets/textures/sprite_bartender_shop.png
Normal file
|
After Width: | Height: | Size: 6 KiB |
BIN
assets/textures/sprite_blackjack_table.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
assets/textures/sprite_dancer_frame_0.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
assets/textures/sprite_dancer_frame_1.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
assets/textures/sprite_dancer_frame_2.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
assets/textures/sprite_dancer_frame_3.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
assets/textures/sprite_roulette_table.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
BIN
assets/textures/sprite_slot_frame_0.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
assets/textures/sprite_slot_frame_1.png
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
assets/textures/sprite_slot_frame_2.png
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
assets/textures/tex_floor_carpet.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
assets/textures/tex_wall_hell.png
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
assets/textures/tex_wall_stripclub.png
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
BIN
assets/textures/tex_wall_velvet.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
BIN
bin/poker.dll
Normal file
BIN
bin/poker.exe
Normal file
14
build.bat
Normal 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
|
||||
57
build/AssemblerCasinoLauncher.cs
Normal 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
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
235
build/UninstallAssemblerCasino.cs
Normal 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
|
|
@ -0,0 +1 @@
|
|||
1 ICON "assets\\icons\\casino.ico"
|
||||
BIN
build/graphics/cabaret-loop-preview.gif
Normal file
|
After Width: | Height: | Size: 125 KiB |
2975
build/graphics/casino3d.inc
Normal file
15144
build/graphics/poker.asm
Normal file
BIN
build/graphics/poker.exe
Normal file
BIN
build/graphics/texture-atlas-preview.png
Normal file
|
After Width: | Height: | Size: 449 KiB |
BIN
build/icon_work/casino_128.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
build/icon_work/casino_16.png
Normal file
|
After Width: | Height: | Size: 868 B |
BIN
build/icon_work/casino_256.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
build/icon_work/casino_32.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
build/icon_work/casino_48.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
build/icon_work/casino_64.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
build/icon_work/extract_Assembler_Casino_exe.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
build/icon_work/extract_PokerGameSetup_exe.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
build/icon_work/extract_Uninstall_Assembler_Casino_exe.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
build/icon_work/extract_bin_poker_exe.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
2975
casino3d.inc
Normal file
173
casino3d_data.inc
Normal 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
|
||||
|
||||
18
docs/KNOWN_LIMITATIONS.txt
Normal 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
|
|
@ -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
|
|
@ -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
|
||||
|
||||
Удалятор может удалить и игру, и сохранения, если отметить соответствующий пункт.
|
||||
|
||||
60
docs/RELEASE_CHECKLIST.txt
Normal 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
|
|
@ -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
|
|
@ -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-профиля.
|
||||
|
||||
Честный вывод
|
||||
-------------
|
||||
Для офлайн-казино цель защиты - не сделать невозможный взлом, а поймать случайную/грубую подмену файлов,
|
||||
защитить установщик от повреждения и усложнить ручное редактирование прогресса.
|
||||
21
docs/casino_intro_preview.txt
Normal 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
|
|
@ -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
|
||||
373
docs/revolver_small_preview.txt
Normal 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
|
||||
$*$$$$$$$$$>
|
||||
$ $$ $$ $>
|
||||
$ $$$ $>
|
||||
$$$$$>>
|
||||
$ $>
|
||||
$>
|
||||
BIN
docs/variables_documentation.docx
Normal file
371
docs/Новый текстовый документ.txt
Normal 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
|
|
@ -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
|
|
@ -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
|
||||
BIN
poker.exe
Normal file
21
poker.wap
Normal 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
4
preview_casino3d.bat
Normal 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
BIN
saves_legacy/art.dat
Normal file
BIN
saves_legacy/htgerfw.dat
Normal file
BIN
saves_legacy/ludik228.dat
Normal file
397
src_graphics/platform_code.inc
Normal 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
|
||||
104
src_graphics/platform_data.inc
Normal 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
|
||||