- Bowling feel: impulse contact solver, string pinsetter cycle, in-world lengthwise return rack and visible ball return lift - Ball weights: 4/5/6/7 kg selection with equal launch work physics, momentum balance, and projected picking - Audio: dedicated MCI channels with 7 synthesized waveaudio cues (release, rolling, impacts, applause, pinsetter, return) - First-person animations: 33-frame player underarm throw/follow-through sequence (player-underarm-v2) - Visitors: 10 persistent shared cast identities with exclusive reservations, activity transitions, and chair sit/rise animations - Tests & verification: comprehensive native regression test suites and updated documentation - Synchronize binaries and update launcher hash to 536E23BED4055562BC63871826FF44FFED037923A9BE8E0F591131DB4FBD104B
65 lines
2.3 KiB
C#
65 lines
2.3 KiB
C#
using System;
|
||
using System.Diagnostics;
|
||
using System.IO;
|
||
using System.Security.Cryptography;
|
||
using System.Windows.Forms;
|
||
|
||
namespace AssemblerCasinoLauncher
|
||
{
|
||
static class Program
|
||
{
|
||
const string ExpectedPokerSha256 = "536E23BED4055562BC63871826FF44FFED037923A9BE8E0F591131DB4FBD104B";
|
||
|
||
[STAThread]
|
||
static void Main()
|
||
{
|
||
var root = AppDomain.CurrentDomain.BaseDirectory;
|
||
// The installed launcher is at the root; developer builds live in dist.
|
||
if (!File.Exists(Path.Combine(root, "bin", "poker.exe")))
|
||
{
|
||
var parent = Directory.GetParent(root.TrimEnd(Path.DirectorySeparatorChar));
|
||
if (parent != null && Directory.Exists(Path.Combine(parent.FullName, "assets")) &&
|
||
File.Exists(Path.Combine(parent.FullName, "bin", "poker.exe")))
|
||
root = parent.FullName;
|
||
}
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|