Initial Commit
This commit is contained in:
commit
b73851c471
399
.gitignore
vendored
Normal file
399
.gitignore
vendored
Normal file
|
@ -0,0 +1,399 @@
|
|||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# ASP.NET Scaffolding
|
||||
ScaffoldingReadMe.txt
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.tlog
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*.json
|
||||
coverage*.xml
|
||||
coverage*.info
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
|
||||
*.vbp
|
||||
|
||||
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
|
||||
*.dsw
|
||||
*.dsp
|
||||
|
||||
# Visual Studio 6 technical files
|
||||
*.ncb
|
||||
*.aps
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# Visual Studio History (VSHistory) files
|
||||
.vshistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
|
||||
# VS Code files for those working on multiple tools
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
*.code-workspace
|
||||
|
||||
# Local History for Visual Studio Code
|
||||
.history/
|
||||
|
||||
# Windows Installer files from build outputs
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# JetBrains Rider
|
||||
*.sln.iml
|
||||
|
11
BUILDING.TXT
Normal file
11
BUILDING.TXT
Normal file
|
@ -0,0 +1,11 @@
|
|||
Still gotta work on this, sorry!
|
||||
|
||||
For the impatient/desperate: This was built with Visual Studio 2005 on
|
||||
Windows XP. For the libXMP parts, I used an old version of CMake (3.12?)
|
||||
with a command line like the following:
|
||||
|
||||
cmake -DCMAKE_BUILD_TYPE=<Debug|Release> -DBUILD_SHARED=OFF
|
||||
-DLIBXMP_CFLAGS=</MTd|/MT> -G "NMake Makefiles" <...>
|
||||
|
||||
The official release is built with Release_ANSI for maximum
|
||||
compatibility.
|
26
Keygender32.sln
Normal file
26
Keygender32.sln
Normal file
|
@ -0,0 +1,26 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# Visual Studio 2005
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Keygender32", "Keygender32\Keygender32.vcproj", "{8E21754C-D79C-4B94-B139-BB91D252FF3F}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug_ANSI|Win32 = Debug_ANSI|Win32
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release_ANSI|Win32 = Release_ANSI|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{8E21754C-D79C-4B94-B139-BB91D252FF3F}.Debug_ANSI|Win32.ActiveCfg = Debug_ANSI|Win32
|
||||
{8E21754C-D79C-4B94-B139-BB91D252FF3F}.Debug_ANSI|Win32.Build.0 = Debug_ANSI|Win32
|
||||
{8E21754C-D79C-4B94-B139-BB91D252FF3F}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{8E21754C-D79C-4B94-B139-BB91D252FF3F}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{8E21754C-D79C-4B94-B139-BB91D252FF3F}.Release_ANSI|Win32.ActiveCfg = Release_ANSI|Win32
|
||||
{8E21754C-D79C-4B94-B139-BB91D252FF3F}.Release_ANSI|Win32.Build.0 = Release_ANSI|Win32
|
||||
{8E21754C-D79C-4B94-B139-BB91D252FF3F}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{8E21754C-D79C-4B94-B139-BB91D252FF3F}.Release|Win32.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
385
Keygender32/BGM.c
Normal file
385
Keygender32/BGM.c
Normal file
|
@ -0,0 +1,385 @@
|
|||
#include "stdafx.h"
|
||||
#define _BGM_DEFINE_
|
||||
#include "BGM.h"
|
||||
#include "resource.h"
|
||||
#include <xmp.h>
|
||||
#include "Debug.h"
|
||||
|
||||
static DWORD WINAPI MusicThreadProc(LPVOID);
|
||||
|
||||
struct _BgmState {
|
||||
CRITICAL_SECTION cs; // to sync shutdown
|
||||
LPWAVEFORMATEX pwfx; // wave-out data
|
||||
HANDLE hThread; // audio thread
|
||||
HANDLE hDone; // Are we done?
|
||||
HANDLE hPause; // Play/Pause
|
||||
BOOL bPaused; // Are we paused?
|
||||
};
|
||||
|
||||
int
|
||||
TogglePlayPause(BgmState state)
|
||||
{
|
||||
BOOL bRet;
|
||||
|
||||
if (!state) {
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return -1;
|
||||
}
|
||||
|
||||
bRet = state->bPaused;
|
||||
state->bPaused = !state->bPaused;
|
||||
|
||||
if (!SetEvent(state->hPause)) {
|
||||
state->bPaused = bRet;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return state->bPaused;
|
||||
}
|
||||
|
||||
BOOL
|
||||
PrepareMusic(HINSTANCE hInstance,
|
||||
BgmState *state)
|
||||
{
|
||||
HANDLE hHeap = GetProcessHeap();
|
||||
LPWAVEFORMATEX pwfx = NULL;
|
||||
int bIdx;
|
||||
DWORD dwIgnore;
|
||||
BOOL bFound = FALSE;
|
||||
struct _BgmState *sTmp = NULL;
|
||||
const DWORD dwTestFormats[] = {
|
||||
44100,
|
||||
22050,
|
||||
11025,
|
||||
8000,
|
||||
};
|
||||
|
||||
MusicStartFailReason = "Couldn't verify parameters";
|
||||
|
||||
if (!hInstance || !state) return FALSE;
|
||||
// TODO: do we even bother? we'll error out later
|
||||
MusicStartFailReason = "Couldn't get number of waveOut devices";
|
||||
if (!waveOutGetNumDevs()) return FALSE;
|
||||
|
||||
MusicStartFailReason = "Couldn't allocate memory";
|
||||
sTmp = HeapAlloc(hHeap,
|
||||
HEAP_ZERO_MEMORY,
|
||||
sizeof(struct _BgmState));
|
||||
if (!state) return FALSE;
|
||||
|
||||
pwfx = HeapAlloc(GetProcessHeap(),
|
||||
HEAP_ZERO_MEMORY,
|
||||
sizeof(WAVEFORMATEX));
|
||||
if (!pwfx) return FALSE;
|
||||
|
||||
pwfx->wFormatTag = WAVE_FORMAT_PCM;
|
||||
pwfx->nChannels = 2;
|
||||
pwfx->wBitsPerSample = 16;
|
||||
for (bIdx = 0; bIdx < (sizeof(dwTestFormats) / sizeof(DWORD)); bIdx++) {
|
||||
MMRESULT mRes;
|
||||
|
||||
pwfx->nSamplesPerSec = dwTestFormats[bIdx];
|
||||
pwfx->nAvgBytesPerSec = pwfx->nSamplesPerSec * pwfx->nChannels;
|
||||
pwfx->nBlockAlign = 2; // (1 channel * 16 bits) / (1 byte / 8 bits)
|
||||
pwfx->cbSize = 0;
|
||||
|
||||
mRes = waveOutOpen(NULL,
|
||||
WAVE_MAPPER,
|
||||
pwfx,
|
||||
0, 0,
|
||||
WAVE_FORMAT_QUERY);
|
||||
if (mRes == MMSYSERR_NOERROR) {
|
||||
bFound = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
MusicStartFailReason = "Couldn't find a working sound device";
|
||||
// did we find a working sound device?
|
||||
if (!bFound) {
|
||||
HeapFree(hHeap, 0, pwfx);
|
||||
HeapFree(hHeap, 0, sTmp);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sTmp->pwfx = pwfx;
|
||||
MusicStartFailReason = "Couldn't create an event?";
|
||||
// build the sync event used for ending the thread
|
||||
sTmp->hDone = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if (!sTmp->hDone) {
|
||||
HeapFree(hHeap, 0, pwfx);
|
||||
HeapFree(hHeap, 0, sTmp);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
MusicStartFailReason = "Couldn't create another event???";
|
||||
sTmp->hPause = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if (!sTmp->hDone) {
|
||||
HeapFree(hHeap, 0, pwfx);
|
||||
HeapFree(hHeap, 0, sTmp);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
MusicStartFailReason = "Couldn't create the music thread????????";
|
||||
sTmp->hThread = CreateThread(NULL,
|
||||
0,
|
||||
MusicThreadProc,
|
||||
sTmp,
|
||||
0,
|
||||
&dwIgnore);
|
||||
|
||||
if (!sTmp->hThread) {
|
||||
HeapFree(hHeap, 0, pwfx);
|
||||
HeapFree(hHeap, 0, sTmp);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
*state = sTmp;
|
||||
|
||||
MusicStartFailReason = "Everything's fine actually ??????????????";
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
struct WaveBuf {
|
||||
WAVEHDR *hdr;
|
||||
struct WaveBuf *prev;
|
||||
struct WaveBuf *next;
|
||||
};
|
||||
|
||||
static DWORD WINAPI
|
||||
MusicThreadProc(LPVOID lpParam)
|
||||
{
|
||||
BgmState state = (BgmState)lpParam;
|
||||
xmp_context xCtx = NULL;
|
||||
HWAVEOUT hwOut = NULL; // audio out dev
|
||||
LPVOID pModData = NULL; // module bytes
|
||||
DWORD dwErr = ERROR_SUCCESS, // return code
|
||||
dwModSize; // rsrc byte len
|
||||
MMRESULT mRes; // waveOut* error
|
||||
int iRes; // xmplib error
|
||||
HANDLE hMmEvent = NULL;
|
||||
|
||||
// Multi-buffer drifting
|
||||
#define BUF_COUNT 3
|
||||
LPBYTE lpBufs[BUF_COUNT] = {0};
|
||||
WAVEHDR wHdrs[BUF_COUNT] = {0};
|
||||
const DWORD dwBufSize = XMP_MAX_FRAMESIZE;
|
||||
|
||||
if (state == NULL) return ERROR_INVALID_PARAMETER;
|
||||
|
||||
hMmEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if (!hMmEvent) return GetLastError();
|
||||
|
||||
{
|
||||
// Generate the buffers
|
||||
int i;
|
||||
|
||||
for (i = 0; i < BUF_COUNT; i++) {
|
||||
lpBufs[i] = HeapAlloc(GetProcessHeap(),
|
||||
0,
|
||||
dwBufSize);
|
||||
if (lpBufs[i] == NULL) {
|
||||
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
||||
goto threadDone;
|
||||
}
|
||||
wHdrs[i].lpData = lpBufs[i];
|
||||
wHdrs[i].dwBufferLength = dwBufSize;
|
||||
}
|
||||
}
|
||||
|
||||
mRes = waveOutOpen(&hwOut,
|
||||
WAVE_MAPPER,
|
||||
state->pwfx,
|
||||
(DWORD_PTR)hMmEvent,
|
||||
0,
|
||||
CALLBACK_EVENT);
|
||||
if (mRes) return ERROR_INVALID_HANDLE;
|
||||
|
||||
xCtx = xmp_create_context();
|
||||
if (!xCtx) {
|
||||
dwErr = ERROR_BROKEN_PIPE;
|
||||
goto threadDone;
|
||||
}
|
||||
|
||||
{
|
||||
// Find and load the resource. We supposedly don't
|
||||
// need to free our handles on Win32, so handle it in
|
||||
// its own block, I guess?
|
||||
HRSRC hRsrc = FindResource(NULL,
|
||||
MAKEINTRESOURCE(IDR_BGM),
|
||||
_T("MUSIC"));
|
||||
HGLOBAL hModFile = NULL;
|
||||
if (hRsrc) {
|
||||
hModFile = LoadResource(NULL, hRsrc);
|
||||
}
|
||||
|
||||
if (!hModFile) {
|
||||
dwErr = GetLastError();
|
||||
goto threadDone;
|
||||
}
|
||||
|
||||
dwModSize = SizeofResource(NULL, hRsrc);
|
||||
if (!dwModSize) {
|
||||
dwErr = GetLastError();
|
||||
goto threadDone;
|
||||
}
|
||||
|
||||
pModData = LockResource(hModFile);
|
||||
if (!pModData) {
|
||||
dwErr = GetLastError();
|
||||
goto threadDone;
|
||||
}
|
||||
}
|
||||
|
||||
if ((iRes = xmp_load_module_from_memory(xCtx,
|
||||
pModData,
|
||||
dwModSize)) != 0) {
|
||||
dwErr = ERROR_INVALID_DATA;
|
||||
goto threadDone;
|
||||
}
|
||||
|
||||
DebugPrintf("Loading mod at %d Hz\n", state->pwfx->nSamplesPerSec);
|
||||
xmp_start_player(xCtx,
|
||||
state->pwfx->nSamplesPerSec,
|
||||
0);
|
||||
|
||||
// Player frame loop!
|
||||
{
|
||||
int iErrCount = 0, // max 5 consecutive errs before
|
||||
// we give up
|
||||
iCurBuf = 0; // Current buffer
|
||||
|
||||
BOOL bDone = FALSE;
|
||||
const HANDLE hEvents[] = {
|
||||
hMmEvent,
|
||||
state->hDone,
|
||||
state->hPause,
|
||||
};
|
||||
|
||||
#if _DEBUG
|
||||
struct xmp_module_info xmi = {0};
|
||||
|
||||
xmp_get_module_info(xCtx, &xmi);
|
||||
DebugPrintf("\n== Mod info ==\n"
|
||||
_T("Speed: %d\n")
|
||||
_T("BPM: %d\n")
|
||||
_T("Fmt: %s\n")
|
||||
_T("== End Mod info ==\n\n"),
|
||||
xmi.mod->spd,
|
||||
xmi.mod->bpm,
|
||||
xmi.mod->type);
|
||||
#endif /* _DEBUG */
|
||||
|
||||
while (iErrCount < 5 && !bDone) {
|
||||
struct xmp_frame_info xfi = {0};
|
||||
|
||||
// Reset the WAVEHDR
|
||||
wHdrs[iCurBuf].dwFlags = 0;
|
||||
wHdrs[iCurBuf].lpData = lpBufs[iCurBuf];
|
||||
|
||||
// Pull the current audio frame
|
||||
if (xmp_play_frame(xCtx)) {
|
||||
dwErr = ERROR_READ_FAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
xmp_get_frame_info(xCtx, &xfi);
|
||||
|
||||
memcpy(wHdrs[iCurBuf].lpData, xfi.buffer, xfi.buffer_size);
|
||||
wHdrs[iCurBuf].dwBufferLength = xfi.buffer_size;
|
||||
|
||||
waveOutPrepareHeader(hwOut,
|
||||
&wHdrs[iCurBuf],
|
||||
sizeof(WAVEHDR));
|
||||
|
||||
// Write it to the audio device
|
||||
if (waveOutWrite(hwOut, &wHdrs[iCurBuf], sizeof(WAVEHDR))) {
|
||||
dwErr = ERROR_WRITE_FAULT;
|
||||
iErrCount++;
|
||||
} else {
|
||||
iErrCount = dwErr = 0;
|
||||
|
||||
// Set up the next buffer, or wait for it to complete
|
||||
iCurBuf = (iCurBuf + 1) % BUF_COUNT;
|
||||
while (((wHdrs[iCurBuf].dwFlags & WHDR_PREPARED) == WHDR_PREPARED) &&
|
||||
((wHdrs[iCurBuf].dwFlags & WHDR_DONE) != WHDR_DONE)) {
|
||||
// Use this opportunity to listen for every event
|
||||
DWORD dwRes = WaitForMultipleObjects(
|
||||
sizeof(hEvents) / sizeof(HANDLE),
|
||||
hEvents,
|
||||
FALSE,
|
||||
1000);
|
||||
|
||||
if (dwRes == WAIT_FAILED) {
|
||||
HRESULT hrErr = GetLastError();
|
||||
DebugPrintf("Agh, got error %08x\n", hrErr);
|
||||
iErrCount++;
|
||||
} else if (dwRes == WAIT_OBJECT_0) {
|
||||
// TODO: should auto-reset, right?
|
||||
ResetEvent(hMmEvent);
|
||||
} else if (dwRes == WAIT_OBJECT_0 + 1) {
|
||||
// state->hDone set, clean up after we're done
|
||||
bDone = TRUE;
|
||||
} else if (dwRes == WAIT_OBJECT_0 + 2) {
|
||||
// state->hPause set, pause or unpause
|
||||
if (state->bPaused) {
|
||||
waveOutPause(hwOut);
|
||||
} else {
|
||||
waveOutRestart(hwOut);
|
||||
}
|
||||
}
|
||||
}
|
||||
waveOutUnprepareHeader(hwOut,
|
||||
&wHdrs[iCurBuf],
|
||||
sizeof(WAVEHDR));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
threadDone:
|
||||
if (xCtx) {
|
||||
xmp_end_player(xCtx);
|
||||
xmp_release_module(xCtx);
|
||||
xmp_free_context(xCtx);
|
||||
}
|
||||
|
||||
if (hwOut) {
|
||||
waveOutReset(hwOut);
|
||||
waveOutClose(hwOut);
|
||||
}
|
||||
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < BUF_COUNT; i++) {
|
||||
if (lpBufs[i]) {
|
||||
if (wHdrs[i].dwFlags & WHDR_PREPARED) {
|
||||
waveOutUnprepareHeader(hwOut,
|
||||
&wHdrs[i],
|
||||
sizeof(WAVEHDR));
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, lpBufs[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ExitThread(dwErr);
|
||||
return dwErr;
|
||||
}
|
||||
|
||||
void
|
||||
EndMusic(BgmState state)
|
||||
{
|
||||
if (!state) return;
|
||||
|
||||
SetEvent(state->hDone);
|
||||
// Wait for thread to finish, to avoid an audio driver crash
|
||||
WaitForSingleObject(state->hThread, INFINITE);
|
||||
|
||||
// Clean up
|
||||
HeapFree(GetProcessHeap(), 0, state->pwfx);
|
||||
CloseHandle(state->hDone);
|
||||
CloseHandle(state->hPause);
|
||||
HeapFree(GetProcessHeap(), 0, state);
|
||||
|
||||
return;
|
||||
}
|
20
Keygender32/BGM.h
Normal file
20
Keygender32/BGM.h
Normal file
|
@ -0,0 +1,20 @@
|
|||
#pragma once
|
||||
|
||||
struct _BgmState;
|
||||
typedef struct _BgmState *BgmState;
|
||||
|
||||
// Begins playing music. Returns FALSE on error, or TRUE if the music
|
||||
// thread was able to start.
|
||||
//
|
||||
// Note: This function doesn't test for whether the music was able to
|
||||
// start! There's no way to test for that at the moment.
|
||||
BOOL PrepareMusic(HINSTANCE, BgmState *);
|
||||
|
||||
// Ends the music thread.
|
||||
void EndMusic(BgmState);
|
||||
|
||||
// Toggles between play and pause. Returns -1 on error, or the
|
||||
// current state on success: 0 is playing, 1 is paused.
|
||||
int TogglePlayPause(BgmState state);
|
||||
|
||||
char *MusicStartFailReason;
|
21
Keygender32/Debug.c
Normal file
21
Keygender32/Debug.c
Normal file
|
@ -0,0 +1,21 @@
|
|||
#include "stdafx.h"
|
||||
#include "Debug.h"
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef _DEBUG
|
||||
void
|
||||
_DebugPrintf(LPCTSTR fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
TCHAR szBuf[256] = {0};
|
||||
|
||||
va_start(args, fmt);
|
||||
|
||||
if (SUCCEEDED(_vsntprintf_s(szBuf, 256, 255, fmt, args))) {
|
||||
OutputDebugString(szBuf);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
#endif
|
9
Keygender32/Debug.h
Normal file
9
Keygender32/Debug.h
Normal file
|
@ -0,0 +1,9 @@
|
|||
#pragma once
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define _AsStr(x) #x
|
||||
#define DebugPrintf(x, ...) _DebugPrintf(_T(__FUNCTION__) _T(": ") _T(x), __VA_ARGS__)
|
||||
void _DebugPrintf(LPCTSTR fmt, ...);
|
||||
#else
|
||||
#define DebugPrintf(x, ...)
|
||||
#endif
|
391
Keygender32/Dialog.c
Normal file
391
Keygender32/Dialog.c
Normal file
|
@ -0,0 +1,391 @@
|
|||
#include "stdafx.h"
|
||||
|
||||
#include "Nfo.h"
|
||||
#include "BGM.h"
|
||||
#include "Debug.h"
|
||||
#include "Dialog.h"
|
||||
#include "Generator.h"
|
||||
#include "Nfo.h"
|
||||
#include "resource.h"
|
||||
#include "Starfield.h"
|
||||
|
||||
#include <shlwapi.h>
|
||||
|
||||
|
||||
#define TIMER_SBANIM 0x1
|
||||
#define PAUSE_TEXT _T("Pause")
|
||||
#define PLAY_TEXT _T("Play")
|
||||
#define WINE_USER_TEXT _T("Hey Wine user! Press F1 for more info.")
|
||||
|
||||
static LPCTSTR PLACEHOLDER_TEXT = _T("they/them, she/her, he/him, etc.");
|
||||
static LPCTSTR szStatusBarText = _T("Now Playing: Space Debris - Captain");
|
||||
|
||||
static BOOL bEditFocused = FALSE;
|
||||
static WNDPROC OldEditWndProc;
|
||||
|
||||
LPCTSTR szBannedWords[] = {
|
||||
_T("helicopter"),
|
||||
};
|
||||
|
||||
static BOOL
|
||||
UserIsRunningWine(void)
|
||||
{
|
||||
HMODULE hNtdll = GetModuleHandle(_T("ntdll.dll"));
|
||||
if (hNtdll) {
|
||||
LPVOID lpWineGetVersion = GetProcAddress(hNtdll, _T("wine_get_version"));
|
||||
return (lpWineGetVersion != NULL);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
static LRESULT CALLBACK
|
||||
EditWndProc(HWND hWnd,
|
||||
UINT uMsg,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
/* Oho, this one feels *cursed*.
|
||||
*
|
||||
* Here's the general theory: Windows XP provides EM_SETCUEBANNER,
|
||||
* meaning Windows 2000/Me and below don't have placeholder text.
|
||||
* Additionally, if your Windows XP is set to a CJK locale, no
|
||||
* placeholder text for you.
|
||||
*
|
||||
* So, let's work around it by implementing our own placeholder!
|
||||
* What could go wrong?
|
||||
*/
|
||||
switch (uMsg) {
|
||||
case WM_PAINT:
|
||||
// Let the original proc paint as needed
|
||||
CallWindowProc(OldEditWndProc, hWnd, uMsg, wParam, lParam);
|
||||
{
|
||||
HDC hDC = GetDC(hWnd);
|
||||
COLORREF crNormal;
|
||||
TCHAR szInput[8] = {7,0};
|
||||
// I don't know if it's okay to just call a WndProc like
|
||||
// this, but they won't know, right?
|
||||
LRESULT lResult = CallWindowProc(
|
||||
OldEditWndProc,
|
||||
hWnd,
|
||||
EM_GETLINE,
|
||||
0,
|
||||
(LPARAM)szInput);
|
||||
|
||||
if (!lResult && !bEditFocused) {
|
||||
RECT rcArea = {0};
|
||||
// Get the control font
|
||||
HFONT hFont = (HFONT)CallWindowProc(
|
||||
OldEditWndProc,
|
||||
hWnd,
|
||||
WM_GETFONT,
|
||||
0,
|
||||
0),
|
||||
hOldFont;
|
||||
hOldFont = SelectObject(hDC, hFont);
|
||||
|
||||
// Get the selection rect, so the placeholder text lines up
|
||||
CallWindowProc(
|
||||
OldEditWndProc,
|
||||
hWnd,
|
||||
EM_GETRECT,
|
||||
0,
|
||||
(LPARAM)&rcArea);
|
||||
|
||||
// TODO: is GRAYTEXT the correct color?
|
||||
crNormal = SetTextColor(hDC,
|
||||
GetSysColor(COLOR_GRAYTEXT));
|
||||
DrawText(hDC,
|
||||
PLACEHOLDER_TEXT,
|
||||
(int)_tcslen(PLACEHOLDER_TEXT),
|
||||
&rcArea,
|
||||
DT_VCENTER | DT_SINGLELINE);
|
||||
|
||||
SelectObject(hDC, hOldFont);
|
||||
SetTextColor(hDC, crNormal);
|
||||
}
|
||||
|
||||
DeleteDC(hDC);
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return CallWindowProc(OldEditWndProc, hWnd, uMsg, wParam, lParam);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT_PTR CALLBACK
|
||||
MainDlgProc(HWND hDlg,
|
||||
UINT uMsg,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
static int iParts[2];
|
||||
static HCURSOR hPointer = NULL;
|
||||
static BgmState bgmState = NULL;
|
||||
static LPTSTR szToggleText = NULL;
|
||||
static RECT rcDialog = {0};
|
||||
static COLORREF crLink = 0;
|
||||
TCHAR szInput[65] = {0};
|
||||
static OSVERSIONINFO osver = {sizeof(OSVERSIONINFO),0};
|
||||
|
||||
switch (uMsg) {
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
// At least *try* to support Windows <2000
|
||||
if (GetVersionEx(&osver)) {
|
||||
if (osver.dwMajorVersion >= 5) {
|
||||
// COLOR_HOTLIGHT is only supported in 2k+
|
||||
crLink = GetSysColor(26);
|
||||
} else {
|
||||
HWND hStarfield = GetDlgItem(
|
||||
hDlg,
|
||||
IDC_STARFIELD);
|
||||
// Borrowing the link color from HTML5 spec
|
||||
crLink = RGB(0, 0, 0xee);
|
||||
// Win98 also seems grumpy about the amount of GDI
|
||||
// rendering, so slow it down a bit
|
||||
SendMessage(hStarfield,
|
||||
WMU_FRAMERATE,
|
||||
30,
|
||||
0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
// Wine doesn't always (ever?) show the [?] button. Give the
|
||||
// user another way to access it.
|
||||
if (UserIsRunningWine()) {
|
||||
szStatusBarText = WINE_USER_TEXT;
|
||||
}
|
||||
}
|
||||
|
||||
// initialize static vars
|
||||
hPointer = LoadCursor(NULL, MAKEINTRESOURCE(32649));
|
||||
bgmState = (BgmState)lParam;
|
||||
szToggleText = PAUSE_TEXT;
|
||||
OldEditWndProc = (WNDPROC)SetWindowLong(
|
||||
GetDlgItem(hDlg, IDC_PNTYPE),
|
||||
GWL_WNDPROC,
|
||||
(LONG)EditWndProc);
|
||||
|
||||
{
|
||||
// Set up status bar parts
|
||||
LONG lDlgWidth = LOWORD(GetDialogBaseUnits()),
|
||||
lRightWidth = (lDlgWidth * 6);
|
||||
|
||||
GetClientRect(hDlg, &rcDialog);
|
||||
iParts[0] = rcDialog.right - lRightWidth;
|
||||
iParts[1] = -1;
|
||||
|
||||
SendDlgItemMessage(hDlg,
|
||||
IDC_STATUSBAR,
|
||||
SB_SETPARTS,
|
||||
2,
|
||||
(LPARAM)iParts);
|
||||
}
|
||||
|
||||
SendDlgItemMessage(hDlg,
|
||||
IDC_STATUSBAR,
|
||||
SB_SETTEXT,
|
||||
SBT_OWNERDRAW | 0,
|
||||
0);
|
||||
SendDlgItemMessage(hDlg,
|
||||
IDC_STATUSBAR,
|
||||
SB_SETTEXT,
|
||||
SBT_OWNERDRAW | 1,
|
||||
0);
|
||||
break;
|
||||
|
||||
case WM_SYSCOMMAND:
|
||||
if (wParam == SC_CONTEXTHELP) {
|
||||
DialogBox(
|
||||
GetModuleHandle(NULL),
|
||||
MAKEINTRESOURCE(IDD_ABOUT),
|
||||
hDlg,
|
||||
NfoDlgProc);
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_HELP:
|
||||
DialogBox(
|
||||
GetModuleHandle(NULL),
|
||||
MAKEINTRESOURCE(IDD_ABOUT),
|
||||
hDlg,
|
||||
NfoDlgProc);
|
||||
return TRUE;
|
||||
|
||||
case WM_DRAWITEM:
|
||||
if (wParam == IDC_STATUSBAR) {
|
||||
LPDRAWITEMSTRUCT lpDraw = (LPDRAWITEMSTRUCT)lParam;
|
||||
HFONT hFont = (HFONT)SendMessage(
|
||||
lpDraw->hwndItem,
|
||||
WM_GETFONT,
|
||||
(WPARAM)0,
|
||||
(LPARAM)0);
|
||||
int iOldBkMode = SetBkMode(lpDraw->hDC, TRANSPARENT);
|
||||
|
||||
if (lpDraw->itemID == 0) {
|
||||
// Draw the status bar text
|
||||
DrawText(
|
||||
lpDraw->hDC,
|
||||
szStatusBarText,
|
||||
-1,
|
||||
&lpDraw->rcItem,
|
||||
DT_VCENTER | DT_SINGLELINE);
|
||||
|
||||
} else if (lpDraw->itemID == 1) {
|
||||
// Draw the Play/Pause "link"
|
||||
HFONT hLinkFont, hOldFont;
|
||||
LOGFONT lf;
|
||||
COLORREF crOldColor;
|
||||
|
||||
GetObject(hFont, sizeof(lf), &lf);
|
||||
lf.lfUnderline = TRUE;
|
||||
|
||||
hLinkFont = CreateFontIndirect(&lf);
|
||||
hOldFont = SelectObject(lpDraw->hDC, hLinkFont);
|
||||
|
||||
crOldColor = SetTextColor(lpDraw->hDC, crLink);
|
||||
|
||||
DrawText(lpDraw->hDC,
|
||||
szToggleText,
|
||||
-1,
|
||||
&lpDraw->rcItem,
|
||||
DT_CENTER | DT_VCENTER | DT_SINGLELINE);
|
||||
|
||||
// put everything back how we found it
|
||||
SelectObject(lpDraw->hDC, hOldFont);
|
||||
SetTextColor(lpDraw->hDC, crOldColor);
|
||||
|
||||
DeleteObject(hLinkFont);
|
||||
}
|
||||
SetBkMode(lpDraw->hDC, iOldBkMode);
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_NOTIFY:
|
||||
if (wParam == IDC_STATUSBAR) {
|
||||
LPNMMOUSE lpnm = (LPNMMOUSE)lParam;
|
||||
if (lpnm->hdr.code == NM_CLICK &&
|
||||
lpnm->dwItemSpec == 1) {
|
||||
// Play/Pause "link"
|
||||
switch (TogglePlayPause(bgmState)) {
|
||||
case 0:
|
||||
szToggleText = PAUSE_TEXT;
|
||||
break;
|
||||
case 1:
|
||||
szToggleText = PLAY_TEXT;
|
||||
break;
|
||||
}
|
||||
|
||||
SendDlgItemMessage(hDlg,
|
||||
IDC_STATUSBAR,
|
||||
SB_SETTEXT,
|
||||
SBT_OWNERDRAW | 1,
|
||||
0);
|
||||
|
||||
// Make the border dynamic, like the original
|
||||
iParts[0] = (rcDialog.right - rcDialog.left) -
|
||||
(LOWORD(GetDialogBaseUnits()) * (int)_tcslen(szToggleText));
|
||||
SendDlgItemMessage(hDlg,
|
||||
IDC_STATUSBAR,
|
||||
SB_SETPARTS,
|
||||
2,
|
||||
(LPARAM)iParts);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_SETCURSOR:
|
||||
if ((HWND)wParam == GetDlgItem(hDlg, IDC_STATUSBAR)) {
|
||||
// Make the Play/Pause link act like a link
|
||||
POINT ptCur;
|
||||
GetCursorPos(&ptCur);
|
||||
if (ScreenToClient(hDlg, &ptCur) &&
|
||||
ptCur.x >= iParts[0]) {
|
||||
SetCursor(hPointer);
|
||||
SetWindowLong(hDlg, DWL_MSGRESULT, TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
if (LOWORD(wParam) == IDOK) {
|
||||
// Generate button pressed
|
||||
LRESULT lResult;
|
||||
TCHAR szKeyOut[19] = {0};
|
||||
szInput[0] = 64;
|
||||
lResult = SendDlgItemMessage(
|
||||
hDlg,
|
||||
IDC_PNTYPE,
|
||||
EM_GETLINE,
|
||||
0,
|
||||
(LPARAM)szInput);
|
||||
if (!lResult) break;
|
||||
|
||||
if (GenerateKey(szInput, szKeyOut)) {
|
||||
SendDlgItemMessage(hDlg,
|
||||
IDC_KEYDATA,
|
||||
WM_SETTEXT,
|
||||
0,
|
||||
(LPARAM)szKeyOut);
|
||||
}
|
||||
} else if (LOWORD(wParam) == IDC_PNTYPE) {
|
||||
// Pro Nouns edition edit control
|
||||
if (HIWORD(wParam) == EN_UPDATE) {
|
||||
int i;
|
||||
BOOL bEnable = TRUE;
|
||||
LRESULT lResult;
|
||||
szInput[0] = 64;
|
||||
lResult = SendDlgItemMessage(
|
||||
hDlg,
|
||||
IDC_PNTYPE,
|
||||
EM_GETLINE,
|
||||
0,
|
||||
(LPARAM)szInput);
|
||||
if (!lResult) {
|
||||
bEnable = FALSE;
|
||||
} else {
|
||||
// Handle word validation
|
||||
for (i = 0; i < (sizeof(szBannedWords) / sizeof(szBannedWords[0])); i++) {
|
||||
int j, x = 0, iWordLen = (int)_tcslen(szBannedWords[i]);
|
||||
|
||||
for (j = 0; j < (int)_tcslen(szInput); j++) {
|
||||
if (iswalpha(szInput[j]) && (towlower(szInput[j]) == szBannedWords[i][x])) {
|
||||
if (++x >= iWordLen) {
|
||||
bEnable = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EnableWindow(GetDlgItem(hDlg, IDOK), bEnable);
|
||||
} else if (HIWORD(wParam) == EN_SETFOCUS) {
|
||||
// edit control focused, don't show the placeholder
|
||||
bEditFocused = TRUE;
|
||||
} else if (HIWORD(wParam) == EN_KILLFOCUS) {
|
||||
bEditFocused = FALSE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_CLOSE:
|
||||
EndDialog(hDlg, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
3
Keygender32/Dialog.h
Normal file
3
Keygender32/Dialog.h
Normal file
|
@ -0,0 +1,3 @@
|
|||
#pragma once
|
||||
|
||||
INT_PTR CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
116
Keygender32/Generator.c
Normal file
116
Keygender32/Generator.c
Normal file
|
@ -0,0 +1,116 @@
|
|||
#include "stdafx.h"
|
||||
#include "Random.h"
|
||||
#include "Generator.h"
|
||||
#include <Time.h>
|
||||
|
||||
static const TCHAR szBaseChars[] = _T("BCDFGHJKMPQRTVWXY346789");
|
||||
static const BYTE base = (sizeof(szBaseChars) / sizeof(TCHAR)) - 1;
|
||||
static const UINT64 uPrivKey[] = { 0x0a0d212073, 0x7468676972, 0x20736e617274 };
|
||||
|
||||
// Create an Adler32 checksum according to the provided szInput.
|
||||
static DWORD
|
||||
ck_adler32(LPCTSTR szInput,
|
||||
DWORD dwLen)
|
||||
{
|
||||
DWORD a = 1,
|
||||
b = 0,
|
||||
i;
|
||||
|
||||
for (i = 0; i < dwLen; i++) {
|
||||
// XXX: This is a really naive way to "convert" to ANSI
|
||||
a += szInput[i] & 0xff;
|
||||
b += a;
|
||||
}
|
||||
|
||||
a %= 65521;
|
||||
b %= 65521;
|
||||
|
||||
return ((b << 16) | a);
|
||||
}
|
||||
|
||||
// Encode a number as a "sanitized Microsoft" base-23 string
|
||||
static BOOL
|
||||
EncodeNumber(LPVOID lpIn,
|
||||
DWORD dwSize,
|
||||
LPTSTR szOut)
|
||||
{
|
||||
UINT64 uNum = 0;
|
||||
TCHAR *ptr = szOut + 5;
|
||||
|
||||
if (!lpIn || !szOut) return FALSE;
|
||||
|
||||
if (dwSize > 8) return FALSE;
|
||||
|
||||
// XXX: Win32 is always little endian, so should be fine?
|
||||
CopyMemory(&uNum, lpIn, dwSize);
|
||||
|
||||
*(ptr + 1) = 0;
|
||||
do {
|
||||
*ptr-- = szBaseChars[uNum % base];
|
||||
uNum /= base;
|
||||
} while (ptr >= szOut);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
GenerateKey(LPCTSTR szInput,
|
||||
LPTSTR szOut)
|
||||
{
|
||||
/* In the original implementation, this just generated random
|
||||
* "digits." I went too far with the bit, so now the "keys" have
|
||||
* some procedural generation! They're still structured similarly:
|
||||
*
|
||||
* XXXXX-YYYYY-ZZZZZ
|
||||
*
|
||||
* XXXXX is a random DWORD (shifted right 2 bytes to look more
|
||||
* random) and XORed by the first private key QWORD.
|
||||
* YYYYY is an Adler32 checksum of the user input, XORed by the
|
||||
* second private key QWORD.
|
||||
* Finally, ZZZZZ is the Adler32 checksum of "XXXXX-YYYYY", XORed
|
||||
* by the third private key QWORD.
|
||||
*/
|
||||
static BOOL bSeeded = FALSE;
|
||||
UINT64 uRandom;
|
||||
UINT64 dwChecksum, dwFinalSum;
|
||||
LPTSTR szPtr = szOut;
|
||||
|
||||
|
||||
if (!szInput || !szOut) return FALSE;
|
||||
|
||||
if (!bSeeded) {
|
||||
xorsrand((unsigned)time(NULL));
|
||||
bSeeded = TRUE;
|
||||
}
|
||||
|
||||
// generate segment one
|
||||
uRandom = ((xorrand() & 0xffff) << 16) ^ uPrivKey[0];
|
||||
if (!EncodeNumber(&uRandom, sizeof(UINT64), szPtr)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
szPtr += 5;
|
||||
|
||||
*szPtr++ = _T('-');
|
||||
|
||||
// ... and segment 2
|
||||
dwChecksum = ck_adler32(szInput, (DWORD)_tcslen(szInput)) ^
|
||||
uPrivKey[1];
|
||||
if (!EncodeNumber(&dwChecksum, sizeof(DWORD), szPtr)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
szPtr += 5;
|
||||
*szPtr++ = _T('-');
|
||||
|
||||
// ... finally, segment 3
|
||||
dwFinalSum = ck_adler32(szOut, 11) ^ uPrivKey[2];
|
||||
if (!EncodeNumber(&dwFinalSum, sizeof(DWORD), szPtr)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
szPtr += 5;
|
||||
*szPtr = 0;
|
||||
|
||||
return TRUE;
|
||||
}
|
6
Keygender32/Generator.h
Normal file
6
Keygender32/Generator.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
// Generate a key using szInput, feeding the output into szOut.
|
||||
//
|
||||
// NOTE: szOut must be at least 18 TCHARs!
|
||||
BOOL GenerateKey(LPCTSTR szInput, LPTSTR szOut);
|
43
Keygender32/Keygender32.c
Normal file
43
Keygender32/Keygender32.c
Normal file
|
@ -0,0 +1,43 @@
|
|||
// Keygender32.cpp : Defines the entry point for the application.
|
||||
//
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "Keygender32.h"
|
||||
#include <locale.h>
|
||||
|
||||
#define MAX_LOADSTRING 100
|
||||
|
||||
int APIENTRY _tWinMain(HINSTANCE hInstance,
|
||||
HINSTANCE hPrevInstance,
|
||||
LPTSTR lpCmdLine,
|
||||
int nCmdShow)
|
||||
{
|
||||
BgmState state = NULL;
|
||||
|
||||
UNREFERENCED_PARAMETER(hPrevInstance);
|
||||
UNREFERENCED_PARAMETER(lpCmdLine);
|
||||
|
||||
setlocale( LC_ALL, ".437" );
|
||||
|
||||
InitCommonControls();
|
||||
InitStarfieldControl(hInstance);
|
||||
|
||||
if (!PrepareMusic(hInstance, &state)) {
|
||||
MessageBoxA(
|
||||
NULL,
|
||||
MusicStartFailReason,
|
||||
"Music play failed ;_;",
|
||||
MB_OK | MB_ICONERROR);
|
||||
}
|
||||
|
||||
DialogBoxParam(hInstance,
|
||||
MAKEINTRESOURCE(IDD_MAIN),
|
||||
NULL,
|
||||
MainDlgProc,
|
||||
(LPARAM)state);
|
||||
|
||||
EndMusic(state);
|
||||
DeinitStarfieldControl(hInstance);
|
||||
|
||||
return 0;
|
||||
}
|
7
Keygender32/Keygender32.h
Normal file
7
Keygender32/Keygender32.h
Normal file
|
@ -0,0 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "resource.h"
|
||||
#include "Starfield.h"
|
||||
#include "Dialog.h"
|
||||
#include "BGM.h"
|
||||
#include "Debug.h"
|
217
Keygender32/Keygender32.rc
Normal file
217
Keygender32/Keygender32.rc
Normal file
|
@ -0,0 +1,217 @@
|
|||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#define APSTUDIO_HIDDEN_SYMBOLS
|
||||
#include "windows.h"
|
||||
#undef APSTUDIO_HIDDEN_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
|
||||
"#include ""windows.h""\r\n"
|
||||
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_MAIN DIALOGEX 0, 0, 227, 135
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_CONTEXTHELP
|
||||
CAPTION "Pro Nouns Keygenderator"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
CONTROL "",IDC_STARFIELD,"Starfield",WS_TABSTOP,7,7,213,51
|
||||
LTEXT "Which version of Pro Nouns do you want to use?",IDC_STATIC,7,65,156,10
|
||||
EDITTEXT IDC_PNTYPE,7,81,213,14,ES_AUTOHSCROLL
|
||||
PUSHBUTTON "Generate Key",IDOK,155,99,65,14,WS_DISABLED
|
||||
EDITTEXT IDC_KEYDATA,54,99,94,14,ES_AUTOHSCROLL | ES_READONLY
|
||||
LTEXT "License Key:",IDC_STATIC,7,99,41,14,SS_CENTERIMAGE
|
||||
CONTROL "",IDC_STATUSBAR,"msctls_statusbar32",WS_TABSTOP,7,114,50,14
|
||||
END
|
||||
|
||||
IDD_ABOUT DIALOGEX 0, 0, 235, 177
|
||||
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION
|
||||
EXSTYLE WS_EX_TOPMOST | WS_EX_TOOLWINDOW
|
||||
CAPTION "About"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x0
|
||||
BEGIN
|
||||
GROUPBOX "Credits",IDC_STATIC,7,7,221,98,BS_CENTER
|
||||
LTEXT "This is a port of the JavaScript version, by Luna (https://tiredand.gay).",IDC_STATIC,13,16,209,18
|
||||
LTEXT "This software uses libXMP, which is Copyright c 1996-2023 Claudio Matsuoka and Hipolito Carraro Jr. See the NFO for more info.",IDC_STATIC,13,40,209,25
|
||||
LTEXT "Background music is ""Space Debris"" by Captain.",IDC_STATIC,13,71,209,8
|
||||
PUSHBUTTON "Original Keygender",IDC_OGLINK,148,85,74,14
|
||||
GROUPBOX "Misc Greets",IDC_STATIC,7,111,221,40,BS_CENTER
|
||||
CTEXT "lifning - iliana - Hell Labs",IDC_STATIC,13,120,209,25,SS_CENTERIMAGE
|
||||
PUSHBUTTON "Close",IDCLOSE,178,156,50,14
|
||||
PUSHBUTTON "Hell Labs @ Cohost",IDC_HLSITE,103,156,70,14
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO
|
||||
BEGIN
|
||||
IDD_MAIN, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 220
|
||||
VERTGUIDE, 48
|
||||
VERTGUIDE, 54
|
||||
VERTGUIDE, 148
|
||||
VERTGUIDE, 155
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 128
|
||||
HORZGUIDE, 58
|
||||
HORZGUIDE, 65
|
||||
HORZGUIDE, 75
|
||||
HORZGUIDE, 81
|
||||
HORZGUIDE, 95
|
||||
HORZGUIDE, 99
|
||||
HORZGUIDE, 113
|
||||
END
|
||||
|
||||
IDD_ABOUT, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 228
|
||||
VERTGUIDE, 13
|
||||
VERTGUIDE, 142
|
||||
VERTGUIDE, 148
|
||||
VERTGUIDE, 172
|
||||
VERTGUIDE, 178
|
||||
VERTGUIDE, 222
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 170
|
||||
HORZGUIDE, 16
|
||||
HORZGUIDE, 34
|
||||
HORZGUIDE, 40
|
||||
HORZGUIDE, 65
|
||||
HORZGUIDE, 71
|
||||
HORZGUIDE, 79
|
||||
HORZGUIDE, 85
|
||||
HORZGUIDE, 99
|
||||
HORZGUIDE, 105
|
||||
HORZGUIDE, 111
|
||||
HORZGUIDE, 120
|
||||
HORZGUIDE, 145
|
||||
HORZGUIDE, 151
|
||||
HORZGUIDE, 157
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// MUSIC
|
||||
//
|
||||
|
||||
IDR_BGM MUSIC "space_debris.mod"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,0,0,0
|
||||
PRODUCTVERSION 1,0,0,0
|
||||
FILEFLAGSMASK 0x17L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x4L
|
||||
FILETYPE 0x1L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Hell Labs"
|
||||
VALUE "FileDescription", "Pro Nouns Keygenderator"
|
||||
VALUE "FileVersion", "1, 0, 0, 0"
|
||||
VALUE "InternalName", "Keygender"
|
||||
VALUE "OriginalFilename", "Keygendr.exe"
|
||||
VALUE "ProductName", "Pro Nouns Keygender"
|
||||
VALUE "ProductVersion", "1, 0, 0, 0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
IDI_KEYGENDER ICON "keygender.ico"
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
505
Keygender32/Keygender32.vcproj
Normal file
505
Keygender32/Keygender32.vcproj
Normal file
|
@ -0,0 +1,505 @@
|
|||
<?xml version="1.0" encoding="shift_jis"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Name="Keygender32"
|
||||
ProjectGUID="{8E21754C-D79C-4B94-B139-BB91D252FF3F}"
|
||||
RootNamespace="Keygender32"
|
||||
Keyword="Win32Proj"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="C:\Dev\libxmp\Debug\include"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;LIBXMP_STATIC"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="2"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
LinkLibraryDependencies="false"
|
||||
AdditionalDependencies="libxmp-static.lib shlwapi.lib msimg32.lib winmm.lib comctl32.lib"
|
||||
LinkIncremental="2"
|
||||
AdditionalLibraryDirectories="C:\Dev\libxmp\Debug\lib"
|
||||
IgnoreAllDefaultLibraries="false"
|
||||
IgnoreDefaultLibraryNames=""
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="1"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="1"
|
||||
FavorSizeOrSpeed="2"
|
||||
AdditionalIncludeDirectories="C:\Dev\libxmp\Release\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LIBXMP_STATIC"
|
||||
RuntimeLibrary="0"
|
||||
UsePrecompiledHeader="2"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="3"
|
||||
CompileAs="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="libxmp-static.lib shlwapi.lib msimg32.lib winmm.lib comctl32.lib"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="C:\Dev\libxmp\Release\lib"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release_ANSI|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="0"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Copying NFOs"
|
||||
CommandLine="copy "$(SolutionDir)"*.NFO "$(TargetDir)""
|
||||
Outputs="$(TargetDir)\keygendr.for.win32.HL.NFO"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="1"
|
||||
FavorSizeOrSpeed="2"
|
||||
AdditionalIncludeDirectories="C:\Dev\libxmp\Release\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LIBXMP_STATIC"
|
||||
RuntimeLibrary="0"
|
||||
BufferSecurityCheck="false"
|
||||
EnableEnhancedInstructionSet="0"
|
||||
RuntimeTypeInfo="false"
|
||||
UsePrecompiledHeader="2"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="0"
|
||||
CompileAs="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="libxmp-static.lib shlwapi.lib msimg32.lib winmm.lib comctl32.lib"
|
||||
OutputFile="$(OutDir)\Keygendr.exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="C:\Dev\libxmp\Release\lib"
|
||||
GenerateDebugInformation="false"
|
||||
SubSystem="2"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Debug_ANSI|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="0"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="C:\Dev\libxmp\Debug\include"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;LIBXMP_STATIC"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="2"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
LinkLibraryDependencies="false"
|
||||
AdditionalDependencies="libxmp-static.lib shlwapi.lib msimg32.lib winmm.lib comctl32.lib"
|
||||
LinkIncremental="2"
|
||||
AdditionalLibraryDirectories="C:\Dev\libxmp\Debug\lib"
|
||||
IgnoreAllDefaultLibraries="false"
|
||||
IgnoreDefaultLibraryNames=""
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\BGM.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Debug.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Dialog.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Generator.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Keygender32.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Nfo.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Random.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Starfield.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\stdafx.c"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
UsePrecompiledHeader="1"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
UsePrecompiledHeader="1"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release_ANSI|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
UsePrecompiledHeader="1"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug_ANSI|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
UsePrecompiledHeader="1"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\BGM.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Debug.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Dialog.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Generator.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Keygender32.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Nfo.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Random.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Resource.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Starfield.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\stdafx.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\keygender.ico"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Keygender32.rc"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="..\keygendr.for.win32.HL.NFO"
|
||||
DeploymentContent="true"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ReadMe.txt"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\space_debris.mod"
|
||||
>
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
43
Keygender32/Nfo.c
Normal file
43
Keygender32/Nfo.c
Normal file
|
@ -0,0 +1,43 @@
|
|||
#include "stdafx.h"
|
||||
#include "Nfo.h"
|
||||
#include "resource.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#define OpenURL(url) \
|
||||
ShellExecute( \
|
||||
hDlg, \
|
||||
_T("open"), \
|
||||
url, \
|
||||
NULL, \
|
||||
NULL, \
|
||||
SW_SHOWNORMAL)
|
||||
|
||||
INT_PTR CALLBACK
|
||||
NfoDlgProc(HWND hDlg,
|
||||
UINT uMsg,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
switch (uMsg) {
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDC_HLSITE:
|
||||
OpenURL(_T("https://cohost.org/hell-labs"));
|
||||
break;
|
||||
case IDC_OGLINK:
|
||||
OpenURL(_T("https://tiredand.gay/keygender/"));
|
||||
break;
|
||||
case IDCLOSE:
|
||||
EndDialog(hDlg, 0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case WM_CLOSE:
|
||||
EndDialog(hDlg, 0);
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
4
Keygender32/Nfo.h
Normal file
4
Keygender32/Nfo.h
Normal file
|
@ -0,0 +1,4 @@
|
|||
#pragma once
|
||||
|
||||
INT_PTR CALLBACK
|
||||
NfoDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
45
Keygender32/Random.c
Normal file
45
Keygender32/Random.c
Normal file
|
@ -0,0 +1,45 @@
|
|||
#include "stdafx.h"
|
||||
#include "Random.h"
|
||||
|
||||
/* From https://prng.di.unimi.it/xoshiro256plusplus.c */
|
||||
|
||||
static UINT64 s[4];
|
||||
|
||||
static __inline UINT64
|
||||
rotl(const UINT64 x, int k)
|
||||
{
|
||||
return (x << k) | (x >> (64 - k));
|
||||
}
|
||||
|
||||
void
|
||||
xorsrand(unsigned int seed)
|
||||
{
|
||||
UINT64 x = seed;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
UINT64 z = (x += 0x9E3779B97F4A7C15ULL);
|
||||
z = (z ^ (z >> 30)) * 0xBF58476D1CE4E5B9ULL;
|
||||
z = (z ^ (z >> 27)) * 0x94D049BB133111EBULL;
|
||||
s[i] = x = z ^ (z >> 31);
|
||||
}
|
||||
}
|
||||
|
||||
UINT64
|
||||
xorrand(void)
|
||||
{
|
||||
const UINT64 result = rotl(s[0] + s[3], 23) + s[0];
|
||||
|
||||
const UINT64 t = s[1] << 17;
|
||||
|
||||
s[2] ^= s[0];
|
||||
s[3] ^= s[1];
|
||||
s[1] ^= s[2];
|
||||
s[0] ^= s[3];
|
||||
|
||||
s[2] ^= t;
|
||||
|
||||
s[3] = rotl(s[3], 45);
|
||||
|
||||
return result;
|
||||
}
|
7
Keygender32/Random.h
Normal file
7
Keygender32/Random.h
Normal file
|
@ -0,0 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
// Provides a seed for xorrand().
|
||||
void xorsrand(unsigned int seed);
|
||||
// Generates a random UINT64 according to the xoshiro256++ PRNG
|
||||
// algorithm.
|
||||
UINT64 xorrand(void);
|
308
Keygender32/Starfield.c
Normal file
308
Keygender32/Starfield.c
Normal file
|
@ -0,0 +1,308 @@
|
|||
#include "stdafx.h"
|
||||
#include "Starfield.h"
|
||||
#include "Random.h"
|
||||
|
||||
#include <math.h>
|
||||
#include <time.h>
|
||||
|
||||
#define WMU_FRAMERATE_NAME _T("SetFramerate_{6CFC2304-CE89-40c4-881C-988D36FBB978}")
|
||||
#define DENSITY 3
|
||||
#define LAYERS 5
|
||||
|
||||
const COLORREF crTransColors[] = {
|
||||
RGB(0x5b, 0xce, 0xfa),
|
||||
RGB(0xf5, 0xa9, 0xb8),
|
||||
RGB(0xff, 0xff, 0xff),
|
||||
};
|
||||
|
||||
typedef struct _StarLayer {
|
||||
HBITMAP hbmFrame;
|
||||
DOUBLE x;
|
||||
BYTE alpha;
|
||||
} StarLayer;
|
||||
|
||||
typedef struct _StarState {
|
||||
StarLayer layers[LAYERS];
|
||||
HBITMAP hbmColors[3]; // for each stripe
|
||||
HDC hMemDC; // blits to screen
|
||||
HDC hBlitDC; // blits to hMemDC
|
||||
} StarState;
|
||||
|
||||
static void
|
||||
DeleteState(StarState *state)
|
||||
{
|
||||
if (state) {
|
||||
int i;
|
||||
|
||||
if (state->hBlitDC) DeleteDC(state->hBlitDC);
|
||||
if (state->hMemDC) DeleteDC(state->hMemDC);
|
||||
|
||||
for (i = 0; i < LAYERS; i++) {
|
||||
if (state->layers[i].hbmFrame) {
|
||||
DeleteObject(state->layers[i].hbmFrame);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (state->hbmColors[i]) DeleteObject(state->hbmColors[i]);
|
||||
}
|
||||
|
||||
// The state is usually stored in the stack, so zero out any
|
||||
// values that might cause issues in case of reuse
|
||||
ZeroMemory(state, sizeof(StarState));
|
||||
}
|
||||
}
|
||||
|
||||
// Initializes the StarState based on the given client area RECT
|
||||
static void
|
||||
InitState(HDC hDC,
|
||||
StarState *state,
|
||||
LPRECT rcArea)
|
||||
{
|
||||
UINT i, // iterators
|
||||
iStripeSplit; // height per stripe
|
||||
HBITMAP hbmColors[3];
|
||||
DWORD dwStarCount = rcArea->bottom * DENSITY;
|
||||
|
||||
iStripeSplit = rcArea->bottom / 5;
|
||||
|
||||
// init DCs
|
||||
state->hMemDC = CreateCompatibleDC(hDC);
|
||||
state->hBlitDC = CreateCompatibleDC(hDC);
|
||||
|
||||
// init layer bitmaps
|
||||
for (i = 0; i < LAYERS; i++) {
|
||||
HBITMAP hbmOrig;
|
||||
state->layers[i].hbmFrame = CreateCompatibleBitmap(hDC,
|
||||
rcArea->right,
|
||||
rcArea->bottom);
|
||||
state->layers[i].x = 0;
|
||||
state->layers[i].alpha = 159 + (i * 24);
|
||||
|
||||
// Before stars, fill the frame with the void of space
|
||||
hbmOrig = SelectObject(
|
||||
state->hBlitDC,
|
||||
state->layers[i].hbmFrame);
|
||||
BitBlt(state->hBlitDC,
|
||||
0, 0,
|
||||
rcArea->right, rcArea->bottom,
|
||||
NULL,
|
||||
0, 0,
|
||||
BLACKNESS);
|
||||
SelectObject(
|
||||
state->hBlitDC,
|
||||
hbmOrig);
|
||||
}
|
||||
|
||||
// we only need to init the stripes, thanks to AlphaBlend
|
||||
for (i = 0; i < 3; i++) {
|
||||
HBITMAP hbmOrig;
|
||||
|
||||
hbmColors[i] = CreateCompatibleBitmap(hDC, 1, 1);
|
||||
hbmOrig = SelectObject(state->hBlitDC,
|
||||
hbmColors[i]);
|
||||
SetPixel(state->hBlitDC,
|
||||
0, 0, crTransColors[i]);
|
||||
SelectObject(state->hBlitDC, hbmOrig);
|
||||
}
|
||||
|
||||
// arm the RNG
|
||||
xorsrand((unsigned)time(NULL));
|
||||
|
||||
// create each star, AlphaBlending as we go for ideal effect
|
||||
for (i = 0; i < dwStarCount; i++) {
|
||||
int layer = (WORD)(xorrand() >> 48) % LAYERS,
|
||||
x = (int)((WORD)xorrand()) % (rcArea->right - 4),
|
||||
y = i / DENSITY,
|
||||
stripe = y / iStripeSplit,
|
||||
width = max((int)(((float)layer + 3.0f) / 2.0f), 1);
|
||||
|
||||
HBITMAP hbmColor = hbmColors[(stripe < 3) ? stripe :
|
||||
(stripe == 3) ? 1 : 0],
|
||||
hbmOrig,
|
||||
hbmBlitOrig;
|
||||
|
||||
BLENDFUNCTION bf = {
|
||||
AC_SRC_OVER,
|
||||
0,
|
||||
state->layers[layer].alpha,
|
||||
0
|
||||
};
|
||||
|
||||
hbmOrig = SelectObject(state->hMemDC, state->layers[layer].hbmFrame);
|
||||
hbmBlitOrig = SelectObject(state->hBlitDC, hbmColor);
|
||||
AlphaBlend(state->hMemDC,
|
||||
x - (width / 2), y - (width / 2),
|
||||
width, width,
|
||||
state->hBlitDC,
|
||||
0, 0,
|
||||
1, 1,
|
||||
bf);
|
||||
|
||||
if (x + width > rcArea->right) {
|
||||
// loop around to make the square look complete
|
||||
AlphaBlend(state->hMemDC,
|
||||
0, y,
|
||||
(x + width) - rcArea->right, width,
|
||||
state->hBlitDC,
|
||||
0, 0,
|
||||
1, 1,
|
||||
bf);
|
||||
}
|
||||
|
||||
SelectObject(state->hBlitDC, hbmBlitOrig);
|
||||
SelectObject(state->hMemDC, hbmOrig);
|
||||
}
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
DeleteObject(hbmColors[i]);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
DrawStars(HDC hDC,
|
||||
StarState *state,
|
||||
LPRECT rcArea)
|
||||
{
|
||||
// Logic taken from https://github.com/lunasorcery/keygender/blob/main/script.js
|
||||
UINT i;
|
||||
HBITMAP hbmOrig,
|
||||
hbmFrame = CreateCompatibleBitmap(hDC,
|
||||
rcArea->right,
|
||||
rcArea->bottom);
|
||||
static DWORD dwLastRun = 0;
|
||||
DOUBLE dSpeedMult = 1.0;
|
||||
|
||||
hbmOrig = SelectObject(state->hMemDC, hbmFrame);
|
||||
// Without this, Win98 starts blitting VRAM to our control
|
||||
BitBlt(state->hMemDC,
|
||||
0, 0,
|
||||
rcArea->right, rcArea->bottom,
|
||||
NULL,
|
||||
0, 0,
|
||||
BLACKNESS);
|
||||
|
||||
// try to keep a consistent speed across frames
|
||||
if (dwLastRun != 0) {
|
||||
DWORD dwElapsed = GetTickCount() - dwLastRun;
|
||||
dSpeedMult = max(1.0, (dwElapsed / 17.0));
|
||||
}
|
||||
dwLastRun = GetTickCount();
|
||||
|
||||
for (i = 0; i < LAYERS; i++) {
|
||||
HBITMAP hbmBlitOrig = NULL;
|
||||
|
||||
// split each layer into two pieces, and stitch them together
|
||||
int widths[2];
|
||||
widths[0] = (int)state->layers[i].x + rcArea->right;
|
||||
widths[1] = rcArea->right - widths[0];
|
||||
|
||||
hbmBlitOrig = SelectObject(state->hBlitDC, state->layers[i].hbmFrame);
|
||||
// Left side of the split
|
||||
TransparentBlt(state->hMemDC,
|
||||
0, 0,
|
||||
widths[0], rcArea->bottom,
|
||||
state->hBlitDC,
|
||||
widths[1], 0,
|
||||
widths[0], rcArea->bottom,
|
||||
0);
|
||||
// Right side of the split
|
||||
TransparentBlt(state->hMemDC,
|
||||
widths[0], 0,
|
||||
widths[1], rcArea->bottom,
|
||||
state->hBlitDC,
|
||||
0, 0,
|
||||
widths[1], rcArea->bottom,
|
||||
0);
|
||||
SelectObject(state->hBlitDC, hbmBlitOrig);
|
||||
|
||||
// Update frame location
|
||||
state->layers[i].x -= ((DOUBLE)i + 1.5) * dSpeedMult;
|
||||
if (state->layers[i].x + rcArea->right < 0) {
|
||||
state->layers[i].x += rcArea->right;
|
||||
}
|
||||
}
|
||||
|
||||
BitBlt(hDC,
|
||||
rcArea->left,
|
||||
rcArea->top,
|
||||
rcArea->right,
|
||||
rcArea->bottom,
|
||||
state->hMemDC,
|
||||
0, 0,
|
||||
SRCCOPY);
|
||||
|
||||
SelectObject(state->hMemDC, hbmOrig);
|
||||
DeleteObject(hbmFrame);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static LRESULT CALLBACK
|
||||
StarfieldWndProc(HWND hWnd,
|
||||
UINT uMsg,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
static RECT rcClient = {0};
|
||||
static StarState state = {0};
|
||||
static HBITMAP hbmColors[3] = {0};
|
||||
static HDC hDC = NULL;
|
||||
// Default to 60fps
|
||||
static DOUBLE fFrameRate = (1.0 / 60) *
|
||||
1000.0;
|
||||
|
||||
switch (uMsg) {
|
||||
case WM_CREATE:
|
||||
hDC = GetDC(hWnd);
|
||||
|
||||
GetClientRect(hWnd, &rcClient);
|
||||
InitState(hDC, &state, &rcClient);
|
||||
/* PASSTHRU */
|
||||
case WM_TIMER:
|
||||
// Frame tick!
|
||||
DrawStars(hDC, &state, &rcClient);
|
||||
SetTimer(hWnd, 0x69, fFrameRate, NULL);
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
DeleteState(&state);
|
||||
DeleteDC(hDC);
|
||||
hDC = NULL;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (uMsg == WMU_FRAMERATE) {
|
||||
// Update our frame rate
|
||||
fFrameRate = (1.0 / (DOUBLE)(LONG)wParam)
|
||||
* 1000.0;
|
||||
return 0;
|
||||
} else {
|
||||
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
InitStarfieldControl(HINSTANCE hInst)
|
||||
{
|
||||
WNDCLASSEX wcex = {0};
|
||||
wcex.cbSize = sizeof(wcex);
|
||||
wcex.lpfnWndProc = StarfieldWndProc;
|
||||
wcex.hInstance = hInst;
|
||||
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wcex.lpszClassName = STARFIELD_CLASS;
|
||||
RegisterClassEx(&wcex);
|
||||
|
||||
WMU_FRAMERATE = RegisterWindowMessage(WMU_FRAMERATE_NAME);
|
||||
}
|
||||
|
||||
void
|
||||
DeinitStarfieldControl(HINSTANCE hInst)
|
||||
{
|
||||
UnregisterClass(STARFIELD_CLASS, hInst);
|
||||
}
|
14
Keygender32/Starfield.h
Normal file
14
Keygender32/Starfield.h
Normal file
|
@ -0,0 +1,14 @@
|
|||
#pragma once
|
||||
|
||||
#define STARFIELD_CLASS _T("Starfield")
|
||||
|
||||
// Initializes the Starfield control. This is required before creating
|
||||
// a Starfield control using STARFIELD_CLASS.
|
||||
void InitStarfieldControl(HINSTANCE);
|
||||
|
||||
// Removes the Starfield control class.
|
||||
void DeinitStarfieldControl(HINSTANCE);
|
||||
|
||||
// Defined by InitStarFieldControl. Send this message to define the
|
||||
// rough framerate the control tries to render at.
|
||||
UINT WMU_FRAMERATE;
|
BIN
Keygender32/keygender.ico
Normal file
BIN
Keygender32/keygender.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
35
Keygender32/resource.h
Normal file
35
Keygender32/resource.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by Keygender32.rc
|
||||
//
|
||||
#define IDD_KEYGENDER32_DIALOG 102
|
||||
#define IDM_ABOUT 104
|
||||
#define IDD_ABOUT 107
|
||||
#define IDR_MAINFRAME 128
|
||||
#define IDD_MAIN 129
|
||||
#define IDR_BGM 132
|
||||
#define IDI_KEYGENDER 134
|
||||
#define IDR_TTF1 138
|
||||
#define IDC_CUSTOM1 1002
|
||||
#define IDC_STARFIELD 1002
|
||||
#define IDC_PNTYPE 1003
|
||||
#define IDC_GENBTN 1004
|
||||
#define IDC_KEYDATA 1005
|
||||
#define IDC_STATUSBAR 1006
|
||||
#define IDC_NFOEDIT 1008
|
||||
#define IDC_RICHEDIT21 1009
|
||||
#define IDC_OGLINK 1011
|
||||
#define IDC_HLSITE 1014
|
||||
#define IDC_STATIC -1
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NO_MFC 1
|
||||
#define _APS_NEXT_RESOURCE_VALUE 139
|
||||
#define _APS_NEXT_COMMAND_VALUE 32771
|
||||
#define _APS_NEXT_CONTROL_VALUE 1015
|
||||
#define _APS_NEXT_SYMED_VALUE 110
|
||||
#endif
|
||||
#endif
|
BIN
Keygender32/space_debris.mod
Normal file
BIN
Keygender32/space_debris.mod
Normal file
Binary file not shown.
12
Keygender32/stdafx.c
Normal file
12
Keygender32/stdafx.c
Normal file
|
@ -0,0 +1,12 @@
|
|||
// stdafx.cpp : source file that includes just the standard includes
|
||||
// Keygender32.pch will be the pre-compiled header
|
||||
// stdafx.obj will contain the pre-compiled type information
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
// TODO: reference any additional headers you need in STDAFX.H
|
||||
// and not in this file
|
||||
#pragma comment(linker,"\"/manifestdependency:type='win32' \
|
||||
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
|
||||
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' \
|
||||
language='*'\"")
|
35
Keygender32/stdafx.h
Normal file
35
Keygender32/stdafx.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
// stdafx.h : include file for standard system include files,
|
||||
// or project specific include files that are used frequently, but
|
||||
// are changed infrequently
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
// Modify the following defines if you have to target a platform prior to the ones specified below.
|
||||
// Refer to MSDN for the latest info on corresponding values for different platforms.
|
||||
#ifndef WINVER // Allow use of features specific to Windows XP or later.
|
||||
#define WINVER 0x0410 // Change this to the appropriate value to target other versions of Windows.
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
|
||||
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
|
||||
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later.
|
||||
#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE.
|
||||
#endif
|
||||
|
||||
// Windows Header Files:
|
||||
#include <windows.h>
|
||||
#include <CommCtrl.h>
|
||||
#include <Shlwapi.h>
|
||||
|
||||
// C RunTime Header Files
|
||||
#include <stdlib.h>
|
||||
#include <malloc.h>
|
||||
#include <memory.h>
|
||||
#include <tchar.h>
|
52
LICENSE.TXT
Normal file
52
LICENSE.TXT
Normal file
|
@ -0,0 +1,52 @@
|
|||
===========================
|
||||
BIG BILL HELL'S LICENSE
|
||||
===========================
|
||||
|
||||
FUCK YOU, OPEN-SOURCE!
|
||||
|
||||
If you're dumb enough to want to copy this software, you're a big enough
|
||||
schmuck to abide by BIG BILL HELL'S LICENSE (BBHL):
|
||||
|
||||
| 1. BAD TERMS
|
||||
| 2. CODE THAT BREAKS DOWN
|
||||
| 3. THIEVES
|
||||
|
||||
--------------
|
||||
1. BAD TERMS
|
||||
--------------
|
||||
|
||||
If you think you're going to find permissive terms in BIG BILL'S, you can
|
||||
kiss my ASS. It's our belief that you're such a stupid motherfucker,
|
||||
you'll depend on this bullshit, GUARANTEED. If you make a derivative work:
|
||||
Shove it up your ugly ASS. You heard us right: Shove it up your ugly ASS.
|
||||
|
||||
--------------------------
|
||||
2. CODE THAT BREAKS DOWN
|
||||
--------------------------
|
||||
|
||||
Bring your CHANGE; bring your REPRO; bring your SPOUSE--we'll fuck them!
|
||||
That's right, we'll fuck your SPOUSE. Because under the BBHL, you're fucked
|
||||
six ways from Sunday.
|
||||
|
||||
------------
|
||||
3. THIEVES
|
||||
------------
|
||||
|
||||
Make a hack with BBHL, home of CHALLENGE GITTING. That's right:
|
||||
|
||||
3.a. CHALLENGE GITTING
|
||||
----------------------
|
||||
How does it work? If you submit six PRs straight into main that don't need
|
||||
feedback, you get no Contributor License Agreement (CLA).
|
||||
|
||||
|
||||
DON'T SELL; DON'T DISTRIBUTE; DON'T FORK FROM US, OR WE'LL RIP YOUR BITS OFF.
|
||||
|
||||
ONLY WITH BBHL: THE ONLY LICENSE THAT TELLS YOU TO FUCK OFF.
|
||||
|
||||
HURRY UP, ASSHOLE, THESE TERMS TAKE EFFECT THE MINUTE YOU WRITE A LINE OF
|
||||
CODE, AND IT BETTER NOT BREAK, OR YOU'RE A DEAD MOTHERFUCKER.
|
||||
|
||||
GO TO HELL. BIG BILL HELL'S LICENSE: OPEN-SOURCE'S FILTHIEST AND EXCLUSIVE
|
||||
TERMS OF THE MEANEST (SONS OF) BITCHES IN THE WHOLE COMMUNITY, GUARANTEED.
|
||||
|
1
README.TXT
Symbolic link
1
README.TXT
Symbolic link
|
@ -0,0 +1 @@
|
|||
keygendr.for.win32.HL.utf8.NFO
|
148
keygendr.for.win32.HL.NFO
Normal file
148
keygendr.for.win32.HL.NFO
Normal file
|
@ -0,0 +1,148 @@
|
|||
|
||||
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||||
ÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜ
|
||||
ÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜ
|
||||
ÜÛÛÛÛÛÛÛÛÛÛÛÛßßßßßßßßßßßßßßßÛÛÛÛÛÛÛÛÛÛÛÛÜ
|
||||
ÜÛÛÛÛÛÛÛÛÛßß ßßÛÛÛÛÛÛÛÛÛÜ
|
||||
ÜÛÛÛÛÛÛÛÛß Ü Ü ßÛÛÛÛÛÛÛÛÜ
|
||||
ÛÛÛÛÛÛÛÛß ÜÛÛÛÛÛÜ ÜÛÛÛÛÛÜ ßÛÛÛÛÛÛÛÛ
|
||||
ÛÛÛÛÛÛÛß ÜÛÛÛÛÛÛÛÛÛÛÜ ÜÛÛÛÛÛÛÛÛÛÛÜ ßÛÛÛÛÛÛÛ
|
||||
ÛÛÛÛÛÛÛß ÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜ ÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ
|
||||
ÜÛÛÛÛÛÛ ÛÛÛÛÛÛßÛÛÛÛÛÛÛÛÜÛÛÛÛÛÛÛÛßÛÛÛÛÛÛ ÛÛÛÛÛÛÜ
|
||||
ÛÛÛÛÛÛ ßÛÛÛÛÛÜ ßÛÛÛÛÛÛÛÛÛÛÛÛÛß ÜÛÛÛÛÛß ÛÛÛÛÛÛ
|
||||
ÛÛÛÛÛÛ ÛÛÛÛÛÛ ÜÛÛÛÛÛÛÛÛÛÛÛÜ ÛÛÛÛÛÛ ÛÛÛÛÛÛ
|
||||
ÜÛÛÛÛÛß ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛß ßÛÛÛÛÛÜ
|
||||
ÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛßßßÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛ
|
||||
ÛÛÛÛÛÛ ÜÛÛÛÛÛÛÛÛÛß ßÛÛÛÛÛÛÛÛÛÜ ÛÛÛÛÛÛ
|
||||
ÛÛÛÛÛÛ ÜÛÛÛÛÛÛÛÛÛÛß ßÛÛÛÛÛÛÛÛÛÛÜ ÛÛÛÛÛÛ
|
||||
ÛÛÛÛÛÛ ÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜ ÛÛÛÛÛÛ
|
||||
ÛÛÛÛÛÛ ÜÛÛÛÛÛÛÛÛÛß ÛÛÛÛÛÛ ÛÛÛÛÛÛ ßÛÛÛÛÛÛÛÛÛÜ ÛÛÛÛÛÛ
|
||||
ÛÛÛÛÛÛ ÛÛÛÛÛÛÛß ÛÛÛÛÛÛ ÛÛÛÛÛÛ *hl*ßÛÛÛÛÛÛÛ ÛÛÛÛÛÛ
|
||||
ÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛ
|
||||
ÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛ
|
||||
ßÛÛÛÛÛÜ ßßßßßßßßßßßßÛÛÛÛÛÛ ÛÛÛÛÛÛßßßßßßßßßßßß ÜÛÛÛÛÛß
|
||||
ÛÛÛÛÛÛÜ ÛÛÛÛÛÛ ÛÛÛÛÛÛ ÜÛÛÛÛÛÛ
|
||||
ÛÛÛÛÛÛÜ ÛÛÛÛÛÛ ÛÛÛÛÛÛ ÜÛÛÛÛÛÛ
|
||||
ßÛÛÛÛÛÛÛ ßÛÛÛÛÛÜÛÛÛÛÛß ÜÛÛÛÛÛÛß
|
||||
ßÛÛÛÛÛÛÛÜ ÛÛÛÛÛÛÛÛÛÛÛ ÜÛÛÛÛÛÛÛß
|
||||
ßÛÛÛÛÛÛÛÜ ßÛÛÛÛÛÛÛÛÛß ÜÛÛÛÛÛÛÛÛ
|
||||
ßÛÛÛÛÛÛÛÜÜ ßÛÛÛÛÛÛÛß ÜÜÛÛÛÛÛÛÛÛß
|
||||
ßÛÛÛÛÛÛÛÛÛÜÜÜ ÜÜÜÛÛÛÛÛÛÛÛÛÛß
|
||||
ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛßß
|
||||
ßßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛßß
|
||||
ßßßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛßßß
|
||||
|
||||
|
||||
ÞÛÝ ÞÛÝ ÞÛÝÞÛÝ ÛÛ ÛÛ
|
||||
ÞÛÝ ÞÛÝ ÜÜÜÜ ÞÛÝÞÛÝ ÛÛ ÜÜÜÜÜ ÛÛ ÜÜÜ ÜÜÜÜÜ
|
||||
ÞÛÛÛÛÛÛÛÝÜÛÛßßÛÛÜÞÛÝÞÛÝ ÛÛ ÛÛßßßÛÝ ÛÛÛßßÛÛÜ ÛÛßßßÛÛ
|
||||
ÞÛÝ ÞÛÝÛÛÜÜÜÜÛÛÞÛÝÞÛÝ ÛÛ ÜÜÛÛÛÝ ÛÛ ÛÛ ßÛÛÛÜÜ
|
||||
ÞÛÝ ÞÛÝÛÛÜ ÜÜÞÛÝÞÛÝ ÛÛ ÛÛß ÜÛÝ ÛÛÜ ÜÛÛ ÜÜ ßßÛÛ
|
||||
ÞÛÝ ÞÛÝ ßÛÛÛÛß ÞÛÝÞÛÝ ÛÛÛÛÛÝßÛÛÛßÛÛÝÛÛßÛÛÛß ßÛÛÛÛÛß
|
||||
|
||||
|
||||
úÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛú
|
||||
úÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛú
|
||||
ú ú
|
||||
:±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±:
|
||||
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
|
||||
³ ³
|
||||
ÃÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄ´
|
||||
± Û PRO NOUNS KEYGENDERATOR FOR WINDOWS Û ±
|
||||
± ÛÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÒÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÛ ±
|
||||
± Û developer...: [ flurry ] Û name.....: [ keygendr.exe ] Û ±
|
||||
± Û tester......: [ LiFFY ] Û OS.......: [ WinAll ] Û ±
|
||||
± Û release date: [ 17 mar 2024 ] Û disks....: [ 01 x 1.44 ] Û ±
|
||||
± Û Û Û ±
|
||||
± Û ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» Û Û ±
|
||||
± ÛÄÄÄþºº RELEASE INFO ººþÄÄÄÄÄÄÄÄÄÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÛ ±
|
||||
± Û ÈÍÍÍÍÍÍÍÍÍÍÍÍÍͼ Û ±
|
||||
± Û Û ±
|
||||
± Û This is a port of the JavaScript version, by Luna. Check out Û ±
|
||||
± Û her version here: Û ±
|
||||
± Û Û ±
|
||||
± Û http://tiredand.gay/keygender/ Û ±
|
||||
± Û Û ±
|
||||
± Û This program should be compatible with Windows 2000 and up. Û ±
|
||||
± Û You might be able to run this on Windows 9x, but beware: when Û ±
|
||||
± Û we tested it, the system struggled to keep up! It's best on Û ±
|
||||
± Û Windows XP anyway. Û ±
|
||||
± Û Û ±
|
||||
± Û It seems to run fine in Wine too, including under box86, just Û ±
|
||||
± Û in case you need Pro Nouns on another little-endian OS. Û ±
|
||||
± Û Û ±
|
||||
± Û Û ±
|
||||
± Û ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» Û ±
|
||||
± ÛÄÄÄÄþºº INSTALL INFO ººþÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÛ ±
|
||||
± Û ÈÍÍÍÍÍÍÍÍÍÍÍÍÍͼ Û ±
|
||||
± Û Û ±
|
||||
± Û Just open the EXE and enter the edition of Pro Nouns you want Û ±
|
||||
± Û to use. Û ±
|
||||
± Û Û ±
|
||||
± Û Enjoy! Û ±
|
||||
± Û Û ±
|
||||
± Û ÉÍÍÍÍÍÍÍÍ» Û ±
|
||||
± ÛÄÄÄÄÄÄÄþºº GREETS ººþÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÛ ±
|
||||
± Û ÈÍÍÍÍÍÍÍͼ Û ±
|
||||
± Û Û ±
|
||||
± Û Greets fly out to HeLL LaBS members! Û ±
|
||||
± Û Û ±
|
||||
± Û Personal greets to: Û ±
|
||||
± Û Û ±
|
||||
± Û ¯ LiF and iliana, for their assistance in both testing and Û ±
|
||||
± Û troubleshooting issues with the nightmare that is Win32 Û ±
|
||||
± Û ¯ Luna, for making the original that inspired me to Û ±
|
||||
± Û relearn the old Win32 API Û ±
|
||||
± Û ¯ libXMP devs, for making a tracker library that works so Û ±
|
||||
± Û well on any platform I've thrown it at with few issues Û ±
|
||||
± Û Û ±
|
||||
± Û ÉÍÍÍÍÍÍÍÍÍÍÍÍ» Û ±
|
||||
± ÛÄÄÄÄÄþºº GROUP INFO ººþÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÛ ±
|
||||
± Û ÈÍÍÍÍÍÍÍÍÍÍÍͼ Û ±
|
||||
± Û Û ±
|
||||
± Û irc...........: unlisted ;) Û ±
|
||||
± Û email.........: unlisted ;) Û ±
|
||||
± Û world wide web: http://cohost.org/hell-labs Û ±
|
||||
± Û Û ±
|
||||
± Û ÉÍÍÍÍÍÍÍÍ» Û ±
|
||||
± ÛÄÄÄÄÄÄÄþºº LEGAL? ººþÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÛ ±
|
||||
± Û ÈÍÍÍÍÍÍÍͼ Û ±
|
||||
± Û Û ±
|
||||
± Û The source code for this software is provided at the below Û ±
|
||||
± Û link, under the BBHLv1: Û ±
|
||||
± Û Û ±
|
||||
± Û http://git.2ki.xyz/hell-labs/keygendr32 Û ±
|
||||
± Û Û ±
|
||||
± Û This software also uses libxmp, under the MIT license: Û ±
|
||||
± Û Û ±
|
||||
± Û Extended Module Player Û ±
|
||||
± Û Copyright (C) 1996-2023 Claudio Matsuoka and Û ±
|
||||
± Û Hipolito Carraro Jr Û ±
|
||||
± Û Û ±
|
||||
± Û Permission is hereby granted, free of charge, to any person Û ±
|
||||
± Û obtaining a copy of this software and associated Û ±
|
||||
± Û documentation files (the "Software"), to deal in the Û ±
|
||||
± Û Software without restriction, including without limitation Û ±
|
||||
± Û the rights to use, copy, modify, merge, publish, Û ±
|
||||
± Û distribute, sublicense, and/or sell copies of the Software, Û ±
|
||||
± Û and to permit persons to whom the Software is furnished to Û ±
|
||||
± Û do so, subject to the following conditions: Û ±
|
||||
± Û Û ±
|
||||
± Û The above copyright notice and this permission notice shall Û ±
|
||||
± Û be included in all copies or substantial portions of the Û ±
|
||||
± Û Software. Û ±
|
||||
± Û Û ±
|
||||
± Û THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY Û ±
|
||||
± Û KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE Û ±
|
||||
± Û WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR Û ±
|
||||
± Û PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS Û ±
|
||||
± Û OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR Û ±
|
||||
± Û OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR Û ±
|
||||
± Û OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE Û ±
|
||||
± Û SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Û ±
|
||||
± Û Û ±
|
||||
± þ þ ±
|
||||
± ! ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ! ±
|
||||
±ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´³ CALL ENDED... ³ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄı
|
||||
ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
|
||||
|
148
keygendr.for.win32.HL.utf8.NFO
Normal file
148
keygendr.for.win32.HL.utf8.NFO
Normal file
|
@ -0,0 +1,148 @@
|
|||
|
||||
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
|
||||
▄▄▄█████████████████████▄▄▄
|
||||
▄▄███████████████████████████████▄▄
|
||||
▄████████████▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀████████████▄
|
||||
▄█████████▀▀ ▀▀█████████▄
|
||||
▄████████▀ ▄ ▄ ▀████████▄
|
||||
████████▀ ▄█████▄ ▄█████▄ ▀████████
|
||||
███████▀ ▄██████████▄ ▄██████████▄ ▀███████
|
||||
███████▀ █████████████▄▄ ▄▄█████████████ ███████
|
||||
▄██████ ██████▀████████▄████████▀██████ ██████▄
|
||||
██████ ▀█████▄ ▀█████████████▀ ▄█████▀ ██████
|
||||
██████ ██████ ▄███████████▄ ██████ ██████
|
||||
▄█████▀ ▀███████████████████████████▀ ▀█████▄
|
||||
██████ ████████████▀▀▀████████████ ██████
|
||||
██████ ▄█████████▀ ▀█████████▄ ██████
|
||||
██████ ▄██████████▀ ▀██████████▄ ██████
|
||||
██████ ▄▄█████████████ █████████████▄▄ ██████
|
||||
██████ ▄█████████▀ ██████ ██████ ▀█████████▄ ██████
|
||||
██████ ███████▀ ██████ ██████ *hl*▀███████ ██████
|
||||
██████ ███████████████████████████████████████████ ██████
|
||||
██████ █████████████████████████████████████████ ██████
|
||||
▀█████▄ ▀▀▀▀▀▀▀▀▀▀▀▀██████ ██████▀▀▀▀▀▀▀▀▀▀▀▀ ▄█████▀
|
||||
██████▄ ██████ ██████ ▄██████
|
||||
██████▄ ██████ ██████ ▄██████
|
||||
▀███████ ▀█████▄█████▀ ▄██████▀
|
||||
▀███████▄ ███████████ ▄███████▀
|
||||
▀███████▄ ▀█████████▀ ▄████████
|
||||
▀███████▄▄ ▀███████▀ ▄▄████████▀
|
||||
▀█████████▄▄▄ ▄▄▄██████████▀
|
||||
▀███████████████████████████████████▀▀
|
||||
▀▀███████████████████████████▀▀
|
||||
▀▀▀███████████████▀▀▀
|
||||
|
||||
|
||||
▐█▌ ▐█▌ ▐█▌▐█▌ ██ ██
|
||||
▐█▌ ▐█▌ ▄▄▄▄ ▐█▌▐█▌ ██ ▄▄▄▄▄ ██ ▄▄▄ ▄▄▄▄▄
|
||||
▐███████▌▄██▀▀██▄▐█▌▐█▌ ██ ██▀▀▀█▌ ███▀▀██▄ ██▀▀▀██
|
||||
▐█▌ ▐█▌██▄▄▄▄██▐█▌▐█▌ ██ ▄▄███▌ ██ ██ ▀███▄▄
|
||||
▐█▌ ▐█▌██▄ ▄▄▐█▌▐█▌ ██ ██▀ ▄█▌ ██▄ ▄██ ▄▄ ▀▀██
|
||||
▐█▌ ▐█▌ ▀████▀ ▐█▌▐█▌ █████▌▀███▀██▌██▀███▀ ▀█████▀
|
||||
|
||||
|
||||
·█████████████████████████████████████████████████████████████████████·
|
||||
·█████████████████████████████████████████████████████████████████████·
|
||||
· ·
|
||||
:▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒:
|
||||
¡▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒¡
|
||||
│ │
|
||||
├─┬─────────────────────────────────────────────────────────────────┬─┤
|
||||
▒ █ PRO NOUNS KEYGENDERATOR FOR WINDOWS █ ▒
|
||||
▒ █────────────────────────────────╥────────────────────────────────█ ▒
|
||||
▒ █ developer...: [ flurry ] █ name.....: [ keygendr.exe ] █ ▒
|
||||
▒ █ tester......: [ LiFFY ] █ OS.......: [ WinAll ] █ ▒
|
||||
▒ █ release date: [ 17 mar 2024 ] █ disks....: [ 01 x 1.44 ] █ ▒
|
||||
▒ █ █ █ ▒
|
||||
▒ █ ╔══════════════╗ █ █ ▒
|
||||
▒ █───■║║ RELEASE INFO ║║■─────────╨────────────────────────────────█ ▒
|
||||
▒ █ ╚══════════════╝ █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ This is a port of the JavaScript version, by Luna. Check out █ ▒
|
||||
▒ █ her version here: █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ http://tiredand.gay/keygender/ █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ This program should be compatible with Windows 2000 and up. █ ▒
|
||||
▒ █ You might be able to run this on Windows 9x, but beware: when █ ▒
|
||||
▒ █ we tested it, the system struggled to keep up! It's best on █ ▒
|
||||
▒ █ Windows XP anyway. █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ It seems to run fine in Wine too, including under box86, just █ ▒
|
||||
▒ █ in case you need Pro Nouns on another little-endian OS. █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ ╔══════════════╗ █ ▒
|
||||
▒ █────■║║ INSTALL INFO ║║■─────────────────────────────────────────█ ▒
|
||||
▒ █ ╚══════════════╝ █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ Just open the EXE and enter the edition of Pro Nouns you want █ ▒
|
||||
▒ █ to use. █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ Enjoy! █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ ╔════════╗ █ ▒
|
||||
▒ █───────■║║ GREETS ║║■────────────────────────────────────────────█ ▒
|
||||
▒ █ ╚════════╝ █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ Greets fly out to HeLL LaBS members! █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ Personal greets to: █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ » LiF and iliana, for their assistance in both testing and █ ▒
|
||||
▒ █ troubleshooting issues with the nightmare that is Win32 █ ▒
|
||||
▒ █ » Luna, for making the original that inspired me to █ ▒
|
||||
▒ █ relearn the old Win32 API █ ▒
|
||||
▒ █ » libXMP devs, for making a tracker library that works so █ ▒
|
||||
▒ █ well on any platform I've thrown it at with few issues █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ ╔════════════╗ █ ▒
|
||||
▒ █─────■║║ GROUP INFO ║║■──────────────────────────────────────────█ ▒
|
||||
▒ █ ╚════════════╝ █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ irc...........: unlisted ;) █ ▒
|
||||
▒ █ email.........: unlisted ;) █ ▒
|
||||
▒ █ world wide web: http://cohost.org/hell-labs █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ ╔════════╗ █ ▒
|
||||
▒ █───────■║║ LEGAL? ║║■────────────────────────────────────────────█ ▒
|
||||
▒ █ ╚════════╝ █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ The source code for this software is provided at the below █ ▒
|
||||
▒ █ link, under the BBHLv1: █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ http://git.2ki.xyz/hell-labs/keygendr32 █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ This software also uses libxmp, under the MIT license: █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ Extended Module Player █ ▒
|
||||
▒ █ Copyright (C) 1996-2023 Claudio Matsuoka and █ ▒
|
||||
▒ █ Hipolito Carraro Jr █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ Permission is hereby granted, free of charge, to any person █ ▒
|
||||
▒ █ obtaining a copy of this software and associated █ ▒
|
||||
▒ █ documentation files (the "Software"), to deal in the █ ▒
|
||||
▒ █ Software without restriction, including without limitation █ ▒
|
||||
▒ █ the rights to use, copy, modify, merge, publish, █ ▒
|
||||
▒ █ distribute, sublicense, and/or sell copies of the Software, █ ▒
|
||||
▒ █ and to permit persons to whom the Software is furnished to █ ▒
|
||||
▒ █ do so, subject to the following conditions: █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ The above copyright notice and this permission notice shall █ ▒
|
||||
▒ █ be included in all copies or substantial portions of the █ ▒
|
||||
▒ █ Software. █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ █ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY █ ▒
|
||||
▒ █ KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE █ ▒
|
||||
▒ █ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR █ ▒
|
||||
▒ █ PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS █ ▒
|
||||
▒ █ OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR █ ▒
|
||||
▒ █ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR █ ▒
|
||||
▒ █ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE █ ▒
|
||||
▒ █ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. █ ▒
|
||||
▒ █ █ ▒
|
||||
▒ ■ ■ ▒
|
||||
▒ ! ╒═══════════════╕ ! ▒
|
||||
▒─────────────────────────┤│ CALL ENDED... │├─────────────────────────▒
|
||||
╘═══════════════╛
|
||||
|
Loading…
Reference in a new issue