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
|
||||||