/programs/games/fara/trunk/KosFile.cpp |
---|
0,0 → 1,131 |
#include "kosSyst.h" |
#include "kosfile.h" |
CKosFile::CKosFile(char *fileName) |
{ |
// |
this->fileInfo.bufferPtr = new Byte[FILE_BUFFER_SIZE]; |
// |
this->filePointer = 0; |
this->bufferPointer = 0; |
this->validBuffer = false; |
// |
strcpy( this->fileInfo.fileURL, fileName ); |
} |
CKosFile::~CKosFile(void) |
{ |
// |
delete this->fileInfo.bufferPtr; |
} |
void CKosFile::ValidateBuffer() |
{ |
// |
if ( this->validBuffer ) |
{ |
// |
if ( this->filePointer < this->bufferPointer |
|| this->filePointer >= (this->bufferPointer + FILE_BUFFER_SIZE) ) |
{ |
// |
this->validBuffer = false; |
} |
} |
} |
void CKosFile::UpdateBuffer(void) |
{ |
// |
if ( ! this->validBuffer ) |
{ |
// |
this->fileInfo.OffsetLow = this->filePointer / OS_BLOCK_SIZE; |
this->fileInfo.OffsetHigh = 0; |
// |
this->bufferPointer = this->fileInfo.OffsetLow * OS_BLOCK_SIZE; |
// |
this->fileInfo.dataCount = FILE_BUFFER_BLOCKS; |
// |
this->fileInfo.rwMode = 0; |
// |
Dword rr = kos_FileSystemAccess( &(this->fileInfo) ); |
this->validBuffer = ( rr == 0 ) || ( rr == 6 ); |
} |
} |
int CKosFile::Seek(int seekFrom, int seekStep) |
{ |
// |
switch ( seekFrom ) |
{ |
// |
case SEEK_SET: |
// |
this->filePointer = seekStep; |
break; |
// |
case SEEK_CUR: |
// |
this->filePointer += seekStep; |
break; |
} |
// |
this->ValidateBuffer(); |
// |
return this->filePointer; |
} |
int CKosFile::Read(Byte *targetPtr, int readCount) |
{ |
int bufferLeast, result; |
// |
result = 0; |
// |
do |
{ |
// |
this->UpdateBuffer(); |
// |
if ( ! this->validBuffer ) return result; |
// |
bufferLeast = FILE_BUFFER_SIZE - (this->filePointer - this->bufferPointer); |
// |
if ( bufferLeast > readCount ) bufferLeast = readCount; |
// |
if ( bufferLeast ) |
{ |
// |
memcpy( |
targetPtr, |
this->fileInfo.bufferPtr + (this->filePointer - this->bufferPointer), |
bufferLeast |
); |
// |
targetPtr += bufferLeast; |
readCount -= bufferLeast; |
this->filePointer += bufferLeast; |
// |
result += bufferLeast; |
} |
// |
this->ValidateBuffer(); |
} |
while ( readCount > 0 ); |
// |
return result; |
} |
int CKosFile::Write(Byte *sourcePtr, int writeCount) |
{ |
return 0; |
} |
/programs/games/fara/trunk/KosFile.h |
---|
0,0 → 1,26 |
#pragma once |
#define SEEK_SET 0 |
#define SEEK_CUR 1 |
#define FILE_BUFFER_SIZE 512 |
#define OS_BLOCK_SIZE 1 |
#define FILE_BUFFER_BLOCKS (FILE_BUFFER_SIZE / OS_BLOCK_SIZE) |
class CKosFile |
{ |
public: |
CKosFile(char *fileName); |
virtual ~CKosFile(void); |
virtual int Read(Byte *targetPtr, int readCount); |
virtual int Write(Byte *sourcePtr, int writeCount); |
virtual int Seek(int seekFrom, int seekStep); |
protected: |
int filePointer; |
int bufferPointer; |
bool validBuffer; |
kosFileInfo fileInfo; |
virtual void ValidateBuffer(void); |
virtual void UpdateBuffer(void); |
}; |
/programs/games/fara/trunk/MCSMEMM.H |
---|
0,0 → 1,28 |
// |
struct MemBlock |
{ |
Dword Size; |
Dword Addr; |
MemBlock *Next; |
MemBlock *Previous; |
}; |
#define INITIALQUEUESIZE (32 * 4) |
#define FALSE 0 |
#define TRUE -1 |
#define MB_FREE 0 |
#define MB_USER 1 |
#define SIZE_ALIGN 4 |
Byte *allocmem( Dword reqsize ); |
Dword freemem( void *vaddress ); |
/programs/games/fara/trunk/Release/pe2kos.exe |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/fara/trunk/Release |
---|
Property changes: |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |
/programs/games/fara/trunk/bmp2src/bmp2src.dsp |
---|
0,0 → 1,103 |
# Microsoft Developer Studio Project File - Name="bmp2src" - Package Owner=<4> |
# Microsoft Developer Studio Generated Build File, Format Version 6.00 |
# ** DO NOT EDIT ** |
# TARGTYPE "Win32 (x86) Console Application" 0x0103 |
CFG=bmp2src - Win32 Debug |
!MESSAGE This is not a valid makefile. To build this project using NMAKE, |
!MESSAGE use the Export Makefile command and run |
!MESSAGE |
!MESSAGE NMAKE /f "bmp2src.mak". |
!MESSAGE |
!MESSAGE You can specify a configuration when running NMAKE |
!MESSAGE by defining the macro CFG on the command line. For example: |
!MESSAGE |
!MESSAGE NMAKE /f "bmp2src.mak" CFG="bmp2src - Win32 Debug" |
!MESSAGE |
!MESSAGE Possible choices for configuration are: |
!MESSAGE |
!MESSAGE "bmp2src - Win32 Release" (based on "Win32 (x86) Console Application") |
!MESSAGE "bmp2src - Win32 Debug" (based on "Win32 (x86) Console Application") |
!MESSAGE |
# Begin Project |
# PROP AllowPerConfigDependencies 0 |
# PROP Scc_ProjName "" |
# PROP Scc_LocalPath "" |
CPP=cl.exe |
RSC=rc.exe |
!IF "$(CFG)" == "bmp2src - Win32 Release" |
# PROP BASE Use_MFC 0 |
# PROP BASE Use_Debug_Libraries 0 |
# PROP BASE Output_Dir "Release" |
# PROP BASE Intermediate_Dir "Release" |
# PROP BASE Target_Dir "" |
# PROP Use_MFC 0 |
# PROP Use_Debug_Libraries 0 |
# PROP Output_Dir "Release" |
# PROP Intermediate_Dir "Release" |
# PROP Ignore_Export_Lib 0 |
# PROP Target_Dir "" |
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c |
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c |
# ADD BASE RSC /l 0x419 /d "NDEBUG" |
# ADD RSC /l 0x419 /d "NDEBUG" |
BSC32=bscmake.exe |
# ADD BASE BSC32 /nologo |
# ADD BSC32 /nologo |
LINK32=link.exe |
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 |
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib lzmapack.lib /nologo /subsystem:console /machine:I386 /opt:nowin98 |
# SUBTRACT LINK32 /pdb:none |
!ELSEIF "$(CFG)" == "bmp2src - Win32 Debug" |
# PROP BASE Use_MFC 0 |
# PROP BASE Use_Debug_Libraries 1 |
# PROP BASE Output_Dir "Debug" |
# PROP BASE Intermediate_Dir "Debug" |
# PROP BASE Target_Dir "" |
# PROP Use_MFC 0 |
# PROP Use_Debug_Libraries 1 |
# PROP Output_Dir "Debug" |
# PROP Intermediate_Dir "Debug" |
# PROP Ignore_Export_Lib 0 |
# PROP Target_Dir "" |
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c |
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c |
# ADD BASE RSC /l 0x419 /d "_DEBUG" |
# ADD RSC /l 0x419 /d "_DEBUG" |
BSC32=bscmake.exe |
# ADD BASE BSC32 /nologo |
# ADD BSC32 /nologo |
LINK32=link.exe |
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept |
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib lzmapack.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept |
!ENDIF |
# Begin Target |
# Name "bmp2src - Win32 Release" |
# Name "bmp2src - Win32 Debug" |
# Begin Group "Source Files" |
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" |
# Begin Source File |
SOURCE=.\main.cpp |
# End Source File |
# End Group |
# Begin Group "Header Files" |
# PROP Default_Filter "h;hpp;hxx;hm;inl" |
# End Group |
# Begin Group "Resource Files" |
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" |
# End Group |
# End Target |
# End Project |
/programs/games/fara/trunk/bmp2src/bmp2src.dsw |
---|
0,0 → 1,29 |
Microsoft Developer Studio Workspace File, Format Version 6.00 |
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! |
############################################################################### |
Project: "bmp2src"=.\bmp2src.dsp - Package Owner=<4> |
Package=<5> |
{{{ |
}}} |
Package=<4> |
{{{ |
}}} |
############################################################################### |
Global: |
Package=<5> |
{{{ |
}}} |
Package=<3> |
{{{ |
}}} |
############################################################################### |
/programs/games/fara/trunk/bmp2src/lzmapack.lib |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/fara/trunk/bmp2src/main.cpp |
---|
0,0 → 1,166 |
#include <stdio.h> |
#include <stdlib.h> |
extern "C" __stdcall lzma_set_dict_size(unsigned logdictsize); |
extern "C" __stdcall lzma_compress( |
const void* source, |
void* destination, |
unsigned length, |
void* workmem); |
typedef struct |
{ |
short int sizeX; |
short int sizeY; |
int compressedSize; |
int physicalOffset; |
int uncompressedSize; |
} SCompBmpHeader; |
int main(int argc, char* argv[]) |
{ |
if (argc < 3) |
{ |
printf("Usage: bmp2src <destination> <src1> <src2> ...\n"); |
return 1; |
} |
FILE* fo = fopen(argv[1], "wb"); |
if (!fo) |
{ |
printf("Cannot create destination file\n"); |
return 2; |
} |
int n=0; |
SCompBmpHeader* hea = (SCompBmpHeader*)malloc((argc-2)*sizeof(SCompBmpHeader)); |
void** ptrs = (void**)malloc((argc-2)*4); |
lzma_set_dict_size(20); |
void* workmem = (void*)malloc(0x509000 + (1<<20)*19/2); |
for (int i=2;i<argc;i++) |
{ |
FILE* fi = fopen(argv[i], "rb"); |
if (!fi) |
{ |
printf("Cannot open input file %s\n",argv[i]); |
continue; |
} |
unsigned char buf[0x36]; |
fread(buf,1,0x36,fi); |
if (buf[0] != 'B' || buf[1] != 'M') |
{ |
if (buf[0] != 0xFF || buf[1] != 0xD8) |
{ |
printf("%s: unrecognized type\n",argv[i]); |
fclose(fi); |
continue; |
} |
// JPEG |
printf("Processing %s ...",argv[i]); |
fseek(fi,0,SEEK_END); |
unsigned insize = ftell(fi); |
void* output = malloc(insize); |
unsigned char* ptr = (unsigned char*)output; |
*ptr++ = 0xFF; |
*ptr++ = 0xD8; |
// Now load JPEG file, skipping all APPx markers |
fseek(fi,2,SEEK_SET); |
bool bOk = false; |
for (;;) |
{ |
if (fread(buf,1,4,fi) != 4 || buf[0] != 0xFF) |
{ |
printf("%s: invalid JPEG file\n",argv[i]); |
bOk = false; |
break; |
} |
// ignore APPx markers |
if (buf[1] >= 0xE0 && buf[1] <= 0xEF) |
{ |
fseek(fi,buf[2]*256 + buf[3] - 2,SEEK_CUR); |
continue; |
} |
unsigned len = buf[2]*256 + buf[3] + 2; |
fseek(fi,-4,SEEK_CUR); |
fread(ptr,1,len,fi); |
if (buf[1]>=0xC0 && buf[1]<=0xCF && buf[1]!=0xC4 && buf[1]!=0xC8 && buf[1]!=0xCC) |
{ |
// found SOFn marker |
hea[i-2].sizeX = (unsigned char)ptr[4+3]*256 + (unsigned char)ptr[4+4]; |
hea[i-2].sizeY = (unsigned char)ptr[4+1]*256 + (unsigned char)ptr[4+2]; |
bOk = true; |
} |
ptr += len; |
if (buf[1] == 0xDA) |
{ |
// SOS marker |
len = insize - ftell(fi); |
fread(ptr,1,len,fi); |
ptr += len; |
break; |
} |
} |
if (!bOk) {printf(" invalid\n");free(ptr);continue;} |
hea[i-2].compressedSize = ptr - (unsigned char*)output; |
hea[i-2].uncompressedSize = hea[i-2].compressedSize - 1; |
hea[i-2].physicalOffset = (i==2) ? 0 : |
hea[i-3].physicalOffset+hea[i-3].compressedSize; |
ptrs[i-2] = output; |
++n; |
printf(" OK\n"); |
continue; |
} |
if (buf[0x1C] != 24) |
{ |
printf("Input file %s is not 24-bit BMP\n",argv[i]); |
fclose(fi); |
continue; |
} |
int width = *(int*)(buf+0x12); |
int linesize = (width*3+3)&~3; |
int height = *(int*)(buf+0x16); |
void* input = malloc(width*height*3); |
void* packed = malloc(9*width*height*3/8 + 0x80); |
for (int p=0;p<height;p++) |
{ |
fseek(fi,(height-p-1)*linesize+0x36,SEEK_SET); |
fread((char*)input+p*width*3, 1, width*3, fi); |
} |
fclose(fi); |
hea[i-2].sizeX = (short)width; |
hea[i-2].sizeY = (short)height; |
unsigned uncompressedSize = width*height*3; |
hea[i-2].uncompressedSize = uncompressedSize; |
hea[i-2].physicalOffset = (i==2) ? 0 : |
hea[i-3].physicalOffset+hea[i-3].compressedSize; |
printf("Compressing %s ...",argv[i]); |
unsigned compressedSize = lzma_compress(input,packed, |
uncompressedSize,workmem); |
if (compressedSize >= uncompressedSize) |
{ |
compressedSize = uncompressedSize; |
free(packed); |
ptrs[i-2] = input; |
} |
else |
{ |
ptrs[i-2] = packed; |
free(input); |
} |
printf(" %d -> %d\n",uncompressedSize, compressedSize); |
hea[i-2].compressedSize = compressedSize; |
++n; |
} |
for (i=0;i<n;i++) |
hea[i].physicalOffset += 4+n*sizeof(SCompBmpHeader); |
fwrite(&n,4,1,fo); |
fwrite(hea,sizeof(SCompBmpHeader),n,fo); |
for (i=0;i<n;i++) |
{ |
fwrite(ptrs[i],1,hea[i].compressedSize,fo); |
free(ptrs[i]); |
} |
fclose(fo); |
free(hea); |
free(workmem); |
free(ptrs); |
return 0; |
} |
/programs/games/fara/trunk/bmp2src |
---|
Property changes: |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |
/programs/games/fara/trunk/bmp2src.exe |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/fara/trunk/build_gfx.bat |
---|
0,0 → 1,3 |
bmp2src.exe fara.gfx face.jpg gmplace.jpg mainfish.bmp numbers.bmp |
/programs/games/fara/trunk/crc32.cpp |
---|
0,0 → 1,64 |
#include "kosSyst.h" |
#include "CRC32.h" |
CCRC32::CCRC32() |
{ |
Dword i, mask, j, k; |
for ( i=0xEDB8; i >= 0x8320; i-- ) |
{ |
mask = i; |
for ( j=0; j<8; j++ ) |
{ |
k = mask; |
mask >>= 1; |
if ( k & 1 ) |
{ |
mask ^= 0xEDB88320; |
} |
this->table[i & 0xFF] = mask; |
} |
} |
} |
Dword CCRC32::InitCRC32() |
{ |
return 0xFFFFFFFF; |
} |
Dword CCRC32::FinalizeCRC32(Dword d) |
{ |
return ~d; |
} |
void CCRC32::DoCRC32(Byte *buffer, Dword length, Dword *CRC32value) |
{ |
Dword result, i; |
Byte mask; |
result = *CRC32value; |
for ( i=0; i<length; i++ ) |
{ |
mask = (Byte)( ( result ^ buffer[i] ) & 0xFF ); |
result = ( result >>= 8 ) ^ this->table[mask]; |
} |
*CRC32value = result; |
} |
Dword CCRC32::GetCRC32(Byte *buffer, Dword length) |
{ |
Dword result; |
result = 0xFFFFFFFF; |
this->DoCRC32( buffer, length, &result ); |
return ~result; |
} |
/programs/games/fara/trunk/crc32.h |
---|
0,0 → 1,18 |
#if !defined(AFX_CRC32_H__1F375B73_5C72_4711_B464_7212EFC14AAE__INCLUDED_) |
#define AFX_CRC32_H__1F375B73_5C72_4711_B464_7212EFC14AAE__INCLUDED_ |
class CCRC32 |
{ |
private: |
Dword table[256]; |
public: |
Dword GetCRC32( Byte *buffer, Dword length ); |
void DoCRC32( Byte *buffer, Dword length, Dword *CRC32value ); |
Dword FinalizeCRC32( Dword ); |
Dword InitCRC32(); |
CCRC32(); |
}; |
#endif // !defined(AFX_CRC32_H__1F375B73_5C72_4711_B464_7212EFC14AAE__INCLUDED_) |
/programs/games/fara/trunk/face.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/fara/trunk/face.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/fara/trunk/fara.sln |
---|
0,0 → 1,19 |
Microsoft Visual Studio Solution File, Format Version 9.00 |
# Visual Studio 2005 |
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fara", "fara.vcproj", "{E102A7F0-5525-45CD-8078-82540F673720}" |
EndProject |
Global |
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
Debug|Win32 = Debug|Win32 |
Release|Win32 = Release|Win32 |
EndGlobalSection |
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
{E102A7F0-5525-45CD-8078-82540F673720}.Debug|Win32.ActiveCfg = Release|Win32 |
{E102A7F0-5525-45CD-8078-82540F673720}.Debug|Win32.Build.0 = Release|Win32 |
{E102A7F0-5525-45CD-8078-82540F673720}.Release|Win32.ActiveCfg = Release|Win32 |
{E102A7F0-5525-45CD-8078-82540F673720}.Release|Win32.Build.0 = Release|Win32 |
EndGlobalSection |
GlobalSection(SolutionProperties) = preSolution |
HideSolutionNode = FALSE |
EndGlobalSection |
EndGlobal |
/programs/games/fara/trunk/fara.vcproj |
---|
0,0 → 1,290 |
<?xml version="1.0" encoding="windows-1251"?> |
<VisualStudioProject |
ProjectType="Visual C++" |
Version="8,00" |
Name="fara" |
ProjectGUID="{E102A7F0-5525-45CD-8078-82540F673720}" |
RootNamespace="fara" |
Keyword="Win32Proj" |
> |
<Platforms> |
<Platform |
Name="Win32" |
/> |
</Platforms> |
<ToolFiles> |
</ToolFiles> |
<Configurations> |
<Configuration |
Name="Debug|Win32" |
OutputDirectory="Debug" |
IntermediateDirectory="Debug" |
ConfigurationType="1" |
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" |
CharacterSet="2" |
> |
<Tool |
Name="VCPreBuildEventTool" |
/> |
<Tool |
Name="VCCustomBuildTool" |
/> |
<Tool |
Name="VCXMLDataGeneratorTool" |
/> |
<Tool |
Name="VCWebServiceProxyGeneratorTool" |
/> |
<Tool |
Name="VCMIDLTool" |
/> |
<Tool |
Name="VCCLCompilerTool" |
Optimization="0" |
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" |
MinimalRebuild="true" |
BasicRuntimeChecks="3" |
RuntimeLibrary="1" |
UsePrecompiledHeader="0" |
WarningLevel="3" |
Detect64BitPortabilityProblems="true" |
DebugInformationFormat="4" |
/> |
<Tool |
Name="VCManagedResourceCompilerTool" |
/> |
<Tool |
Name="VCResourceCompilerTool" |
/> |
<Tool |
Name="VCPreLinkEventTool" |
/> |
<Tool |
Name="VCLinkerTool" |
OutputFile="$(OutDir)/fara.exe" |
LinkIncremental="2" |
GenerateDebugInformation="true" |
ProgramDatabaseFile="$(OutDir)/fara.pdb" |
SubSystem="1" |
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="Release" |
IntermediateDirectory="Release" |
ConfigurationType="1" |
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" |
CharacterSet="0" |
WholeProgramOptimization="1" |
> |
<Tool |
Name="VCPreBuildEventTool" |
/> |
<Tool |
Name="VCCustomBuildTool" |
/> |
<Tool |
Name="VCXMLDataGeneratorTool" |
/> |
<Tool |
Name="VCWebServiceProxyGeneratorTool" |
/> |
<Tool |
Name="VCMIDLTool" |
/> |
<Tool |
Name="VCCLCompilerTool" |
Optimization="2" |
EnableIntrinsicFunctions="false" |
FavorSizeOrSpeed="1" |
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" |
IgnoreStandardIncludePath="false" |
ExceptionHandling="0" |
RuntimeLibrary="0" |
StructMemberAlignment="1" |
BufferSecurityCheck="false" |
RuntimeTypeInfo="false" |
UsePrecompiledHeader="0" |
AssemblerOutput="4" |
WarningLevel="3" |
Detect64BitPortabilityProblems="false" |
DebugInformationFormat="3" |
/> |
<Tool |
Name="VCManagedResourceCompilerTool" |
/> |
<Tool |
Name="VCResourceCompilerTool" |
/> |
<Tool |
Name="VCPreLinkEventTool" |
/> |
<Tool |
Name="VCLinkerTool" |
AdditionalOptions="/ALIGN:32" |
AdditionalDependencies="lzma_unpack.obj" |
OutputFile="$(OutDir)/fara.exe" |
LinkIncremental="1" |
GenerateManifest="false" |
IgnoreAllDefaultLibraries="true" |
GenerateDebugInformation="false" |
SubSystem="1" |
OptimizeReferences="2" |
EnableCOMDATFolding="2" |
EntryPointSymbol="crtStartUp" |
BaseAddress="0x0" |
TargetMachine="1" |
/> |
<Tool |
Name="VCALinkTool" |
/> |
<Tool |
Name="VCManifestTool" |
EmbedManifest="false" |
/> |
<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;cxx;def;odl;idl;hpj;bat;asm;asmx" |
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
> |
<File |
RelativePath=".\crc32.cpp" |
> |
</File> |
<File |
RelativePath=".\gameWnd.cpp" |
> |
</File> |
<File |
RelativePath=".\gfxdef.cpp" |
> |
</File> |
<File |
RelativePath=".\KosFile.cpp" |
> |
</File> |
<File |
RelativePath=".\kosSyst.cpp" |
> |
</File> |
<File |
RelativePath=".\main.cpp" |
> |
</File> |
<File |
RelativePath=".\mainWnd.cpp" |
> |
</File> |
<File |
RelativePath=".\mcsmemm.cpp" |
> |
</File> |
<File |
RelativePath=".\top10wnd.cpp" |
> |
</File> |
</Filter> |
<Filter |
Name="Header Files" |
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
> |
<File |
RelativePath=".\crc32.h" |
> |
</File> |
<File |
RelativePath=".\gameWnd.h" |
> |
</File> |
<File |
RelativePath=".\gfxdef.h" |
> |
</File> |
<File |
RelativePath=".\KosFile.h" |
> |
</File> |
<File |
RelativePath=".\kosSyst.h" |
> |
</File> |
<File |
RelativePath=".\lang.h" |
> |
</File> |
<File |
RelativePath=".\mainWnd.h" |
> |
</File> |
<File |
RelativePath=".\mcarray.h" |
> |
</File> |
<File |
RelativePath=".\Mcsmemm.h" |
> |
</File> |
<File |
RelativePath=".\top10wnd.h" |
> |
</File> |
</Filter> |
<Filter |
Name="Resource Files" |
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" |
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
> |
</Filter> |
</Files> |
<Globals> |
</Globals> |
</VisualStudioProject> |
/programs/games/fara/trunk/gameWnd.cpp |
---|
0,0 → 1,1585 |
// |
#include "kosSyst.h" |
#include "KosFile.h" |
#include "gfxdef.h" |
#include "gameWnd.h" |
#include "mcarray.h" |
#include "lang.h" |
// |
#define EMPTY_PLACE 0 |
#define LEVEL_PROGRESS_LEFT (132+1) |
#define LEVEL_PROGRESS_TOP (388+21) |
#define LEVEL_PROGRESS_HEIGHT 4 |
#define LEVEL_PROGRESS_WIDTH 329 |
#define LEVEL_PROGRESS_COLOUR 0xDF2933 |
#define BONUS_SOMEBLOCK_TOP (120+21) |
#define BONUS_SOMEBLOCK_LEFT (46+1) |
#define BONUS_FREEBLOCK_TOP (163+21) |
#define BONUS_FREEBLOCK_LEFT (9+1) |
#define BONUS_DIAGBLOCK_TOP (213+21) |
#define BONUS_DIAGBLOCK_LEFT (48+1) |
#define BONUS_PROGRESS_HEIGHT 37 |
#define BONUS_PROGRESS_WIDTH 4 |
#define LEVEL_SCORE_BASE 50 |
// |
CKosBitmap gameFace; |
CKosBitmap gameBlocks; |
CKosBitmap gameNumbers; |
CKosBitmap gameBlocksZ[4]; |
// |
CFishka *fishki[blocksNum]; |
// |
char *gameWndTitle; |
#if LANG == RUS |
char gameWndTitle1[] = " à ® ¦¤ñâ ⥡ï :)"; |
char gameWndTitle2[] = "ã ¢®â..."; |
char gameOverText[] = " «ìè¥ ¤®à®£¨ ¥â!"; |
#else |
char gameWndTitle1[] = "Pharaoh waits for you :)"; |
char gameWndTitle2[] = "Well..."; |
char gameOverText[] = "No further way!"; |
#endif |
// |
Word gcx, gcy; |
// |
#define mapSize 8 |
// |
// |
#define blocksLeft (134+2) |
#define blocksTop (43+22) |
// |
#define blockTypesNum 10 |
// |
Byte gameMap[mapSize * mapSize]; |
// óðîâåíü |
int gameLevel; |
// |
int maxGameLevel; |
int startGameLevel; |
// ñ÷¸ò |
Dword playerScore; |
// ñ÷¸ò÷èê äîáàâëåííûõ áëîêîâ |
int insertedBlocksCount; |
// êîëè÷åñòâî áëîêîâ äëÿ ïåðåõîäà íà ñëåäóþùèé óðîâåíü |
int levelBlocksLimit; |
// íîìåð âûäåëåííîãî áëîêà |
int selectedBlock; |
// ïðèáàâëåíèå øàãà äëÿ èíäèêàòîðà ïðîõîæäåíèÿ óðîâíÿ * 1024 |
int levelProgressStep; |
// çàí÷åíèå èíäèêàòîðà ïðîõîæäåíèÿ óðîâíÿ |
int levelProgressCount; |
// áëîêè äëÿ óäàëåíèÿ |
struct sRemoveBlock |
{ |
short int ndx; |
short int value; |
sRemoveBlock() |
{ |
this->ndx = 0; |
this->value = 0; |
}; |
sRemoveBlock( int pNdx, int pValue ) |
{ |
this->ndx = pNdx; |
this->value = pValue; |
}; |
}; |
bool operator == ( const sRemoveBlock &b1, const sRemoveBlock &b2 ) |
{ |
return b1.ndx == b2.ndx; |
}; |
MCArray<sRemoveBlock> toRemoveList; |
// ïàäàþùèå áëîêè |
MCArray<int> toFallList; |
// |
bool mouseButtonDisabled; |
// |
bool freezeBonuses = false; |
// |
int bonusSomeBlockProgressStep; |
int bonusSomeBlockProgressCount; |
// |
int bonusFreeBlockProgressStep; |
int bonusFreeBlockProgressCount; |
// |
int bonusDiagBlockProgressStep; |
int bonusDiagBlockProgressCount; |
#define SELECTED_BLOCK_NONE -1 |
// áîíóñ âêëþ÷åí |
int bonusSomeBlock; |
// ñ÷¸ò÷èê áëîêîâ äëÿ áîíóñà |
int bonusSomeBlockCount; |
// êîëè÷åñòâî áëîêîâ, êîòîðîå íàäî óáðàòü, ÷òîáû ïîëó÷èòü áîíóñ |
int bonusSomeBlockEdge; |
#define BONUS_SOMEBLOCK_SELECTED -2 |
// |
bool bonusFreeBlock; |
int bonusFreeBlockCount; |
int bonusFreeBlockEdge; |
#define BONUS_FREEBLOCK_SELECTED -3 |
// |
int bonusDiagBlock; |
int bonusDiagBlockCount; |
int bonusDiagBlockEdge; |
#define BONUS_DIAGBLOCK_SELECTED -4 |
// |
void drawScore(); |
// îòîáðàçèòü áëîêè áîíóñîâ |
void drawBonuses(); |
// |
void drawLevelNum(); |
// |
void fadeOutBlocks(); |
// |
void fallDownBlocks(); |
void ClearGameMeters() |
{ |
// èíäèêàòîð ïðîõîæäåíèå óðîâíÿ |
kos_DrawBar( |
LEVEL_PROGRESS_LEFT, |
LEVEL_PROGRESS_TOP, |
LEVEL_PROGRESS_WIDTH, |
LEVEL_PROGRESS_HEIGHT, |
0 |
); |
// èíäèêàòîðû áîíóñîâ |
// some |
kos_DrawBar( |
33+1, |
118+21, |
BONUS_PROGRESS_WIDTH, |
BONUS_PROGRESS_HEIGHT, |
0 |
); |
// free |
kos_DrawBar( |
58+1, |
166+21, |
BONUS_PROGRESS_WIDTH, |
BONUS_PROGRESS_HEIGHT, |
0 |
); |
// diag |
kos_DrawBar( |
37+1, |
213+21, |
BONUS_PROGRESS_WIDTH, |
BONUS_PROGRESS_HEIGHT, |
0 |
); |
} |
// |
void drawGameMeters() |
{ |
// |
ClearGameMeters(); |
// èíäèêàòîð ïðîõîæäåíèå óðîâíÿ |
kos_DrawBar( |
LEVEL_PROGRESS_LEFT, |
LEVEL_PROGRESS_TOP, |
levelProgressCount, |
LEVEL_PROGRESS_HEIGHT, |
LEVEL_PROGRESS_COLOUR |
); |
// |
if ( bonusSomeBlockProgressCount > 0 ) |
// some |
kos_DrawBar( |
33+1, |
118+21+BONUS_PROGRESS_HEIGHT-bonusSomeBlockProgressCount, |
BONUS_PROGRESS_WIDTH, |
bonusSomeBlockProgressCount, |
LEVEL_PROGRESS_COLOUR |
); |
// |
if ( bonusFreeBlockProgressCount > 0 ) |
// free |
kos_DrawBar( |
58+1, |
166+21+BONUS_PROGRESS_HEIGHT-bonusFreeBlockProgressCount, |
BONUS_PROGRESS_WIDTH, |
bonusFreeBlockProgressCount, |
LEVEL_PROGRESS_COLOUR |
); |
// |
if ( bonusDiagBlockProgressCount > 0 ) |
// diag |
kos_DrawBar( |
37+1, |
213+21+BONUS_PROGRESS_HEIGHT-bonusDiagBlockProgressCount, |
BONUS_PROGRESS_WIDTH, |
bonusDiagBlockProgressCount, |
LEVEL_PROGRESS_COLOUR |
); |
} |
//////////////////////////////////////////////////////////////////////////////// |
void SetLevelVariables() |
{ |
selectedBlock = -1; |
levelBlocksLimit = ( gameLevel > 5 ) ? LEVEL_SCORE_BASE * ( gameLevel + 1 ) : LEVEL_SCORE_BASE * ( 11 - gameLevel ); |
insertedBlocksCount = 0; |
// |
levelProgressCount = 0; |
levelProgressStep = ( LEVEL_PROGRESS_WIDTH * 1024 ) / levelBlocksLimit; |
// |
bonusSomeBlockEdge = levelBlocksLimit / 4; |
bonusFreeBlockEdge = levelBlocksLimit / 3; |
bonusDiagBlockEdge = levelBlocksLimit / 2; |
// |
bonusSomeBlockProgressStep = ( BONUS_PROGRESS_HEIGHT * 1024 ) / bonusSomeBlockEdge; |
bonusSomeBlockProgressCount = ( ( ( bonusSomeBlockCount > bonusSomeBlockEdge ) ? bonusSomeBlockEdge : bonusSomeBlockCount ) * bonusSomeBlockProgressStep ) / 1024; |
// |
bonusFreeBlockProgressStep = ( BONUS_PROGRESS_HEIGHT * 1024 ) / bonusFreeBlockEdge; |
bonusFreeBlockProgressCount = ( ( ( bonusFreeBlockCount > bonusFreeBlockEdge ) ? bonusFreeBlockEdge : bonusFreeBlockCount ) * bonusFreeBlockProgressStep ) / 1024; |
// |
bonusDiagBlockProgressStep = ( BONUS_PROGRESS_HEIGHT * 1024 ) / bonusDiagBlockEdge; |
bonusDiagBlockProgressCount = ( ( ( bonusDiagBlockCount > bonusDiagBlockEdge ) ? bonusDiagBlockEdge : bonusDiagBlockCount ) * bonusDiagBlockProgressStep ) / 1024; |
} |
// |
int GetScoreByBlocks( int blocksCount ) |
{ |
int limit, update, i, j, acc; |
// |
if ( blocksCount < 3 ) return 0; |
// |
limit = 20 * blocksNum * gameLevel; |
// |
update = gameLevel; |
acc = 1; |
// |
j = blocksCount - 3; |
// |
for ( i = 0; i < j; i++ ) |
{ |
// |
acc *= gameLevel + 1; |
// |
if ( ( update + acc ) > limit ) return limit; |
} |
// |
return update + acc; |
} |
// |
int insertNewBlocks() |
{ |
int i, j, k, ndx, result, btn; |
// |
toFallList.Clear(); |
// |
result = 0; |
// |
btn = gameLevel > 5 ? blockTypesNum : 5 + gameLevel; |
// |
ndx = ( mapSize * mapSize ) - mapSize; |
// |
for ( i = 0; i < mapSize; i++ ) |
{ |
for ( j = 0; j < mapSize; j++ ) |
{ |
// |
k = ndx + i - ( j * mapSize ); |
// |
if ( gameMap[k] == EMPTY_PLACE ) |
{ |
// |
for ( ; j < (mapSize-1); j++ ) |
{ |
// |
gameMap[k] = gameMap[k-mapSize]; |
toFallList.AddExclusive( k ); |
k -= mapSize; |
} |
// |
gameMap[i] = ( rtlRand() % btn ) + 1; |
toFallList.AddExclusive( i ); |
// |
result++; |
// |
break; |
} |
} |
} |
// |
insertedBlocksCount += result; |
// |
return result; |
} |
// ïîèñê öåïî÷åê áëîêîâ äëÿ óäàëåíèÿ, óäàëåíèå áëîêîâ |
// âîçâðàùàåò ïðèðàùåíèå ñ÷¸òà èãðîêà |
int findBlockLines() |
{ |
int x, y, ndx; |
int removeCount = 0; |
// î÷èñòèì ñïèñîê äëÿ çàïèñè ðåçóëüòàòîâ |
toRemoveList.Clear(); |
// |
for ( y = 0; y < mapSize; y++ ) |
{ |
// |
for ( x = 0; x < mapSize; x++ ) |
{ |
// |
ndx = x + ( y * mapSize ); |
// |
if ( gameMap[ndx] == EMPTY_PLACE ) continue; |
// ïðîâåðÿåì ãîðèçîíòàëüíóþ öåïî÷êó |
if ( x < (mapSize - 2) ) |
{ |
// |
if ( |
( gameMap[ndx] == gameMap[ndx+1] && gameMap[ndx] == gameMap[ndx+2] ) |
|| ( BONUS_FREE_BLOCK == gameMap[ndx] && gameMap[ndx+1] == gameMap[ndx+2] ) |
|| ( gameMap[ndx] == gameMap[ndx+1] && BONUS_FREE_BLOCK == gameMap[ndx+2] ) |
|| ( gameMap[ndx] == gameMap[ndx+2] && BONUS_FREE_BLOCK == gameMap[ndx+1] ) |
) |
{ |
// íàøëè öåïî÷êó, çàïîìíèì |
toRemoveList.AddExclusive( sRemoveBlock( ndx, gameMap[ndx] ) ); |
toRemoveList.AddExclusive( sRemoveBlock( ndx+1, gameMap[ndx+1] ) ); |
toRemoveList.AddExclusive( sRemoveBlock( ndx+2, gameMap[ndx+2] ) ); |
} |
} |
// ïðîâåðÿåì âåðòèêàëüíóþ öåïî÷êó |
if ( y < (mapSize - 2) ) |
{ |
// |
if ( |
( gameMap[ndx] == gameMap[ndx+mapSize] && gameMap[ndx] == gameMap[ndx+mapSize+mapSize] ) |
|| ( BONUS_FREE_BLOCK == gameMap[ndx] && gameMap[ndx+mapSize] == gameMap[ndx+mapSize+mapSize] ) |
|| ( gameMap[ndx] == gameMap[ndx+mapSize] && BONUS_FREE_BLOCK == gameMap[ndx+mapSize+mapSize] ) |
|| ( gameMap[ndx] == gameMap[ndx+mapSize+mapSize] && BONUS_FREE_BLOCK == gameMap[ndx+mapSize] ) |
) |
{ |
// íàøëè öåïî÷êó, çàïîìíèì |
toRemoveList.AddExclusive( sRemoveBlock( ndx, gameMap[ndx] ) ); |
toRemoveList.AddExclusive( sRemoveBlock( ndx+mapSize, gameMap[ndx+mapSize] ) ); |
toRemoveList.AddExclusive( sRemoveBlock( ndx+mapSize+mapSize, gameMap[ndx+mapSize+mapSize] ) ); |
} |
} |
} |
} |
// |
return toRemoveList.GetCount(); |
} |
// ïðîâåðêà íà íåâîçìîæíîñòü ñîáðàòü êàêóþ-íèáóäü ëèíèþ |
bool checkGameOut() |
{ |
int x, y, ndx; |
// |
ndx = 0; |
// |
for ( y = 0; y < mapSize; y++ ) |
{ |
// |
for ( x = 0; x < mapSize; x++ ) |
{ |
// ïðîâåðÿåì ãîðèçîíòàëüíûå öåïî÷êè èç äâóõ ñèìâîëîâ |
if ( x < (mapSize - 1) ) |
{ |
// |
if ( gameMap[ndx] == gameMap[ndx+1] ) |
{ |
// íàøëè öåïî÷êó èç äâóõ áëîêîâ |
// ïðîâåðêà áîíóñîâ |
if ( bonusSomeBlock == gameMap[ndx] ) return false; |
if ( bonusFreeBlock ) return false; |
// ïðîâåðêà îáû÷íûõ ïåðåñòàíîâîê |
if ( y > 0 ) |
{ |
// |
if ( x > 0 ) |
{ |
// |
if ( gameMap[ndx-mapSize-1] == gameMap[ndx] ) return false; |
} |
// |
if ( x < (mapSize - 2) ) |
{ |
// |
if ( gameMap[ndx-mapSize+2] == gameMap[ndx] ) return false; |
} |
} |
// |
if ( x > 1 ) |
{ |
// |
if ( gameMap[ndx-2] == gameMap[ndx] ) return false; |
} |
// |
if ( x < (mapSize - 3) ) |
{ |
// |
if ( gameMap[ndx+3] == gameMap[ndx] ) return false; |
} |
// |
if ( y < (mapSize - 1) ) |
{ |
// |
if ( x > 0 ) |
{ |
// |
if ( gameMap[ndx+mapSize-1] == gameMap[ndx] ) return false; |
} |
// |
if ( x < (mapSize - 2) ) |
{ |
// |
if ( gameMap[ndx+mapSize+2] == gameMap[ndx] ) return false; |
} |
} |
// ïðîâåðêà äèàãîíàëüíûõ ïåðåñòàíîâîê |
if ( bonusDiagBlock > 0 ) |
{ |
// |
if ( y > 0 ) |
{ |
// |
if ( x > 1 ) |
{ |
// |
if ( gameMap[ndx-mapSize-2] == gameMap[ndx] ) return false; |
} |
// |
if ( gameMap[ndx-mapSize] == gameMap[ndx] ) return false; |
// |
if ( x < (mapSize - 2) ) |
{ |
// |
if ( gameMap[ndx-mapSize+1] == gameMap[ndx] ) return false; |
} |
// |
if ( x < (mapSize - 3) ) |
{ |
// |
if ( gameMap[ndx-mapSize+3] == gameMap[ndx] ) return false; |
} |
} |
// |
if ( y < (mapSize - 1) ) |
{ |
// |
if ( x > 1 ) |
{ |
// |
if ( gameMap[ndx+mapSize-2] == gameMap[ndx] ) return false; |
} |
// |
if ( gameMap[ndx+mapSize] == gameMap[ndx] ) return false; |
// |
if ( x < (mapSize - 2) ) |
{ |
// |
if ( gameMap[ndx+mapSize+1] == gameMap[ndx] ) return false; |
} |
// |
if ( x < (mapSize - 3) ) |
{ |
// |
if ( gameMap[ndx+mapSize+3] == gameMap[ndx] ) return false; |
} |
} |
} // çàêîí÷åíà ïðîâåðêà äèàãîíàëüíûõ ïåðåñòàíîâîê |
} |
} |
// ïðîâåðÿåì ãîðèçîíòàëüíûå öåïî÷êè èç äâóõ áëîêîâ ñ ïðîìåæóòêîì |
if ( x < (mapSize - 2) ) |
{ |
// |
if ( gameMap[ndx] == gameMap[ndx+2] ) |
{ |
// íàøëè äâà áëîêà ñ ïðîìåæóòêîì |
// ïðîâåðêà áîíóñîâ |
if ( bonusSomeBlock == gameMap[ndx] ) return false; |
if ( bonusFreeBlock ) return false; |
// |
if ( y > 0 ) |
{ |
// |
if ( gameMap[ndx-mapSize+1] == gameMap[ndx] ) return false; |
} |
// |
if ( y < (mapSize-1) ) |
{ |
// |
if ( gameMap[ndx+mapSize+1] == gameMap[ndx] ) return false; |
} |
// ïðîâåðêà äèàãîíàëüíûõ ïåðåñòàíîâîê |
if ( bonusDiagBlock > 0 ) |
{ |
// |
if ( y > 0 ) |
{ |
// |
if ( gameMap[ndx-mapSize] == gameMap[ndx] ) return false; |
// |
if ( gameMap[ndx-mapSize+2] == gameMap[ndx] ) return false; |
} |
// |
if ( y < (mapSize-1) ) |
{ |
// |
if ( gameMap[ndx+mapSize] == gameMap[ndx] ) return false; |
// |
if ( gameMap[ndx+mapSize+2] == gameMap[ndx] ) return false; |
} |
} |
} |
} |
// ïðîâåðÿåì âåðòèêàëüíûå öåïî÷êè èç äâóõ ñèìâîëîâ |
if ( y < (mapSize - 1) ) |
{ |
// |
if ( gameMap[ndx] == gameMap[ndx+mapSize] ) |
{ |
// íàøëè öåïî÷êó èç äâóõ áëîêîâ |
// ïðîâåðêà áîíóñîâ |
if ( bonusSomeBlock == gameMap[ndx] ) return false; |
if ( bonusFreeBlock ) return false; |
// |
if ( x > 0 ) |
{ |
// |
if ( y > 0 ) |
{ |
// |
if ( gameMap[ndx-1-mapSize] == gameMap[ndx] ) return false; |
} |
// |
if ( y < (mapSize - 2) ) |
{ |
// |
if ( gameMap[ndx-1+(2*mapSize)] == gameMap[ndx] ) return false; |
} |
} |
// |
if ( y > 1 ) |
{ |
// |
if ( gameMap[ndx-(2*mapSize)] == gameMap[ndx] ) return false; |
} |
// |
if ( y < (mapSize - 3) ) |
{ |
// |
if ( gameMap[ndx+(3*mapSize)] == gameMap[ndx] ) return false; |
} |
// |
if ( x < (mapSize - 1) ) |
{ |
// |
if ( y > 0 ) |
{ |
// |
if ( gameMap[ndx+1-mapSize] == gameMap[ndx] ) return false; |
} |
// |
if ( y < (mapSize - 2) ) |
{ |
// |
if ( gameMap[ndx+1+(2*mapSize)] == gameMap[ndx] ) return false; |
} |
} |
// ïðîâåðêà äèàãîíàëüíûõ ïåðåñòàíîâîê |
if ( bonusDiagBlock > 0 ) |
{ |
// |
if ( x > 0 ) |
{ |
// |
if ( y > 1 ) |
{ |
// |
if ( gameMap[ndx-1-(2*mapSize)] == gameMap[ndx] ) return false; |
} |
// |
if ( gameMap[ndx-1] == gameMap[ndx] ) return false; |
// |
if ( y < (mapSize - 2) ) |
{ |
// |
if ( gameMap[ndx-1+mapSize] == gameMap[ndx] ) return false; |
} |
// |
if ( y < (mapSize - 3) ) |
{ |
// |
if ( gameMap[ndx-1+(3*mapSize)] == gameMap[ndx] ) return false; |
} |
} |
// |
if ( x < (mapSize - 1) ) |
{ |
// |
if ( y > 1 ) |
{ |
// |
if ( gameMap[ndx+1-(2*mapSize)] == gameMap[ndx] ) return false; |
} |
// |
if ( gameMap[ndx+1] == gameMap[ndx] ) return false; |
// |
if ( y < (mapSize - 2) ) |
{ |
// |
if ( gameMap[ndx+1+mapSize] == gameMap[ndx] ) return false; |
} |
// |
if ( y < (mapSize - 3) ) |
{ |
// |
if ( gameMap[ndx+1+(3*mapSize)] == gameMap[ndx] ) return false; |
} |
} |
} // çàêîí÷åíà ïðîâåðêà äèàãîíàëüíûõ ïåðåñòàíîâîê |
} |
} |
// ïðîâåðÿåì âåðòèêàëüíûå öåïî÷êè èç äâóõ áëîêîâ ñ ïðîìåæóòêîì |
if ( y < (mapSize - 2) ) |
{ |
// |
if ( gameMap[ndx] == gameMap[ndx+(2*mapSize)] ) |
{ |
// íàøëè äâà áëîêà ñ ïðîìåæóòêîì |
// ïðîâåðêà áîíóñîâ |
if ( bonusSomeBlock == gameMap[ndx] ) return false; |
if ( bonusFreeBlock ) return false; |
// |
if ( x > 0 ) |
{ |
// |
if ( gameMap[ndx-1+mapSize] == gameMap[ndx] ) return false; |
} |
// |
if ( x < (mapSize-1) ) |
{ |
// |
if ( gameMap[ndx+1+mapSize] == gameMap[ndx] ) return false; |
} |
// ïðîâåðêà äèàãîíàëüíûõ ïåðåñòàíîâîê |
if ( bonusDiagBlock > 0 ) |
{ |
// |
if ( x > 0 ) |
{ |
// |
if ( gameMap[ndx-1] == gameMap[ndx] ) return false; |
// |
if ( gameMap[ndx-1+(2*mapSize)] == gameMap[ndx] ) return false; |
} |
// |
if ( x < (mapSize-1) ) |
{ |
// |
if ( gameMap[ndx+1] == gameMap[ndx] ) return false; |
// |
if ( gameMap[ndx+1+(2*mapSize)] == gameMap[ndx] ) return false; |
} |
} |
} |
} |
// |
ndx++; |
} |
} |
// |
gameWndTitle = gameWndTitle2; |
// |
return true; |
} |
// |
bool exterminateLines() |
{ |
int deletedBlocks, btn, i, j; |
bool needRedrawBonus = false; |
// |
btn = gameLevel > 5 ? blockTypesNum : 5 + gameLevel; |
// |
playerScore += GetScoreByBlocks( deletedBlocks = findBlockLines() ); |
// |
if ( ! freezeBonuses ) |
{ |
// |
if ( gameLevel >= 2 && bonusSomeBlock <= 0 ) bonusSomeBlockCount += deletedBlocks; |
if ( gameLevel >= 3 && !bonusFreeBlock ) bonusFreeBlockCount += deletedBlocks; |
if ( gameLevel >= 4 && bonusDiagBlock <= 0 ) bonusDiagBlockCount += deletedBlocks; |
// ïåðâûé áîíóñ |
if ( |
( bonusSomeBlockCount >= bonusSomeBlockEdge || ( gameLevel >= 2 && deletedBlocks >= 4 ) ) |
&& bonusSomeBlock <= 0 |
) |
{ |
bonusSomeBlock = ( rtlRand() % btn ) + 1; |
needRedrawBonus = true; |
if ( bonusSomeBlockCount >= bonusSomeBlockEdge ) bonusSomeBlockCount = 0; |
} |
if ( bonusSomeBlockCount >= bonusSomeBlockEdge ) bonusSomeBlockCount = 0; |
// âòîðîé áîíóñ |
if ( bonusFreeBlockCount >= bonusFreeBlockEdge || ( gameLevel >=3 && deletedBlocks >= 5 ) ) |
{ |
bonusFreeBlock = true; |
needRedrawBonus = true; |
if ( bonusFreeBlockCount >= bonusFreeBlockEdge ) bonusFreeBlockCount = 0; |
} |
if ( bonusFreeBlockCount >= bonusFreeBlockEdge ) bonusFreeBlockCount = 0; |
// òðåòèé áîíóñ |
if ( bonusDiagBlockCount >= bonusDiagBlockEdge || ( gameLevel >= 4 && deletedBlocks >= 6 ) ) |
{ |
bonusDiagBlock = 3; |
needRedrawBonus = true; |
if ( bonusDiagBlockCount >= bonusDiagBlockEdge ) bonusDiagBlockCount = 0; |
} |
if ( bonusDiagBlockCount >= bonusDiagBlockEdge ) bonusDiagBlockCount = 0; |
// |
bonusSomeBlockProgressCount = ( ( ( bonusSomeBlockCount > bonusSomeBlockEdge ) ? bonusSomeBlockEdge : bonusSomeBlockCount ) * bonusSomeBlockProgressStep ) / 1024; |
// |
bonusFreeBlockProgressCount = ( ( ( bonusFreeBlockCount > bonusFreeBlockEdge ) ? bonusFreeBlockEdge : bonusFreeBlockCount ) * bonusFreeBlockProgressStep ) / 1024; |
// |
bonusDiagBlockProgressCount = ( ( ( bonusDiagBlockCount > bonusDiagBlockEdge ) ? bonusDiagBlockEdge : bonusDiagBlockCount ) * bonusDiagBlockProgressStep ) / 1024; |
// |
if ( needRedrawBonus ) drawBonuses(); |
} |
// |
j = toRemoveList.GetCount(); |
// |
for ( i = 0; i < j; i++ ) |
{ |
gameMap[toRemoveList[i].ndx] = EMPTY_PLACE; |
} |
// |
return toRemoveList.GetCount() > 0; |
} |
// çàïîëíåíèå èãðîâîãî ïîëÿ ñëó÷àéíîé êîìáèíàöèåé áëîêîâ |
void initGameMap() |
{ |
int i, localScore, localInserted, btn; |
// |
btn = gameLevel > 5 ? blockTypesNum : 5 + gameLevel; |
// |
for ( i = 0; i < (mapSize * mapSize); i++ ) |
{ |
gameMap[i] = ( rtlRand() % btn ) + 1; |
} |
// |
localScore = playerScore; |
localInserted = insertedBlocksCount; |
// |
freezeBonuses = true; |
// |
while ( exterminateLines() ) |
{ |
while ( insertNewBlocks() > 0 ); |
} |
// |
freezeBonuses = false; |
// |
playerScore = localScore; |
insertedBlocksCount = localInserted; |
} |
// îòîáðàçèòü áëîêè áîíóñîâ |
void drawBonuses() |
{ |
// |
kos_PutImage( |
selectedBlock != BONUS_SOMEBLOCK_SELECTED ? |
fishki[bonusSomeBlock]->GetBits() : |
fishki[bonusSomeBlock]->GetHighlightedBits(), |
blockSize, blockSize, |
BONUS_SOMEBLOCK_LEFT, BONUS_SOMEBLOCK_TOP |
); |
// |
kos_PutImage( |
bonusFreeBlock ? |
( |
selectedBlock != BONUS_FREEBLOCK_SELECTED ? |
fishki[BONUS_FREE_BLOCK]->GetBits() : |
fishki[BONUS_FREE_BLOCK]->GetHighlightedBits() |
) : |
fishki[0]->GetBits(), |
blockSize, blockSize, |
BONUS_FREEBLOCK_LEFT, BONUS_FREEBLOCK_TOP |
); |
// |
kos_PutImage( |
bonusDiagBlock > 0 ? |
fishki[bonusDiagBlock+BONUS_DIAG_BLOCK-1]->GetBits() : |
fishki[0]->GetBits(), |
blockSize, blockSize, |
BONUS_DIAGBLOCK_LEFT, BONUS_DIAGBLOCK_TOP |
); |
} |
// îòîáðàçèòü èãðîâîå ïîëå |
void drawGameMap() |
{ |
int i, j, ndx; |
// |
for ( i = 0; i < mapSize; i++ ) |
{ |
// |
for ( j = 0; j < mapSize; j++ ) |
{ |
// |
ndx = (i*mapSize) + j; |
// |
kos_PutImage( |
ndx != selectedBlock ? |
fishki[gameMap[ndx]]->GetBits() : |
fishki[gameMap[ndx]]->GetHighlightedBits(), |
blockSize, blockSize, |
(j * blockSize) + blocksLeft, |
(i * blockSize) + blocksTop |
); |
} |
} |
} |
// êîîðäèíàòû êóðñîðà "ìûøè" |
int mX, mY; |
// ïðîâåðêà íà íàæàòèå ëåâîé êíîïêè "ìûøè" |
bool mouseLButtonDown() |
{ |
static bool isDown = false; |
Dword buttons; |
// |
kos_GetMouseState( buttons, mX, mY ); |
// |
if ( mouseButtonDisabled ) return false; |
// |
if ( ( buttons & 1 ) ) |
{ |
if ( isDown ) |
return false; |
else |
{ |
isDown = true; |
return true; |
} |
} |
else |
{ |
if ( isDown ) |
{ |
isDown = false; |
} |
return false; |
} |
} |
// |
void flipTwoBlocks( int ndx1, int ndx2 ) |
{ |
Word blX, blY, selX, selY; |
Byte fishCode; |
// |
blX = ( ndx1 % mapSize ) * blockSize + blocksLeft; |
blY = ( ndx1 / mapSize ) * blockSize + blocksTop; |
selX = ( ndx2 % mapSize ) * blockSize + blocksLeft; |
selY = ( ndx2 / mapSize ) * blockSize + blocksTop; |
// ïåðåñòàâèì áëîêè ìåñòàìè |
fishCode = gameMap[ndx1]; |
gameMap[ndx1] = gameMap[ndx2]; |
gameMap[ndx2] = fishCode; |
// èçîáðàæåíèå áëîêà |
kos_PutImage( |
fishki[gameMap[ndx1]]->GetBits(), |
blockSize, blockSize, |
blX, |
blY |
); |
// èçîáðàæåíèå áëîêà |
kos_PutImage( |
fishki[gameMap[ndx2]]->GetBits(), |
blockSize, blockSize, |
selX, |
selY |
); |
} |
// èãðîâîé ïðîöåññ |
int GameLoop() |
{ |
int result, ndx, blX, blY, selX, selY, ddX, ddY, nSel; |
Byte keyCode, mCode; |
bool needDecBonus; |
Dword buttonID; |
// |
gameWndTitle = gameWndTitle1; |
gameFace.GetSize( gcx, gcy ); |
gameLevel = startGameLevel; |
playerScore = 0; |
bonusSomeBlock = 0; |
bonusFreeBlock = false; |
bonusDiagBlock = 0; |
bonusSomeBlockCount = 0; |
bonusFreeBlockCount = 0; |
bonusDiagBlockCount = 0; |
bonusSomeBlockProgressCount = 0; |
bonusFreeBlockProgressCount = 0; |
bonusDiagBlockProgressCount = 0; |
SetLevelVariables(); |
mouseButtonDisabled = false; |
initGameMap(); |
// |
kos_ChangeWindow( -1, -1, gcx + 1, gcy + 21 ); |
// |
for ( result = GM_NONE; result == GM_NONE; ) |
{ |
switch( kos_WaitForEvent() ) |
{ |
// íàäî ïîëíîñòüþ ïåðåðèñîâàòü îêíî |
case 1: |
DrawGameWindow(); |
break; |
// êëàâèàòóðà |
case 2: |
if ( kos_GetKey( keyCode ) ) |
{ |
// |
switch ( keyCode ) |
{ |
case 0x1B: |
result = GM_ABORT; |
break; |
default: |
break; |
} |
} |
break; |
// êíîïêè |
case 3: |
if ( kos_GetButtonID( buttonID ) ) |
{ |
switch ( buttonID ) |
{ |
case 0xA: |
result = GM_ABORT; |
break; |
default: |
break; |
} |
} |
// ñîáûòèå îò ìûøè |
case 6: |
// íàæàòèå ëåâîé êíîïêè? |
if ( mouseLButtonDown() ) |
{ |
// ñ÷èòàåì êîîðäèíàòû îòíîñèòåëíî èãðîâîãî ïîëÿ |
blX = mX - blocksLeft; |
blY = mY - blocksTop; |
// ïîïàëî â èãðîâîå ïîëå? |
if ( blX >= 0 && blX < (mapSize * blockSize) |
&& blY >= 0 && blY < (mapSize * blockSize) ) |
{ |
// ïîëó÷àåì êîîðäèíàòû â áëîêàõ |
blX /= blockSize; |
blY /= blockSize; |
// ïîëó÷àåì íîìåð áëîêà íà êàðòå |
ndx = blX + ( blY * mapSize ); |
// åù¸ îäíà ïðîâåðêà, ÷òîáû íå âûëåçòè çà ïðåäåëû êàðòû |
if ( ndx >= 0 && ndx < (mapSize * mapSize) ) |
{ |
// íà÷èíàåì ïåðåðèñîâêó |
kos_WindowRedrawStatus( WRS_BEGIN ); |
// åñëè íå áûëî âûáðàííîãî áëîêà |
if ( selectedBlock == SELECTED_BLOCK_NONE ) |
{ |
// çàïîìíèì âûäåëåííûé áëîê |
selectedBlock = ndx; |
// îòìåòèì áëîê íà èãðîâîì ïîëå |
kos_PutImage( |
fishki[gameMap[selectedBlock]]->GetHighlightedBits(), |
blockSize, blockSize, |
( selectedBlock % mapSize ) * blockSize + blocksLeft, |
( selectedBlock / mapSize ) * blockSize + blocksTop |
); |
} |
else // ïîìå÷åííûé áëîê óæå åñòü |
{ |
if ( selectedBlock >= 0 ) |
{ |
// êîîðäèíàòû ïîìå÷åííîãî áëîêà |
selX = selectedBlock % mapSize; |
selY = selectedBlock / mapSize; |
// áûë âûáðàí äðóãîé áëîê? |
if ( ndx != selectedBlock ) |
{ |
// ñ÷èòàåì ðàçíîñòü êîîðäèíàò äâóõ áëîêîâ |
ddX = selX - blX; |
ddY = selY - blY; |
needDecBonus = ( bonusDiagBlock > 0 && abs(ddX) == 1 && abs(ddY) == 1 ); |
// åñëè ýòî ñîñåäíèé áëîê |
if ( |
( abs(ddX) == 1 && ddY == 0 ) |
|| ( abs(ddY) == 1 && ddX == 0 ) |
|| needDecBonus |
) |
{ |
// ïåðåñòàâèì áëîêè ìåñòàìè |
flipTwoBlocks( ndx, selectedBlock ); |
// |
kos_Pause( 16 ); |
// |
if ( findBlockLines() > 0 ) |
{ |
// |
if ( needDecBonus ) |
{ |
// |
--bonusDiagBlock; |
// |
drawBonuses(); |
} |
// ñíèìàåì ïîìåòêó ñ áëîêà |
selectedBlock = SELECTED_BLOCK_NONE; |
// |
while ( exterminateLines() ) |
{ |
// |
fadeOutBlocks(); |
// |
//drawGameMap(); |
//drawScore(); |
// |
//kos_Pause( 25 ); |
// |
while ( insertNewBlocks() > 0 ) |
{ |
// |
fallDownBlocks(); |
// |
//drawGameMap(); |
//kos_Pause( 30 ); |
} |
} |
// |
drawScore(); |
// |
levelProgressCount = ( ( ( insertedBlocksCount > levelBlocksLimit ) ? levelBlocksLimit : insertedBlocksCount ) * levelProgressStep ) / 1024; |
// |
drawGameMeters(); |
// |
if ( insertedBlocksCount > levelBlocksLimit ) |
{ |
kos_Pause( 50 ); |
gameLevel++; |
SetLevelVariables(); |
// |
//initGameMap(); |
// |
//DrawGameWindow(); |
// |
drawGameMeters(); |
drawLevelNum(); |
} |
else |
// |
if ( mouseButtonDisabled = checkGameOut() ) |
{ |
// |
DrawGameWindow(); |
} |
} |
else |
{ |
// íå ïîëó÷àåòñÿ ëèíèè, áëîêè ñòàâèì íà ìåñòî |
flipTwoBlocks( ndx, selectedBlock ); |
// ñíèìàåì ïîìåòêó ñ áëîêà |
selectedBlock = SELECTED_BLOCK_NONE; |
} |
} |
else // âûáðàí íåñîñåäíèé áëîê |
{ |
// ïåðåñòèì ìàðêåð |
kos_PutImage( |
fishki[gameMap[selectedBlock]]->GetBits(), |
blockSize, blockSize, |
selX * blockSize + blocksLeft, |
selY * blockSize + blocksTop |
); |
// ïîìåòèì âûáðàííûé áëîê |
selectedBlock = ndx; |
// íà èãðîâîì ïîëå |
kos_PutImage( |
fishki[gameMap[selectedBlock]]->GetHighlightedBits(), |
blockSize, blockSize, |
blX * blockSize + blocksLeft, |
blY * blockSize + blocksTop |
); |
} |
} |
else // âûáðàí òîò æå áëîê |
{ |
// ñíèìàåì ïîìåòêó |
kos_PutImage( |
fishki[gameMap[selectedBlock]]->GetBits(), |
blockSize, blockSize, |
selX * blockSize + blocksLeft, |
selY * blockSize + blocksTop |
); |
// |
selectedBlock = SELECTED_BLOCK_NONE; |
} |
} |
else |
// òêíóëè â áëîê ïðè âûáðàííîì áîíóñå |
{ |
// |
mCode = gameMap[ndx]; |
// |
switch ( selectedBlock ) |
{ |
case BONUS_SOMEBLOCK_SELECTED: |
gameMap[ndx] = bonusSomeBlock; |
break; |
case BONUS_FREEBLOCK_SELECTED: |
gameMap[ndx] = BONUS_FREE_BLOCK; |
break; |
default: |
break; |
} |
// |
if ( findBlockLines() > 0 ) |
{ |
// óáèðàåì èñïîëüçîâàííûé áîíóñ |
switch ( selectedBlock ) |
{ |
case BONUS_SOMEBLOCK_SELECTED: |
bonusSomeBlock = 0; |
break; |
case BONUS_FREEBLOCK_SELECTED: |
bonusFreeBlock = false; |
break; |
default: |
break; |
} |
// íà ýêðàíå òîæå |
drawBonuses(); |
drawGameMap(); |
kos_Pause( 16 ); |
// óáèðàåì áëîêè |
// ñíèìàåì ïîìåòêó ñ áëîêà |
selectedBlock = SELECTED_BLOCK_NONE; |
// |
while ( exterminateLines() ) |
{ |
// |
fadeOutBlocks(); |
// |
//drawGameMap(); |
//drawScore(); |
// |
//kos_Pause( 25 ); |
// |
while ( insertNewBlocks() > 0 ) |
{ |
// |
fallDownBlocks(); |
// |
//drawGameMap(); |
//kos_Pause( 30 ); |
} |
} |
// |
drawScore(); |
// |
levelProgressCount = ( ( ( insertedBlocksCount > levelBlocksLimit ) ? levelBlocksLimit : insertedBlocksCount ) * levelProgressStep ) / 1024; |
// |
drawGameMeters(); |
// |
if ( insertedBlocksCount > levelBlocksLimit ) |
{ |
kos_Pause( 50 ); |
gameLevel++; |
SetLevelVariables(); |
// |
//initGameMap(); |
// |
//DrawGameWindow(); |
// |
drawGameMeters(); |
drawLevelNum(); |
} |
else |
// |
mouseButtonDisabled = checkGameOut(); |
} |
else |
// áîíóñ çäåñü íåïðèìåíèì |
{ |
// âåðí¸ì âçàä |
gameMap[ndx] = mCode; |
// ïîìåòèì áëîê |
selectedBlock = ndx; |
// íà èãðîâîì ïîëå |
kos_PutImage( |
fishki[gameMap[selectedBlock]]->GetHighlightedBits(), |
blockSize, blockSize, |
blX * blockSize + blocksLeft, |
blY * blockSize + blocksTop |
); |
// óáåð¸ì ïîìåòêó ñ áîíóñà |
drawBonuses(); |
} |
} |
} |
// îïðåäåëèì êíîïêó |
kos_DefineButton( |
444+1, 2+21, |
54, 20, |
0x6000000A, |
0 |
); |
// çàâåðøàåì ïåðåðèñîâêó |
kos_WindowRedrawStatus( WRS_END ); |
} |
} |
else |
// ïðîâåðèì ïîïàäàíèå â áîíóñû |
{ |
nSel = 0; |
// |
if ( mX >= BONUS_SOMEBLOCK_LEFT && (mX - BONUS_SOMEBLOCK_LEFT) <= blockSize |
&& mY >= BONUS_SOMEBLOCK_TOP && (mY - BONUS_SOMEBLOCK_TOP ) <= blockSize ) |
{ |
// |
nSel = BONUS_SOMEBLOCK_SELECTED; |
} |
// |
if ( mX >= BONUS_FREEBLOCK_LEFT && (mX - BONUS_FREEBLOCK_LEFT) <= blockSize |
&& mY >= BONUS_FREEBLOCK_TOP && (mY - BONUS_FREEBLOCK_TOP ) <= blockSize ) |
{ |
// |
nSel = BONUS_FREEBLOCK_SELECTED; |
} |
// |
if ( mX >= BONUS_DIAGBLOCK_LEFT && (mX - BONUS_DIAGBLOCK_LEFT) <= blockSize |
&& mY >= BONUS_DIAGBLOCK_TOP && (mY - BONUS_DIAGBLOCK_TOP ) <= blockSize ) |
{ |
// |
nSel = BONUS_DIAGBLOCK_SELECTED; |
} |
// |
if ( nSel != 0 ) |
{ |
// |
if ( selectedBlock > 0 ) |
{ |
// ñíèìàåì ïîìåòêó |
kos_PutImage( |
fishki[gameMap[selectedBlock]]->GetBits(), |
blockSize, blockSize, |
(selectedBlock % mapSize) * blockSize + blocksLeft, |
(selectedBlock / mapSize) * blockSize + blocksTop |
); |
} |
// |
if ( selectedBlock != nSel ) |
selectedBlock = nSel; |
else |
selectedBlock = SELECTED_BLOCK_NONE; |
// |
drawBonuses(); |
} |
} |
} |
// |
break; |
default: |
break; |
} |
} |
// îòìåíèì êíîïêó |
kos_DefineButton( |
0, 0, |
0, 0, |
0x8000000A, |
0 |
); |
// |
if ( gameLevel > maxGameLevel ) maxGameLevel = gameLevel; |
// |
return result; |
} |
// |
void drawLevelNum() |
{ |
Word startX; |
// |
if ( gameLevel > 9 ) |
{ |
// |
startX = LEVEL_LEFT; |
// |
kos_PutImage( |
gameNumbers.GetBits() + ( ( gameLevel / 10 ) * NUM_WIDTH * NUM_HEIGHT ), |
NUM_WIDTH, NUM_HEIGHT, |
startX, LEVEL_TOP |
); |
// |
startX += NUM_WIDTH; |
} |
else |
{ |
// |
startX = LEVEL_LEFT + ( (LEVEL_WIDTH - NUM_WIDTH) / 2 ); |
} |
// |
kos_PutImage( |
gameNumbers.GetBits() + ( ( gameLevel % 10 ) * NUM_WIDTH * NUM_HEIGHT ), |
NUM_WIDTH, NUM_HEIGHT, |
startX, LEVEL_TOP |
); |
} |
// |
void drawScore() |
{ |
Word startX; |
int i, j; |
char strNum[8]; |
// ÷èñëî â òåêñòîâîì âèäå |
sprintf( strNum, "%U", playerScore ); |
// |
j = strlen( strNum ); |
// |
startX = SCORE_LEFT + ( ( SCORE_WIDTH - ( NUM_WIDTH * j ) ) / 2 ); |
// |
for ( i = 0; i < j; i++ ) |
{ |
// |
kos_PutImage( |
gameNumbers.GetBits() + ( ( strNum[i] - '0' ) * NUM_WIDTH * NUM_HEIGHT ), |
NUM_WIDTH, NUM_HEIGHT, |
startX, SCORE_TOP |
); |
// |
startX += NUM_WIDTH; |
} |
} |
// |
void DrawGameWindow() |
{ |
// |
kos_WindowRedrawStatus( WRS_BEGIN ); |
// îêíî |
kos_DefineAndDrawWindow( |
WNDLEFT, WNDTOP, |
gcx + 1, gcy + 21, |
0, 0x0, |
0, WNDHEADCOLOUR, |
WNDHEADCOLOUR |
); |
// çàãîëîâîê îêíà |
kos_WriteTextToWindow( |
4, 7, |
0x10, WNDTITLECOLOUR, |
gameWndTitle, strlen(gameWndTitle) |
); |
// |
gameFace.Draw( 1, 21 ); |
drawGameMap(); |
drawGameMeters(); |
drawBonuses(); |
// íîìåð óðîâíÿ |
drawLevelNum(); |
drawScore(); |
// |
if ( mouseButtonDisabled ) |
{ |
// |
kos_DrawBar( |
( gcx + 1 - 160 ) / 2, ( gcy + 21 - 32 ) / 2, |
160, 32, |
0x2383B3 |
); |
// |
kos_WriteTextToWindow( |
( gcx + 1 - sizeof( gameOverText ) * 6 ) / 2, ( gcy + 21 - 9 ) / 2, |
0x0, 0xF7F7F7, |
gameOverText, |
sizeof( gameOverText ) |
); |
} |
// îïðåäåëèì êíîïêó |
kos_DefineButton( |
444+1, 2+21, |
54, 20, |
0x6000000A, |
0 |
); |
// |
kos_WindowRedrawStatus( WRS_END ); |
} |
// |
void fadeOutBlocks() |
{ |
int i, j, k, ndx, x, y; |
// |
j = toRemoveList.GetCount(); |
// |
for ( k = 0; k < 4; k++ ) |
{ |
// |
__asm{ |
push eax |
push ebx |
mov eax, 18 |
mov ebx, 14 |
int 0x40 |
pop eax |
pop ebx |
} |
// |
for ( i = 0; i < j; i++ ) |
{ |
// |
ndx = toRemoveList[i].ndx; |
y = ndx / mapSize; |
x = ndx % mapSize; |
// |
kos_PutImage( |
gameBlocksZ[k].GetBits() + ( (toRemoveList[i].value - 1) * blockSize * blockSize ), |
blockSize, blockSize, |
(x * blockSize) + blocksLeft, |
(y * blockSize) + blocksTop |
); |
} |
// |
kos_Pause( 3 ); |
} |
//clear |
for ( i = 0; i < j; i++ ) |
{ |
// |
ndx = toRemoveList[i].ndx; |
y = ndx / mapSize; |
x = ndx % mapSize; |
// |
kos_DrawBar( |
(x * blockSize) + blocksLeft, |
(y * blockSize) + blocksTop, |
blockSize, blockSize, 0 |
); |
} |
// |
kos_Pause( 16 ); |
} |
// |
void fallDownBlocks() |
{ |
int i, j, k, ndx, x, y, height, offset; |
// |
j = toFallList.GetCount(); |
// |
for ( k = 1; k <= blockSize; k += 2 ) |
{ |
// |
__asm{ |
push eax |
push ebx |
mov eax, 18 |
mov ebx, 14 |
int 0x40 |
pop eax |
pop ebx |
} |
// |
for ( i = 0; i < j; i++ ) |
{ |
// |
ndx = toFallList[i]; |
// |
y = ( ( ( ndx / mapSize ) - 1 ) * blockSize ) + k; |
if ( y < 0 ) |
{ |
y = 0; |
height = k; |
offset = blockSize - k; |
} |
else |
{ |
offset = 0; |
height = blockSize; |
} |
// |
x = ( ndx % mapSize ) * blockSize; |
// |
kos_PutImage( |
fishki[gameMap[ndx]]->GetBits() + ( offset * blockSize ), |
blockSize, height, |
x + blocksLeft, |
y + blocksTop |
); |
} |
// |
kos_Pause( 1 ); |
} |
} |
/programs/games/fara/trunk/gameWnd.h |
---|
0,0 → 1,29 |
// gameWnd.h |
extern CKosBitmap gameFace; |
extern CKosBitmap gameBlocks; |
extern CKosBitmap gameNumbers; |
extern CKosBitmap gameBlocksZ[4]; |
extern CFishka *fishki[blocksNum]; |
extern Dword playerScore; |
#define GM_NONE 0 |
#define GM_TOP10 1 |
#define GM_ABORT 2 |
#define NUM_WIDTH 12 |
#define NUM_HEIGHT 20 |
#define SCORE_LEFT (9+2) |
#define SCORE_TOP (57+22) |
#define SCORE_WIDTH 72 |
#define LEVEL_LEFT (66+2) |
#define LEVEL_TOP (89+22) |
#define LEVEL_WIDTH 24 |
// |
void DrawGameWindow(); |
// |
int GameLoop(); |
/programs/games/fara/trunk/gfxdef.cpp |
---|
0,0 → 1,285 |
#include "kosSyst.h" |
#include "KosFile.h" |
#include "gfxdef.h" |
#include "crc32.h" |
extern "C" void __stdcall lzma_decompress( |
const void* source, |
void* destination, |
unsigned dest_length); |
struct export_item |
{ |
const char* name; |
const void* func; |
}; |
typedef void* (__stdcall *img_decode_t)(const void* data, unsigned len, void* parameters); |
typedef void (__stdcall *img_to_rgb2_t)(const void* image, void* destination); |
typedef void (__stdcall *img_destroy_t)(void* image); |
typedef void (__stdcall *img_lib_init_t)(void); // really fastcall with 4 args, but called from asm code |
img_lib_init_t img_lib_init = NULL; |
img_decode_t img_decode = NULL; |
img_to_rgb2_t img_to_rgb2 = NULL; |
img_destroy_t img_destroy = NULL; |
export_item* libini_exports = NULL; |
static const char libini_name[] = "/sys/lib/libimg.obj"; |
extern "C" int strcmp(const char* str1, const char* str2); |
#pragma intrinsic(strcmp) |
void jpeg_decompress( |
const void* source, |
unsigned source_length, |
void* destination, |
unsigned dest_length) |
{ |
if (!libini_exports) |
{ |
__asm |
{ |
mov eax, 68 |
mov ebx, 19 |
mov ecx, offset libini_name |
int 40h |
mov [libini_exports], eax |
} |
if (!libini_exports) |
{ |
rtlDebugOutString("Cannot load libimg.obj"); |
kos_ExitApp(); |
} |
for (export_item* p = libini_exports; p->name; p++) |
{ |
if (!strcmp(p->name,"lib_init")) |
img_lib_init = (img_lib_init_t)p->func; |
else if (!strcmp(p->name,"img_decode")) |
img_decode = (img_decode_t)p->func; |
else if (!strcmp(p->name,"img_to_rgb2")) |
img_to_rgb2 = (img_to_rgb2_t)p->func; |
else if (!strcmp(p->name,"img_destroy")) |
img_destroy = (img_destroy_t)p->func; |
} |
if (!img_lib_init || !img_decode || !img_to_rgb2 || !img_destroy) |
{ |
rtlDebugOutString("Required exports were not found in libimg.obj"); |
kos_ExitApp(); |
} |
__asm |
{ |
mov eax, offset kos_malloc |
mov ebx, offset kos_free |
mov ecx, offset kos_realloc |
call img_lib_init |
} |
} |
void* image = img_decode(source, source_length, NULL); |
if (!image) |
{ |
rtlDebugOutString("JPEG error"); |
kos_ExitApp(); |
} |
img_to_rgb2(image, destination); |
img_destroy(image); |
} |
////// CKosBitmap |
CKosBitmap::CKosBitmap() |
{ |
this->bmpID = -1; |
this->buffer = NULL; |
this->sizeX = 0; |
this->sizeY = 0; |
} |
CKosBitmap::~CKosBitmap() |
{ |
if ( this->buffer != NULL ) delete this->buffer; |
} |
// § £à㧪 ¨§ ᦠ⮣® ä ©« |
bool CKosBitmap::LoadFromArch( SCompBmpHeader *bmpArchDesc, CKosFile *fromFile, int ID ) |
{ |
Byte *tmpBuff; |
// |
if ( this->buffer != NULL ) |
{ |
delete this->buffer; |
this->buffer = NULL; |
} |
// |
this->buffer = new RGB[bmpArchDesc->sizeX * bmpArchDesc->sizeY]; |
// |
tmpBuff = new Byte[bmpArchDesc->compressedSize]; |
// |
fromFile->Seek( SEEK_SET, bmpArchDesc->physicalOffset ); |
if ( fromFile->Read( tmpBuff, bmpArchDesc->compressedSize ) == bmpArchDesc->compressedSize ) |
{ |
// |
if ( bmpArchDesc->compressedSize == bmpArchDesc->uncompressedSize+1) |
{ |
// JPEG image |
jpeg_decompress( tmpBuff, bmpArchDesc->compressedSize, |
this->buffer, bmpArchDesc->sizeX * bmpArchDesc->sizeY * 3); |
} |
else if ( bmpArchDesc->compressedSize != bmpArchDesc->uncompressedSize ) |
{ |
// LZMA-packed BMP |
lzma_decompress( tmpBuff, this->buffer, bmpArchDesc->uncompressedSize); |
} |
else |
{ |
// |
memcpy( (Byte *)(this->buffer), tmpBuff, bmpArchDesc->compressedSize ); |
} |
// |
this->sizeX = bmpArchDesc->sizeX; |
this->sizeY = bmpArchDesc->sizeY; |
this->bmpID = ID; |
} |
// |
delete tmpBuff; |
// |
return true; |
} |
// ¢ë¢¥á⨠¢ ®ª® ª à⨪ã |
void CKosBitmap::Draw( Word x, Word y ) |
{ |
// |
if ( this->buffer != NULL ) |
// |
kos_PutImage( this->buffer, this->sizeX, this->sizeY, x, y ); |
} |
// ¯®«ãç¨âì 㪠§ â¥«ì ®¡« áâì ¤ ëå |
RGB * CKosBitmap::GetBits() |
{ |
return this->buffer; |
} |
// ¯®«ãç¨âì à §¬¥à ª à⨪¨ |
void CKosBitmap::GetSize( Word &cx, Word &cy ) |
{ |
cx = this->sizeX; |
cy = this->sizeY; |
} |
// ᮧ¤ âì ª à⨪㠨§ ¡®«ì襩 |
void CKosBitmap::Scale(Word size, RGB *mainBits) |
{ |
buffer = new RGB[(sizeX=blockSize)*(sizeY=blockSize*11)]; |
memset((Byte*)buffer,0,3*blockSize*blockSize*11); |
RGB* tmpBuf = new RGB[blockSize*size]; |
for (int k=0;k<11;k++) |
{ |
int delta = (blockSize - size)/2; |
int i,j; |
int a; |
int d1 = blockSize/size; |
int d2 = (blockSize-d1*(size))*256/size; |
// ᣫ ¦¨¢ ¨¥ ¯® £®à¨§®â «¨ |
RGB* ptrBuf = tmpBuf; |
for (j=0;j<blockSize;j++) |
{ |
RGB* srcBits = mainBits + blockSize*blockSize*(k+1) + blockSize*j; |
a = 0; |
for (i=0;i<size;i++) |
{ |
ptrBuf->b = srcBits->b + (srcBits[1].b-srcBits[0].b)*a/256; |
ptrBuf->g = srcBits->g + (srcBits[1].g-srcBits[0].g)*a/256; |
ptrBuf->r = srcBits->r + (srcBits[1].r-srcBits[0].r)*a/256; |
ptrBuf++; |
srcBits += d1; |
a += d2; |
if (a >= 256) |
{ |
a -= 256; |
srcBits++; |
} |
} |
} |
// ᣫ ¦¨¢ ¨¥ ¯® ¢¥à⨪ «¨ |
for (j=0;j<size;j++) |
{ |
ptrBuf = buffer + blockSize*blockSize*k + blockSize*delta + delta+j; |
RGB* srcBits = tmpBuf + j; |
a = 0; |
for (i=0;i<size;i++) |
{ |
ptrBuf->b = srcBits->b + (srcBits[size].b-srcBits[0].b)*a/256; |
ptrBuf->g = srcBits->g + (srcBits[size].g-srcBits[0].g)*a/256; |
ptrBuf->r = srcBits->r + (srcBits[size].r-srcBits[0].r)*a/256; |
ptrBuf += blockSize; |
srcBits += d1*size; |
a += d2; |
if (a >= 256) |
{ |
a -= 256; |
srcBits += size; |
} |
} |
} |
} |
delete tmpBuf; |
} |
////////////////////// CFishka /////////////////////// |
CFishka::CFishka( CKosBitmap *fromBmp, int yOffset, RGB insColour ) |
{ |
int i, c; |
// |
this->bits = fromBmp->GetBits() + (yOffset * blockSize); |
this->transColour = insColour; |
// |
this->highLighted = new RGB[blockSize * blockSize]; |
// |
for ( i = 0; i < (blockSize * blockSize); i++ ) |
{ |
// |
this->highLighted[i] = this->bits[i]; |
// |
if ( this->highLighted[i] != this->transColour ) |
{ |
c = ( this->highLighted[i].b * 185 ) / 100; |
this->highLighted[i].b = (c > 255) ? 255 : c; |
c = ( this->highLighted[i].g * 185 ) / 100; |
this->highLighted[i].g = (c > 255) ? 255 : c; |
c = ( this->highLighted[i].r * 185 ) / 100; |
this->highLighted[i].r = (c > 255) ? 255 : c; |
} |
} |
} |
// |
CFishka::~CFishka() |
{ |
// |
delete this->highLighted; |
} |
// |
RGB * CFishka::GetBits() |
{ |
return this->bits; |
} |
// |
RGB * CFishka::GetHighlightedBits() |
{ |
return this->highLighted; |
} |
/programs/games/fara/trunk/gfxdef.h |
---|
0,0 → 1,101 |
// gfxdef.h |
#define MAIN_FACE_NDX 0 |
#define GAME_FACE_NDX 1 |
#define BUTTONS_NDX 2 |
#define NUMBERS_NDX 3 |
#define BONUS_FREE_BLOCK 11 |
#define BONUS_DIAG_BLOCK 12 |
#define WNDLEFT 64 |
#define WNDTOP 64 |
#define WNDHEADCOLOUR 0xD4C233 |
#define WNDTITLECOLOUR 0x47151C |
// |
#define blockSize 41 |
#define blocksNum 15 |
extern int maxGameLevel; |
extern int startGameLevel; |
#define START_LEVEL 1 |
//// |
//struct CPoint |
//{ |
// int x, y; |
// // |
// CPoint() |
// { |
// this->x = 0; |
// this->y = 0; |
// }; |
// // |
// CPoint( int iX, int iY ) |
// { |
// this->x = iX; |
// this->y = iY; |
// }; |
// // |
// CPoint( CPoint &pt ) |
// { |
// this->x = pt.x; |
// this->y = pt.y; |
// }; |
//}; |
// îïèñàíèå ñæàòîãî áèòìàïà â ôàéëå |
struct SCompBmpHeader |
{ |
short int sizeX; |
short int sizeY; |
int compressedSize; |
int physicalOffset; |
int uncompressedSize; |
}; |
// ñëàññ áèòìàïà äëÿ èñïîëüçîâàíèÿ â ïðîãðàììå |
class CKosBitmap |
{ |
protected: |
int bmpID; |
RGB *buffer; |
Word sizeX; |
Word sizeY; |
public: |
CKosBitmap(); |
~CKosBitmap(); |
// çàãðóçêà èç ñæàòîãî ôàéëà |
bool LoadFromArch( SCompBmpHeader *bmpArchDesc, CKosFile *fromFile, int ID ); |
// âûâåñòè â îêíî êàðòèíêó |
void Draw( Word x, Word y ); |
// ïîëó÷èòü óêàçàòåëü íà îáëàñòü äàííûõ |
RGB *GetBits(); |
// ïîëó÷èòü ðàçìåð êàðòèíêè |
void GetSize( Word &cx, Word &cy ); |
// ñîçäàòü êàðòèíêó ïî êàðòèíêå áîëüøåãî ðàçìåðà |
void Scale(Word size, RGB* mainBits); |
}; |
// êëàññ ôèøêè èãðîâîãî ïîëÿ |
class CFishka |
{ |
protected: |
// |
RGB *bits; |
// |
RGB transColour; |
// |
RGB *highLighted; |
public: |
CFishka( CKosBitmap *fromBmp, int yOffset, RGB insColour ); |
virtual ~CFishka(); |
virtual RGB * GetBits(void); |
virtual RGB * GetHighlightedBits(void); |
}; |
/programs/games/fara/trunk/gmplace.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/fara/trunk/gmplace.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/fara/trunk/grobfar.txt |
---|
0,0 → 1,31 |
ÃÐÎÁÍÈÖÀ ÔÀÐÀÎÍÀ |
Ñìûñë èãðû ñîñòîèò â òîì, ÷òîáû, ïåðåìåùàÿ èåðîãëèôû íà âõîäå â î÷åðåäíóþ êîìíàòó ãðîáíèöû ôàðàîíà (8Õ8), îòêðûòü ïðîõîä. |
Âû ìîæåòå ìåíÿòü ìåñòàìè äâà èåðîãëèôà ðàñïîëîæåííûõ ðÿäîì ïî âåðòèêàëè èëè ãîðèçîíòàëè â ñëó÷àå, åñëè ïðè òàêîé ïåðåñòàíîâêå îáðàçóåòñÿ êîìáèíàöèÿ èç òðåõ èëè áîëåå îäèíàêîâûõ êàðòèíîê â ðÿä. Òàêèå ðÿäû òóò æå èñ÷åçàþò, à ñâîáîäíîå ìåñòî çàïîëíÿåòñÿ èåðîãëèôàìè "îñûïàâøèìèñÿ" ñâåðõó. Íåäîñòàþùèå èåðîãëèôû ãåíåðèðóþòñÿ ñëó÷àéíûì îáðàçîì. |
Çà èñ÷åçàþùèå èåðîãëèôû íà÷èñëÿþòñÿ î÷êè. Çà êîìáèíàöèþ èç èåðîãëèôîâ äàþòñÿ î÷êè ïî ôîðìóëå L+(L+1)^(N-3), íî íå áîëåå 20*L*N, ãäå N - ÷èñëî èåðîãëèôîâ â êîìáèíàöèè, à L - íîìåð óðîâíÿ. |
Äëÿ òîãî, ÷òîáû ïåðåéòè ñ îäíîãî óðîâíÿ íà äðóãîé, íåîáõîäèìî óáðàòü îïðåäåë¸ííîå ÷èñëî èåðîãëèôîâ (íà êàæäîì óðîâíå ðàçíîå). Ñíèçó îò ïàíåëè ñ èåðîãëèôàìè ðàñïîëîæåíà ïîëîñêà, îòìå÷àþùàÿ ñêîëüêî ïðîéäåíî è ñêîëüêî îñòàëîñü èåðîãëèôîâ. |
1-é óðîâåíü - 500 |
2-é óðîâåíü - 450 |
3-é óðîâåíü - 400 |
4-é óðîâåíü - 350 |
5-é óðîâåíü - 300 |
6-é è äàëåå - 50*(L+1) |
Íà ïåðâîì óðîâíå êîìáèíàöèè ñîñòàâëÿþòñÿ èç 6 âèäîâ èåðîãëèôîâ. Ñ êàæäûì íîâûì óðîâíåì â êîìáèíàöèÿõ íà÷èíàåò ó÷àñòâîâàòü îäèí íîâûé èåðîãëèô, íî âñåãî íå áîëåå 10 (ò.å. íà÷èíàÿ ñ 5-ãî óðîâíÿ è äàëåå â èãðå áóäåò 10 ðàçíûõ èåðîãëèôîâ, íå ó÷èòûâàÿ ñïåöèàëüíûõ). |
Íà÷èíàÿ ñî 2-ãî óðîâíÿ çà êàæäóþ êîìáèíàöèþ èç 4-õ è áîëåå èåðîãëèôîâ, à òàêæå çà ïðîõîæäåíèå êàæäîé ÷åòâåðòè óðîâíÿ èãðîê ïîëó÷àåò "ñâîáîäíûé" èåðîãëèô - ýòî îáû÷íûé èåðîãëèô (ñãåíåðèðîâàííûé ñëó÷àéíûì îáðàçîì), êîòîðûé õðàíèòñÿ ó èãðîêà "â êàðìàíå" è ïðè íåîáõîäèìîñòè ìîæåò áûòü âñòàâëåí èãðîêîì íà ëþáîå ìåñòî, çàìåíèâ òåì ñàìûì ðàñïîëîæåííûé òàì èåðîãëèô. |
Íà÷èíàÿ ñ 3-ãî óðîâíÿ çà êàæäóþ êîìáèíàöèþ èç 5-òè è áîëåå èåðîãëèôîâ, à òàêæå çà ïðîõîæäåíèå êàæäîé òðåòè óðîâíÿ èãðîê ïîëó÷àåò "óíèâåðñàëüíûé êëþ÷" , ïîäõîäÿùèé ê ëþáîé êîìáèíàöèè èåðîãëèôîâ è ê íåñêîëüêèì ðàçíûì êîìáèíàöèÿì îäíîâðåìåííî. |
Íà÷èíàÿ ñ 4-ãî óðîâíÿ çà êàæäóþ êîìáèíàöèþ èç 6-òè è áîëåå èåðîãëèôîâ, à òàêæå çà ïðîõîæäåíèå ïîëîâèíû óðîâíÿ èãðîê ïîëó÷àåò "èñêðèâèòåëü ïðîñòðàíñòâà" , ïîçâîëÿþùèé, ïðè åãî ïðèìåíåíèè, ñäåëàòü 3 õîäà (íå îáÿçàòåëüíî ïîäðÿä) ïî äèàãîíàëè. |
Ó èãðîêà íå ìîæåò áûòü îäíîâðåìåííî áîëåå 1 äîïîëíèòåëüíîãî èåðîãëèôà êàæäîãî òèïà (1 ïðîñòîé, 1 äæîêåð è 1 èñêðèâèòåëü). |
Èãðà çàêàí÷èâàåòñÿ, åñëè èãðîê íå ìîæåò ñîñòàâèòü íè îäíîé êîìáèíàöèè èìåþùèìèñÿ ó íåãî â ðàñïîðÿæåíèè èåðîãëèôàìè. |
/programs/games/fara/trunk/kosSyst.cpp |
---|
0,0 → 1,870 |
#include "kosSyst.h" |
#include <stdarg.h> |
#define atexitBufferSize 32 |
char pureCallMessage[] = "PURE function call!"; |
char *kosExePath = NULL; |
// |
void (__cdecl *atExitList[atexitBufferSize])(); |
int atExitFnNum = 0; |
// |
int __cdecl atexit( void (__cdecl *func )( void )) |
{ |
// |
if ( atExitFnNum < atexitBufferSize ) |
{ |
// |
atExitList[atExitFnNum++] = func; |
return 0; |
} |
else |
{ |
return 1; |
} |
} |
// |
Dword RandomSeed = 1; |
// |
void rtlSrand( Dword seed ) |
{ |
RandomSeed = seed; |
} |
// |
Dword rtlRand( void ) |
{ |
//ìàñêà 0x80000776 |
Dword dwi, i; |
for ( i = 0; i < 32; i++ ) |
{ |
dwi = RandomSeed & 0x80000776; |
__asm{ |
mov eax, dwi |
mov edx, eax |
bswap eax |
xor eax, edx |
xor al, ah |
setpo al |
movzx eax, al |
mov dwi, eax |
} |
RandomSeed = ( RandomSeed << 1 ) | ( dwi & 1 ); |
} |
return RandomSeed; |
} |
// |
void * __cdecl memcpy( void *dst, const void *src, size_t bytesCount ) |
{ |
__asm{ |
mov edi, dst |
mov eax, dst |
mov esi, src |
mov ecx, bytesCount |
rep movsb |
} |
} |
// |
void memset( Byte *dst, Byte filler, Dword count ) |
{ |
// |
__asm{ |
mov edi, dst |
mov al, filler |
mov ecx, count |
rep stosb |
} |
} |
// |
Dword rtlInterlockedExchange( Dword *target, Dword value ) |
{ |
// Dword result; |
// |
__asm{ |
mov eax, value |
mov ebx, target |
xchg eax, [ebx] |
// mov result, eax |
} |
// |
// return result; |
} |
////////////////////////////////////////////////////////////////////// |
// |
// êîïèðîâàíèå ñòðîêè |
// |
char * __cdecl strcpy( char *target, const char *source ) |
{ |
char *result = target; |
while( target[0] = source[0] ) |
{ |
target++; |
source++; |
} |
return result; |
} |
////////////////////////////////////////////////////////////////////// |
// |
// ðåâåðñèâíûé ïîèñê ñèìâîëà |
// |
char * __cdecl strrchr( const char * string, int c ) |
{ |
char *cPtr; |
// |
for ( cPtr = (char *)string + strlen( string ); cPtr >= string; cPtr-- ) |
{ |
// |
if ( *cPtr == c ) return cPtr; |
} |
// |
return NULL; |
} |
////////////////////////////////////////////////////////////////////// |
// |
// îïðåäåëåíèå äëèíû ñòðîêè |
// |
int __cdecl strlen( const char *line ) |
{ |
int i; |
for( i=0; line[i] != 0; i++ ); |
return i; |
} |
////////////////////////////////////////////////////////////////////// |
// |
// ïåðåâîä øåñòíàäöàòèðè÷íîãî ÷èñëà â ñèìâîë |
// |
unsigned int num2hex( unsigned int num ) |
{ |
if( num < 10 ) |
return num + '0'; |
return num - 10 + 'A'; |
} |
////////////////////////////////////////////////////////////////////// |
// |
// âûâîä ñòðîêè íà ïå÷àòü |
// |
Dword dectab[] = { 1000000000, 100000000, 10000000, 1000000, 100000, |
10000, 1000, 100, 10, 0 }; |
// |
void sprintf( char *Str, char* Format, ... ) |
{ |
int i, fmtlinesize, j, k, flag; |
Dword head, tail; |
char c; |
va_list arglist; |
// |
va_start(arglist, Format); |
// |
fmtlinesize = strlen( Format ); |
// |
if( fmtlinesize == 0 ) return; |
// |
for( i = 0, j = 0; i < fmtlinesize; i++ ) |
{ |
// |
c = Format[i]; |
// |
if( c != '%' ) |
{ |
Str[j++] = c; |
continue; |
} |
// |
i++; |
// |
if( i >= fmtlinesize ) break; |
// |
flag = 0; |
// |
c = Format[i]; |
// |
switch( c ) |
{ |
// |
case '%': |
Str[j++] = c; |
break; |
// âûâîä ñòðîêè |
case 'S': |
Byte* str; |
str = va_arg(arglist, Byte*); |
for( k = 0; ( c = str[k] ) != 0; k++ ) |
{ |
Str[j++] = c; |
} |
break; |
// âûâîä áàéòà |
case 'B': |
k = va_arg(arglist, int) & 0xFF; |
Str[j++] = num2hex( ( k >> 4 ) & 0xF ); |
Str[j++] = num2hex( k & 0xF ); |
break; |
// âûâîä ñèìâîëà |
case 'C': |
Str[j++] = va_arg(arglist, int) & 0xFF; |
break; |
// âûâîä äâîéíîãî ñëîâà â øåñòíàäöàòèðè÷íîì âèäå |
case 'X': |
Dword val; |
val = va_arg(arglist, Dword); |
for( k = 7; k >= 0; k-- ) |
{ |
// |
c = num2hex ( ( val >> (k * 4) ) & 0xF ); |
// |
if( c == '0' ) |
{ |
if( flag ) Str[j++] = c; |
} |
else |
{ |
flag++; |
Str[j++] = c; |
} |
} |
// |
if( flag == 0 ) Str[j++] = '0'; |
break; |
// âûâîä äâîéíîãî ñëîâà â äåñÿòè÷íîì âèäå |
case 'U': |
head = va_arg(arglist, Dword); |
tail = 0; |
for( k = 0; dectab[k] != 0; k++ ) |
{ |
tail = head % dectab[k]; |
head /= dectab[k]; |
c = head + '0'; |
if( c == '0' ) |
{ |
if( flag ) Str[j++] = c; |
} |
else |
{ |
flag++; |
Str[j++] = c; |
} |
// |
head = tail; |
} |
// |
c = head + '0'; |
Str[j++] = c; |
break; |
// âûâîä 64-áèòíîãî ñëîâà â øåñòíàäöàòèðè÷íîì âèäå |
case 'Q': |
unsigned int low_dword, high_dword; |
low_dword = va_arg(arglist, unsigned int); |
high_dword = va_arg(arglist, unsigned int); |
for( k = 7; k >= 0; k-- ) |
{ |
// |
c = num2hex ( ( ( high_dword + 1) >> (k * 4) ) & 0xF ); |
// |
if( c == '0' ) |
{ |
if( flag ) Str[j++] = c; |
} |
else |
{ |
flag++; |
Str[j++] = c; |
} |
} |
// |
for( k=7; k >= 0; k-- ) |
{ |
// |
c = num2hex ( ( low_dword >> (k * 4) ) & 0xF ); |
// |
if( c == '0' ) |
{ |
if( flag ) Str[j++] = c; |
} |
else |
{ |
flag++; |
Str[j++] = c; |
} |
} |
// |
if( flag == 0 ) Str[j++] = '0'; |
// |
break; |
// |
default: |
break; |
} |
} |
// |
Str[j] = 0; |
} |
// ôóíêöèÿ -1 çàâåðøåíèÿ ïðîöåññà |
void kos_ExitApp() |
{ |
int i; |
// |
for ( i = atExitFnNum - 1; i >= 0; i-- ) |
{ |
// |
atExitList[i](); |
} |
// |
__asm{ |
mov eax, -1 |
int 0x40 |
} |
} |
// ôóíêöèÿ 0 |
void kos_DefineAndDrawWindow( |
Word x, Word y, |
Word sizeX, Word sizeY, |
Byte mainAreaType, |
Dword mainAreaColour, |
Byte headerType, |
Dword headerColour, |
Dword borderColour |
) |
{ |
Dword arg1, arg2, arg3, arg4; |
// |
arg1 = ( x << 16 ) + sizeX; |
arg2 = ( y << 16 ) + sizeY; |
arg3 = ( mainAreaType << 24 ) | mainAreaColour; |
arg4 = ( headerType << 24 ) | headerColour; |
// |
__asm{ |
mov eax, 0 |
mov ebx, arg1 |
mov ecx, arg2 |
mov edx, arg3 |
mov esi, arg4 |
mov edi, borderColour |
int 0x40 |
} |
} |
// ôóíêöèÿ 1 ïîñòàâèòü òî÷êó |
void kos_PutPixel( Dword x, Dword y, Dword colour ) |
{ |
// |
__asm{ |
mov eax, 1 |
mov ebx, x |
mov ecx, y |
mov edx, colour |
int 0x40 |
} |
} |
// ôóíêöèÿ 2 ïîëó÷èòü êîä íàæàòîé êëàâèøè |
bool kos_GetKey( Byte &keyCode ) |
{ |
Dword result; |
// |
__asm{ |
mov eax, 2 |
int 0x40 |
mov result, eax |
} |
// |
keyCode = result >> 8; |
// |
return ( result & 0xFF ) == 0; |
} |
// ôóíêöèÿ 3 ïîëó÷èòü âðåìÿ |
Dword kos_GetSystemClock() |
{ |
// Dword result; |
// |
__asm{ |
mov eax, 3 |
int 0x40 |
// mov result, eax |
} |
// |
// return result; |
} |
// ôóíêöèÿ 4 |
void kos_WriteTextToWindow( |
Word x, |
Word y, |
Byte fontType, |
Dword textColour, |
char *textPtr, |
Dword textLen |
) |
{ |
Dword arg1, arg2; |
// |
arg1 = ( x << 16 ) | y; |
arg2 = ( fontType << 24 ) | textColour; |
// |
__asm{ |
mov eax, 4 |
mov ebx, arg1 |
mov ecx, arg2 |
mov edx, textPtr |
mov esi, textLen |
int 0x40 |
} |
} |
// ôóíêöèÿ 5 ïàóçà, â ñîòûõ äîëÿõ ñåêóíäû |
void kos_Pause( Dword value ) |
{ |
// |
__asm{ |
mov eax, 5 |
mov ebx, value |
int 0x40 |
} |
} |
// ôóíêöèÿ 7 íàðèñîâàòü èçîáðàæåíèå |
void kos_PutImage( RGB * imagePtr, Word sizeX, Word sizeY, Word x, Word y ) |
{ |
Dword arg1, arg2; |
// |
arg1 = ( sizeX << 16 ) | sizeY; |
arg2 = ( x << 16 ) | y; |
// |
__asm{ |
mov eax, 7 |
mov ebx, imagePtr |
mov ecx, arg1 |
mov edx, arg2 |
int 0x40 |
} |
} |
// ôóíêöèÿ 8 îïðåäåëèòü êíîïêó |
void kos_DefineButton( Word x, Word y, Word sizeX, Word sizeY, Dword buttonID, Dword colour ) |
{ |
Dword arg1, arg2; |
// |
arg1 = ( x << 16 ) | sizeX; |
arg2 = ( y << 16 ) | sizeY; |
// |
__asm{ |
mov eax, 8 |
mov ebx, arg1 |
mov ecx, arg2 |
mov edx, buttonID |
mov esi, colour |
int 0x40 |
} |
} |
// ôóíêöèÿ 9 - èíôîðìàöèÿ î ïðîöåññå |
Dword kos_ProcessInfo( sProcessInfo *targetPtr, Dword processID ) |
{ |
// Dword result; |
// |
__asm{ |
mov eax, 9 |
mov ebx, targetPtr |
mov ecx, processID |
int 0x40 |
// mov result, eax |
} |
// |
// return result; |
} |
// ôóíêöèÿ 10 |
Dword kos_WaitForEvent() |
{ |
// Dword result; |
__asm{ |
mov eax, 10 |
int 0x40 |
// mov result, eax |
} |
// return result; |
} |
// ôóíêöèÿ 11 |
Dword kos_CheckForEvent() |
{ |
// Dword result; |
__asm{ |
mov eax, 11 |
int 0x40 |
// mov result, eax |
} |
// return result; |
} |
// ôóíêöèÿ 12 |
void kos_WindowRedrawStatus( Dword status ) |
{ |
__asm{ |
mov eax, 12 |
mov ebx, status |
int 0x40 |
} |
} |
// ôóíêöèÿ 13 íàðèñîâàòü ïîëîñó |
void kos_DrawBar( Word x, Word y, Word sizeX, Word sizeY, Dword colour ) |
{ |
Dword arg1, arg2; |
// |
arg1 = ( x << 16 ) | sizeX; |
arg2 = ( y << 16 ) | sizeY; |
// |
__asm{ |
mov eax, 13 |
mov ebx, arg1 |
mov ecx, arg2 |
mov edx, colour |
int 0x40 |
} |
} |
// ôóíêöèÿ 17 |
bool kos_GetButtonID( Dword &buttonID ) |
{ |
Dword result; |
// |
__asm{ |
mov eax, 17 |
int 0x40 |
mov result, eax |
} |
// |
buttonID = result >> 8; |
// |
return (result & 0xFF) == 0; |
} |
// ôóíêöèÿ 23 |
Dword kos_WaitForEvent( Dword timeOut ) |
{ |
// Dword result; |
__asm{ |
mov eax, 23 |
mov ebx, timeOut |
int 0x40 |
// mov result, eax |
} |
// return result; |
} |
// ïîëó÷åíèå èíôîðìàöèè î ñîñòîÿíèè "ìûøè" ôóíêöèÿ 37 |
void kos_GetMouseState( Dword & buttons, int & cursorX, int & cursorY ) |
{ |
Dword mB; |
Word curX; |
Word curY; |
sProcessInfo sPI; |
// |
__asm{ |
mov eax, 37 |
mov ebx, 0 |
int 0x40 |
mov curY, ax |
shr eax, 16 |
mov curX, ax |
mov eax, 37 |
mov ebx, 2 |
int 0x40 |
mov mB, eax |
} |
// |
kos_ProcessInfo( &sPI ); |
// |
buttons = mB; |
cursorX = curX - sPI.processInfo.x_start; |
cursorY = curY - sPI.processInfo.y_start; |
} |
// ôóíêöèÿ 40 óñòàíîâèòü ìàñêó ñîáûòèé |
void kos_SetMaskForEvents( Dword mask ) |
{ |
// |
__asm{ |
mov eax, 40 |
mov ebx, mask |
int 0x40 |
} |
} |
// ôóíêöèÿ 47 âûâåñòè â îêíî ïðèëîæåíèÿ ÷èñëî |
void kos_DisplayNumberToWindow( |
Dword value, |
Dword digitsNum, |
Word x, |
Word y, |
Dword colour, |
eNumberBase nBase, |
bool valueIsPointer |
) |
{ |
Dword arg1, arg2; |
// |
arg1 = ( valueIsPointer ? 1 : 0 ) | |
( ((Byte)nBase) << 8 ) | |
( ( digitsNum & 0x1F ) << 16 ); |
arg2 = ( x << 16 ) | y; |
// |
__asm{ |
mov eax, 47 |
mov ebx, arg1 |
mov ecx, value |
mov edx, arg2 |
mov esi, colour |
int 0x40 |
} |
} |
// ôóíêöèÿ 70 äîñòóï ê ôàéëîâîé ñèñòåìå |
Dword kos_FileSystemAccess( kosFileInfo *fileInfo ) |
{ |
// Dword result; |
// |
__asm{ |
mov eax, 70 |
mov ebx, fileInfo |
int 0x40 |
// mov result, eax |
} |
// |
// return result; |
} |
// ôóíêöèÿ 63 âûâîä ñèìâîëÿ â îêíî îòëàäêè |
void kos_DebugOutChar( char ccc ) |
{ |
// |
__asm{ |
mov eax, 63 |
mov ebx, 1 |
mov cl, ccc |
int 0x40 |
} |
} |
// ôóíêöèÿ 66 ðåæèì ïîëó÷åíèÿ äàííûõ îò êëàâèàòóðû |
void kos_SetKeyboardDataMode( Dword mode ) |
{ |
// |
__asm{ |
mov eax, 66 |
mov ebx, 1 |
mov ecx, mode |
int 0x40 |
} |
} |
// âûâîä ñòðîêè â îêíî îòëàäêè |
void rtlDebugOutString( char *str ) |
{ |
// |
for ( ; str[0] != 0; str++ ) |
{ |
kos_DebugOutChar( str[0] ); |
} |
// |
kos_DebugOutChar( 13 ); |
kos_DebugOutChar( 10 ); |
} |
// âûäåëåíèå-îñâîáîæäåíèå-ïåðåðàñïðåäåëåíèå áëîêîâ ïàìÿòè |
__declspec(naked) void* __stdcall kos_malloc(Dword size) |
{ |
__asm |
{ |
push ebx |
push ecx |
mov ecx, [esp+12] |
mov eax, 68 |
mov ebx, 12 |
int 0x40 |
pop ecx |
pop ebx |
ret 4 |
} |
} |
__declspec(naked) void __stdcall kos_free(void* mptr) |
{ |
__asm |
{ |
push ebx |
push ecx |
mov ecx, [esp+12] |
mov eax, 68 |
mov ebx, 13 |
int 0x40 |
pop ecx |
pop ebx |
ret 4 |
} |
} |
__declspec(naked) void* __stdcall kos_realloc(void* mptr, Dword size) |
{ |
__asm |
{ |
push ebx |
push ecx |
push edx |
mov eax, 68 |
mov ebx, 20 |
mov ecx, [esp+20] |
mov edx, [esp+16] |
int 0x40 |
pop edx |
pop ecx |
pop ebx |
ret 8 |
} |
} |
// ôóíêöèÿ 67 èçìåíèòü ïàðàìåòðû îêíà, ïàðàìåòð == -1 íå ìåíÿåòñÿ |
void kos_ChangeWindow( Dword x, Dword y, Dword sizeX, Dword sizeY ) |
{ |
// |
__asm{ |
mov eax, 67 |
mov ebx, x |
mov ecx, y |
mov edx, sizeX |
mov esi, sizeY |
int 0x40 |
} |
} |
// âûçîâ àáñòðàêòíîãî ìåòîäà |
int __cdecl _purecall() |
{ |
rtlDebugOutString( pureCallMessage ); |
kos_ExitApp(); |
return 0; |
} |
// âûçîâ ñòàòè÷åñêèõ èíèöèàëèçàòîðîâ |
// çàîäíî èíèöèàëèçàöèÿ ãåíåðàòîðà ñëó÷àéíûõ ÷èñåë |
#pragma section(".CRT$XCA",long,read,write) |
#pragma section(".CRT$XCZ",long,read,write) |
typedef void (__cdecl *_PVFV)(void); |
__declspec(allocate(".CRT$XCA")) _PVFV __xc_a[1] = { NULL }; |
__declspec(allocate(".CRT$XCZ")) _PVFV __xc_z[1] = { NULL }; |
// |
#pragma comment(linker, "/merge:.CRT=.rdata") |
// |
void crtStartUp() |
{ |
// èíèöèàëèçèðóåì êó÷ó |
__asm |
{ |
mov eax, 68 |
mov ebx, 11 |
int 40h |
} |
// âûçûâàåì èíèöèàëèçàòîðû ïî ñïèñêó, NULL'û èãíîðèðóåì |
for ( _PVFV *pbegin = __xc_a; pbegin < __xc_z; pbegin++ ) |
{ |
// |
if ( *pbegin != NULL ) |
(**pbegin)(); |
} |
// èíèöèàëèçèðóåì ãåíåðàòîð ñëó÷àéíûõ ÷èñåë |
rtlSrand( kos_GetSystemClock() ); |
// ïóòü ê ôàéëó ïðîöåññà |
kosExePath = *((char **)0x20); |
// âûçîâ ãëàâíîé ôóíêöèè ïðèëîæåíèÿ |
kos_Main(); |
// âûõîä |
kos_ExitApp(); |
} |
/programs/games/fara/trunk/kosSyst.h |
---|
0,0 → 1,197 |
typedef unsigned __int32 Dword; |
typedef unsigned __int16 Word; |
typedef unsigned __int8 Byte; |
typedef unsigned __int32 size_t; |
#define NULL 0 |
#define MAX_PATH 256 |
#define FO_READ 0 |
#define FO_WRITE 2 |
#define EM_WINDOW_REDRAW 1 |
#define EM_KEY_PRESS 2 |
#define EM_BUTTON_CLICK 4 |
#define EM_APP_CLOSE 8 |
#define EM_DRAW_BACKGROUND 16 |
#define EM_MOUSE_EVENT 32 |
#define EM_IPC 64 |
#define EM_NETWORK 256 |
#define KM_CHARS 0 |
#define KM_SCANS 1 |
#define WRS_BEGIN 1 |
#define WRS_END 2 |
#define PROCESS_ID_SELF -1 |
#define abs(a) (a<0?0-a:a) |
struct kosFileInfo |
{ |
Dword rwMode; |
Dword OffsetLow; |
Dword OffsetHigh; |
Dword dataCount; |
Byte *bufferPtr; |
char fileURL[MAX_PATH]; |
}; |
struct RGB |
{ |
Byte b; |
Byte g; |
Byte r; |
// |
RGB() {}; |
// |
RGB( Dword value ) |
{ |
r = value >> 16; |
g = value >> 8; |
b = value; |
}; |
// |
bool operator != ( RGB &another ) |
{ |
return this->b != another.b || this->g != another.g || this->r != another.r; |
}; |
// |
bool operator == ( RGB &another ) |
{ |
return this->b == another.b && this->g == another.g && this->r == another.r; |
}; |
}; |
union sProcessInfo |
{ |
Byte rawData[1024]; |
struct |
{ |
Dword cpu_usage; |
Word window_stack_position; |
Word window_stack_value; |
Word reserved1; |
char process_name[12]; |
Dword memory_start; |
Dword used_memory; |
Dword PID; |
Dword x_start; |
Dword y_start; |
Dword x_size; |
Dword y_size; |
Word slot_state; |
} processInfo; |
}; |
// |
extern char *kosExePath; |
// |
void crtStartUp(); |
// |
int __cdecl _purecall(); |
// |
int __cdecl atexit( void (__cdecl *func )( void )); |
// |
void rtlSrand( Dword seed ); |
Dword rtlRand( void ); |
// |
char * __cdecl strcpy( char *target, const char *source ); |
int __cdecl strlen( const char *line ); |
char * __cdecl strrchr( const char * string, int c ); |
// |
void * __cdecl memcpy( void *dst, const void *src, size_t bytesCount ); |
// |
void memset( Byte *dst, Byte filler, Dword count ); |
// |
void sprintf( char *Str, char* Format, ... ); |
// |
Dword rtlInterlockedExchange( Dword *target, Dword value ); |
// ôóíêöèÿ -1 çàâåðøåíèÿ ïðîöåññà |
void kos_ExitApp(); |
// ôóíêöèÿ 0 |
void kos_DefineAndDrawWindow( |
Word x, Word y, |
Word sizeX, Word sizeY, |
Byte mainAreaType, Dword mainAreaColour, |
Byte headerType, Dword headerColour, |
Dword borderColour |
); |
// ôóíêöèÿ 1 ïîñòàâèòü òî÷êó |
void kos_PutPixel( Dword x, Dword y, Dword colour ); |
// ôóíêöèÿ 2 ïîëó÷èòü êîä íàæàòîé êëàâèøè |
bool kos_GetKey( Byte &keyCode ); |
// ôóíêöèÿ 3 ïîëó÷èòü âðåìÿ |
Dword kos_GetSystemClock(); |
// ôóíêöèÿ 4 |
void kos_WriteTextToWindow( |
Word x, Word y, |
Byte fontType, |
Dword textColour, |
char *textPtr, |
Dword textLen |
); |
// ôóíêöèÿ 7 íàðèñîâàòü èçîáðàæåíèå |
void kos_PutImage( RGB * imagePtr, Word sizeX, Word sizeY, Word x, Word y ); |
// ôóíêöèÿ 8 îïðåäåëèòü êíîïêó |
void kos_DefineButton( Word x, Word y, Word sizeX, Word sizeY, Dword buttonID, Dword colour ); |
// ôóíêöèÿ 5 ïàóçà, â ñîòûõ äîëÿõ ñåêóíäû |
void kos_Pause( Dword value ); |
// ôóíêöèÿ 9 - èíôîðìàöèÿ î ïðîöåññå |
Dword kos_ProcessInfo( sProcessInfo *targetPtr, Dword processID = PROCESS_ID_SELF ); |
// ôóíêöèÿ 10 |
Dword kos_WaitForEvent(); |
// ôóíêöèÿ 11 |
Dword kos_CheckForEvent(); |
// ôóíêöèÿ 12 |
void kos_WindowRedrawStatus( Dword status ); |
// ôóíêöèÿ 13 íàðèñîâàòü ïîëîñó |
void kos_DrawBar( Word x, Word y, Word sizeX, Word sizeY, Dword colour ); |
// ôóíêöèÿ 17 |
bool kos_GetButtonID( Dword &buttonID ); |
// ôóíêöèÿ 23 |
Dword kos_WaitForEvent( Dword timeOut ); |
// |
enum eNumberBase |
{ |
nbDecimal = 0, |
nbHex, |
nbBin |
}; |
// ïîëó÷åíèå èíôîðìàöèè î ñîñòîÿíèè "ìûøè" ôóíêöèÿ 37 |
void kos_GetMouseState( Dword & buttons, int & cursorX, int & cursorY ); |
// ôóíêöèÿ 40 óñòàíîâèòü ìàñêó ñîáûòèé |
void kos_SetMaskForEvents( Dword mask ); |
// ôóíêöèÿ 47 âûâåñòè â îêíî ïðèëîæåíèÿ ÷èñëî |
void kos_DisplayNumberToWindow( |
Dword value, |
Dword digitsNum, |
Word x, |
Word y, |
Dword colour, |
eNumberBase nBase = nbDecimal, |
bool valueIsPointer = false |
); |
// ôóíêöèÿ 58 äîñòóï ê ôàéëîâîé ñèñòåìå |
Dword kos_FileSystemAccess( kosFileInfo *fileInfo ); |
// ôóíêöèÿ 63 |
void kos_DebugOutChar( char ccc ); |
// |
void rtlDebugOutString( char *str ); |
// ôóíêöèÿ 64 èçìåíèòü ïàðàìåòðû îêíà, ïàðàìåòð == -1 íå ìåíÿåòñÿ |
void kos_ChangeWindow( Dword x, Dword y, Dword sizeX, Dword sizeY ); |
// 68.12/13/20 |
void* __stdcall kos_malloc(Dword size); |
void __stdcall kos_free(void* mptr); |
void* __stdcall kos_realloc(void* mptr, Dword size); |
// ôóíêöèÿ 66 ðåæèì ïîëó÷åíèÿ äàííûõ îò êëàâèàòóðû |
void kos_SetKeyboardDataMode( Dword mode ); |
// |
void kos_Main(); |
/programs/games/fara/trunk/lang.h |
---|
0,0 → 1,3 |
#define RUS 1 |
#define ENG 2 |
#define LANG RUS |
/programs/games/fara/trunk/lzma_unpack.asm |
---|
0,0 → 1,393 |
; Exports only one function: |
; void __stdcall lzma_decompress( |
; const void* source, |
; void* destination, |
; unsigned dest_length); |
format COFF |
section '.text' code |
pb equ 2 ; pos state bits |
lp equ 0 ; literal pos state bits |
lc equ 3 ; literal context bits |
posStateMask equ ((1 shl pb)-1) |
literalPosMask equ ((1 shl lp)-1) |
kNumPosBitsMax = 4 |
kNumPosStatesMax = (1 shl kNumPosBitsMax) |
kLenNumLowBits = 3 |
kLenNumLowSymbols = (1 shl kLenNumLowBits) |
kLenNumMidBits = 3 |
kLenNumMidSymbols = (1 shl kLenNumMidBits) |
kLenNumHighBits = 8 |
kLenNumHighSymbols = (1 shl kLenNumHighBits) |
LenChoice = 0 |
LenChoice2 = 1 |
LenLow = 2 |
LenMid = (LenLow + (kNumPosStatesMax shl kLenNumLowBits)) |
LenHigh = (LenMid + (kNumPosStatesMax shl kLenNumMidBits)) |
kNumLenProbs = (LenHigh + kLenNumHighSymbols) |
kNumStates = 12 |
kNumLitStates = 7 |
kStartPosModelIndex = 4 |
kEndPosModelIndex = 14 |
kNumFullDistances = (1 shl (kEndPosModelIndex/2)) |
kNumPosSlotBits = 6 |
kNumLenToPosStates = 4 |
kNumAlignBits = 4 |
kAlignTableSize = (1 shl kNumAlignBits) |
kMatchMinLen = 2 |
IsMatch = 0 |
IsRep = 0xC0 ; (IsMatch + (kNumStates shl kNumPosBitsMax)) |
IsRepG0 = 0xCC ; (IsRep + kNumStates) |
IsRepG1 = 0xD8 ; (IsRepG0 + kNumStates) |
IsRepG2 = 0xE4 ; (IsRepG1 + kNumStates) |
IsRep0Long = 0xF0 ; (IsRepG2 + kNumStates) |
PosSlot = 0x1B0 ; (IsRep0Long + (kNumStates shl kNumPosBitsMax)) |
SpecPos = 0x2B0 ; (PosSlot + (kNumLenToPosStates shl kNumPosSlotBits)) |
Align_ = 0x322 ; (SpecPos + kNumFullDistances - kEndPosModelIndex) |
Lencoder = 0x332 ; (Align_ + kAlignTableSize) |
RepLencoder = 0x534 ; (Lencoder + kNumLenProbs) |
Literal = 0x736 ; (RepLencoder + kNumLenProbs) |
LZMA_BASE_SIZE = 1846 ; must be ==Literal |
LZMA_LIT_SIZE = 768 |
kNumTopBits = 24 |
kTopValue = (1 shl kNumTopBits) |
kNumBitModelTotalBits = 11 |
kBitModelTotal = (1 shl kNumBitModelTotalBits) |
kNumMoveBits = 5 |
RangeDecoderBitDecode: |
; in: eax->prob |
; out: CF=bit |
push edx |
mov edx, [range] |
shr edx, kNumBitModelTotalBits |
imul edx, [eax] |
cmp [code_], edx |
jae .ae |
mov [range], edx |
mov edx, kBitModelTotal |
sub edx, [eax] |
shr edx, kNumMoveBits |
add [eax], edx |
.n: |
pushfd |
call update_decoder |
popfd |
pop edx |
ret |
.ae: |
sub [range], edx |
sub [code_], edx |
mov edx, [eax] |
shr edx, kNumMoveBits |
sub [eax], edx |
stc |
jmp .n |
update_decoder: |
cmp byte [range+3], 0 ;cmp dword [range], kTopValue |
jnz @f ;jae @f |
shl dword [range], 8 |
shl dword [code_], 8 |
push eax |
mov eax, [inptr] |
mov al, [eax] |
inc dword [inptr] |
mov byte [code_], al |
pop eax |
@@: ret |
LzmaLenDecode: |
; in: eax->prob, edx=posState |
; out: ecx=len |
; LenChoice==0 |
; add eax, LenChoice*4 |
call RangeDecoderBitDecode |
jnc .0 |
add eax, (LenChoice2-LenChoice)*4 |
call RangeDecoderBitDecode |
jc @f |
mov cl, kLenNumMidBits |
shl edx, cl |
lea eax, [eax + (LenMid-LenChoice2)*4 + edx*4] |
call RangeDecoderBitTreeDecode |
add ecx, kLenNumLowSymbols |
ret |
@@: |
add eax, (LenHigh-LenChoice2)*4 |
mov cl, kLenNumHighBits |
call RangeDecoderBitTreeDecode |
add ecx, kLenNumLowSymbols + kLenNumMidSymbols |
ret |
.0: |
mov cl, kLenNumLowBits |
shl edx, cl |
lea eax, [eax + LenLow*4 + edx*4] |
RangeDecoderBitTreeDecode: |
; in: eax->probs,ecx=numLevels |
; out: ecx=length; destroys edx |
push edi |
xor edx, edx |
inc edx |
mov edi, edx |
xchg eax, edi |
@@: |
push eax |
lea eax, [edi+edx*4] |
call RangeDecoderBitDecode |
pop eax |
adc dl, dl |
add al, al |
loop @b |
sub dl, al |
pop edi |
mov ecx, edx |
ret |
; void __stdcall lzma_decompress( |
; const void* source, |
; void* destination, |
; unsigned dest_length); |
lzma_decompress equ _lzma_decompress@12 |
public lzma_decompress |
lzma_decompress: |
push esi edi ebx ebp |
mov esi, [esp+4*4+4] ; source |
xor ebp, ebp |
mov edi, code_ |
inc esi |
lodsd |
bswap eax |
stosd |
xor eax, eax |
dec eax |
stosd |
stosd |
stosd |
stosd |
xchg eax, esi |
stosd |
mov ecx, Literal + (LZMA_LIT_SIZE shl (lc+lp)) |
mov eax, kBitModelTotal/2 |
mov edi, p |
rep stosd |
mov edi, [esp+4*4+8] ; destination |
mov ebx, edi |
add ebx, [esp+4*4+12] ; dest_length |
.main_loop: |
cmp edi, ebx |
jae .main_loop_done |
mov edx, edi |
and edx, posStateMask |
push eax ; al = previous byte |
mov eax, ebp |
shl eax, kNumPosBitsMax+2 |
lea eax, [p + IsMatch*4 + eax + edx*4] |
call RangeDecoderBitDecode |
pop eax |
jc .1 |
movzx eax, al |
if literalPosMask |
mov ah, dl |
and ah, literalPosMask |
end if |
shr eax, 8-lc |
imul eax, LZMA_LIT_SIZE*4 |
add eax, p+Literal*4 |
mov cl, 1 |
cmp ebp, kNumLitStates |
jb .literal |
mov dl, [edi + esi] |
.lx0: |
add dl, dl |
setc ch |
push eax |
lea eax, [eax+ecx*4+0x100*4] |
call RangeDecoderBitDecode |
pop eax |
adc cl, cl |
jc .lx1 |
xor ch, cl |
test ch, 1 |
mov ch, 0 |
jz .lx0 |
.literal: |
@@: |
push eax |
lea eax, [eax+ecx*4] |
call RangeDecoderBitDecode |
pop eax |
adc cl, cl |
jnc @b |
.lx1: |
mov eax, ebp |
cmp al, 4 |
jb @f |
cmp al, 10 |
mov al, 3 |
jb @f |
mov al, 6 |
@@: sub ebp, eax |
xchg eax, ecx |
.stosb_main_loop: |
stosb |
jmp .main_loop |
.1: |
lea eax, [p + IsRep*4 + ebp*4] |
call RangeDecoderBitDecode |
jnc .10 |
add eax, (IsRepG0 - IsRep)*4 ;lea eax, [p + IsRepG0*4 + ebp*4] |
call RangeDecoderBitDecode |
jc .111 |
mov eax, ebp |
shl eax, kNumPosBitsMax+2 |
lea eax, [p + IsRep0Long*4 + eax + edx*4] |
call RangeDecoderBitDecode |
jc .1101 |
cmp ebp, 7 |
sbb ebp, ebp |
lea ebp, [ebp+ebp+11] |
mov al, [edi + esi] |
jmp .stosb_main_loop |
.111: |
add eax, (IsRepG1 - IsRepG0) * 4 ;lea eax, [p + IsRepG1*4 + ebp*4] |
call RangeDecoderBitDecode |
xchg esi, [rep1] |
jnc @f |
add eax, (IsRepG2 - IsRepG1) * 4 ;lea eax, [p + IsRepG2*4 + ebp*4] |
call RangeDecoderBitDecode |
xchg esi, [rep2] |
jnc @f |
xchg esi, [rep3] |
@@: |
.1101: |
mov eax, p + RepLencoder*4 |
call LzmaLenDecode |
push 8 |
jmp .rmu |
.10: |
xchg esi, [rep1] |
xchg esi, [rep2] |
mov [rep3], esi |
mov eax, p + Lencoder*4 |
call LzmaLenDecode |
push kNumLenToPosStates-1 |
pop eax |
cmp eax, ecx |
jb @f |
mov eax, ecx |
@@: |
push ecx |
push kNumPosSlotBits |
pop ecx |
shl eax, cl |
shl eax, 2 |
add eax, p+PosSlot*4 |
call RangeDecoderBitTreeDecode |
mov esi, ecx |
cmp ecx, kStartPosModelIndex |
jb .l6 |
push ecx |
xor eax, eax |
inc eax |
shr ecx, 1 |
adc al, al |
dec ecx |
shl eax, cl |
mov esi, eax |
pop edx |
cmp edx, kEndPosModelIndex |
jae .l5 |
sub eax, edx |
shl eax, 2 |
add eax, p + (SpecPos - 1)*4 |
jmp .l59 |
.l5: |
sub ecx, kNumAlignBits |
; call RangeDecoderDecodeDirectBits |
;RangeDecoderDecodeDirectBits: |
xor eax, eax |
.l: |
shr dword [range], 1 |
add eax, eax |
mov edx, [code_] |
sub edx, [range] |
jb @f |
mov [code_], edx |
inc eax |
@@: |
call update_decoder |
loop .l |
; ret |
mov cl, kNumAlignBits |
shl eax, cl |
add esi, eax |
mov eax, p+Align_*4 |
.l59: |
; call RangeDecoderReverseBitTreeDecode_addesi |
;_RangeDecoderReverseBitTreeDecode_addesi: |
; in: eax->probs,ecx=numLevels |
; out: esi+=length; destroys edx |
push edi ecx |
xor edx, edx |
inc edx |
xor edi, edi |
@@: |
push eax |
lea eax, [eax+edx*4] |
call RangeDecoderBitDecode |
lahf |
adc edx, edx |
sahf |
rcr edi, 1 |
pop eax |
loop @b |
pop ecx |
rol edi, cl |
add esi, edi |
pop edi |
; ret |
.l6: |
pop ecx |
not esi |
push 7 |
.rmu: |
cmp ebp, 7 |
pop ebp |
jb @f |
inc ebp |
inc ebp |
inc ebp |
@@: |
.repmovsb: |
inc ecx |
push esi |
add esi, edi |
rep movsb |
lodsb |
pop esi |
jmp .stosb_main_loop |
.main_loop_done: |
pop ebp ebx edi esi |
ret 12 |
section '.bss' data |
p rd LZMA_BASE_SIZE + (LZMA_LIT_SIZE shl (lc+lp)) |
code_ dd ? |
range dd ? |
rep1 dd ? |
rep2 dd ? |
rep3 dd ? |
inptr dd ? |
previousByte db ? |
/programs/games/fara/trunk/lzma_unpack.obj |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/fara/trunk/main.cpp |
---|
0,0 → 1,80 |
#include "kosSyst.h" |
#include "kosFile.h" |
#include "gfxdef.h" |
#include "mainWnd.h" |
#include "gameWnd.h" |
#include "top10wnd.h" |
void kos_Main() |
{ |
int hdrNum, i; |
SCompBmpHeader *hdrList; |
char *cPtr; |
// îòäåëÿåì èìÿ ìîäóëÿ îò ïóòè |
cPtr = strrchr( kosExePath, '/' ); |
// ïðîâåðêà ;) |
/* if ( cPtr == NULL ) |
{ |
// |
rtlDebugOutString( "Invalid path to executable." ); |
// |
return; |
}*/ |
// |
cPtr[1] = 0; |
// |
strcpy( top10FilePath, kosExePath ); |
// |
strcpy( top10FilePath + ((cPtr - kosExePath) + 1), "fara.t10" ); |
// |
PrepareTop10(); |
// ïðèêðóòèì èìÿ ôàéëà ñ ãðàôèêîé |
strcpy( cPtr + 1, "fara.gfx" ); |
// çàãðóæàåì êàðòèíêè èç ôàéëà |
CKosFile gfxRes( kosExePath ); |
// ÷èòàåì êîëè÷åñòâî êàðòèíîê â ôàéëå |
if ( gfxRes.Read( (Byte *)&hdrNum, sizeof(hdrNum) ) != sizeof(hdrNum) ) return; |
// ìåñòî ïîä çàãîëîâêè |
hdrList = new SCompBmpHeader[hdrNum]; |
// ñ÷èòûâàåì çàãîëîâêè êàðòèíîê |
gfxRes.Read( (Byte *)hdrList, sizeof(SCompBmpHeader) * hdrNum ); |
// ðàñïàêîâûâàåì êàðòèíêè |
mainWndFace.LoadFromArch( &(hdrList[MAIN_FACE_NDX]), &gfxRes, MAIN_FACE_NDX ); |
gameFace.LoadFromArch( &(hdrList[GAME_FACE_NDX]), &gfxRes, GAME_FACE_NDX ); |
gameBlocks.LoadFromArch( &(hdrList[BUTTONS_NDX]), &gfxRes, BUTTONS_NDX ); |
gameNumbers.LoadFromArch( &(hdrList[NUMBERS_NDX]), &gfxRes, NUMBERS_NDX ); |
// ìàñøòàáèðóåì èåðîãëèôû ê ìåíüøèì ðàçìåðàì |
for ( i = 0; i < 4; i++ ) |
gameBlocksZ[i].Scale(32-i*8,gameBlocks.GetBits()); |
// |
delete hdrList; |
// èíèöèàëèçèðóåì áëîêè |
for ( i = 0; i < blocksNum; i++ ) |
{ |
// |
fishki[i] = new CFishka( &gameBlocks, i * blockSize, RGB(0x0) ); |
} |
// |
maxGameLevel = START_LEVEL; |
// äîáàâëÿåì ìàñêó äëÿ ñîáûòèé ìûøè |
kos_SetMaskForEvents( 0x27 ); |
// |
while ( MainWndLoop() == MW_START_GAME ) |
{ |
GameLoop(); |
Top10Loop(); |
} |
// |
for ( i = 0; i < blocksNum; i++ ) |
{ |
delete fishki[i]; |
} |
// |
delete hdrList; |
} |
/programs/games/fara/trunk/mainWnd.cpp |
---|
0,0 → 1,211 |
#include "kosSyst.h" |
#include "KosFile.h" |
#include "gfxdef.h" |
#include "mainWnd.h" |
#include "lang.h" |
// |
RGB bmPMButton[] = { |
0xCCCCCC, 0xCCCCCC, 0x000000, 0x000000, 0xCCCCCC, 0xCCCCCC, |
0xCCCCCC, 0xCCCCCC, 0x000000, 0x000000, 0xCCCCCC, 0xCCCCCC, |
0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, |
0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, |
0xCCCCCC, 0xCCCCCC, 0x000000, 0x000000, 0xCCCCCC, 0xCCCCCC, |
0xCCCCCC, 0xCCCCCC, 0x000000, 0x000000, 0xCCCCCC, 0xCCCCCC, |
}; |
// |
#if LANG == RUS |
char mainWndTitle[] = "PHARAON's CRYPT"; |
char mainWndCopyright[] = "(C) MMVI by Rabid Rabbit"; |
char mainWndMenuStart[] = "1. ç âì ¨£àã"; |
char mainWndMenuExit[] = "2. ë室"; |
char mainWndMenuLevel[] = " ç «ìë© ã஢¥ì - %U"; |
#else |
char mainWndTitle[] = "PHARAON's CRYPT"; |
char mainWndCopyright[] = "(C) MMVI by Rabid Rabbit"; |
char mainWndMenuStart[] = "1. Start game"; |
char mainWndMenuExit[] = "2. Exit"; |
char mainWndMenuLevel[] = "Starting level - %U"; |
#endif |
// |
CKosBitmap mainWndFace; |
// |
Word mcx, mcy; |
#define BT_SIZE_X_MINUS 4 |
#define BT_SIZE_X_PLUS 5 |
// |
int MainWndLoop() |
{ |
Byte keyCode; |
Dword buttonID; |
int result; |
static bool firstTime = true; |
// |
startGameLevel = maxGameLevel; |
// |
if ( firstTime ) |
{ |
// |
mainWndFace.GetSize( mcx, mcy ); |
// |
firstTime = false; |
// |
DrawMainWindow(); |
} |
// |
kos_ChangeWindow( -1, -1, mcx + 1, mcy + 21 ); |
// |
for ( result = MW_NONE; result == MW_NONE; ) |
{ |
switch( kos_WaitForEvent() ) |
{ |
case 1: |
DrawMainWindow(); |
break; |
case 2: |
if ( kos_GetKey( keyCode ) ) |
{ |
// |
switch ( keyCode ) |
{ |
case '1': |
result = MW_START_GAME; |
break; |
case '2': |
result = MW_EXIT_APP; |
break; |
default: |
break; |
} |
} |
break; |
case 3: |
if ( kos_GetButtonID( buttonID ) ) |
{ |
// |
switch ( buttonID ) |
{ |
// |
case BT_SIZE_X_MINUS: |
if ( --startGameLevel < 1 ) |
startGameLevel = 1; |
else |
DrawMainWindow(); |
break; |
// |
case BT_SIZE_X_PLUS: |
if ( ++startGameLevel > maxGameLevel ) |
startGameLevel = maxGameLevel; |
else |
DrawMainWindow(); |
break; |
// |
default: |
break; |
} |
} |
default: |
break; |
} |
} |
// êíîïêè |
kos_DefineButton( |
0, 0, |
0, 0, |
BT_SIZE_X_MINUS + 0x80000000, |
0 |
); |
// |
kos_DefineButton( |
0, 0, |
0, 0, |
BT_SIZE_X_PLUS + 0x80000000, |
0 |
); |
// |
return result; |
} |
// ïîëíàÿ îòðèñîâêà ãëàâíîãî îêíà ïðîãðàììû (1) |
void DrawMainWindow() |
{ |
char line[64]; |
// |
kos_WindowRedrawStatus( WRS_BEGIN ); |
// îêíî |
kos_DefineAndDrawWindow( |
WNDLEFT, WNDTOP, |
mcx + 1, mcy + 21, |
0, 0x0, |
0, WNDHEADCOLOUR, |
WNDHEADCOLOUR |
); |
// çàãîëîâîê îêíà |
kos_WriteTextToWindow( |
4, 7, |
0x10, WNDTITLECOLOUR, |
mainWndTitle, sizeof(mainWndTitle)-1 |
); |
// |
mainWndFace.Draw( 1, 21 ); |
// ïåðâàÿ ñòðîêà |
kos_WriteTextToWindow( |
8, 32, |
0, 0x0, |
mainWndMenuStart, sizeof(mainWndMenuStart)-1 |
); |
// âòîðàÿ ñòðîêà |
kos_WriteTextToWindow( |
8, 48, |
0, 0x0, |
mainWndMenuExit, sizeof(mainWndMenuExit)-1 |
); |
// òðåòüÿ ñòðîêà |
sprintf( line, mainWndMenuLevel, startGameLevel); |
kos_WriteTextToWindow( |
8, 64, |
0, 0x0, |
line, strlen( line ) |
); |
// êíîïêè |
kos_DefineButton( |
mcx - 29, 64, |
12, 12, |
BT_SIZE_X_MINUS, |
0xCCCCCC |
); |
// |
kos_PutImage( bmPMButton + 12, 6, 2, mcx - 29 + 3, 69 ); |
// |
kos_DefineButton( |
mcx - 16, 64, |
12, 12, |
BT_SIZE_X_PLUS, |
0xCCCCCC |
); |
// |
kos_PutImage( bmPMButton, 6, 6, mcx - 16 + 3, 67 ); |
// êîïèðàéò |
kos_WriteTextToWindow( |
8, mcy - 16 + 21, |
0, 0x000066, |
mainWndCopyright, sizeof(mainWndCopyright)-1 |
); |
// |
kos_WindowRedrawStatus( WRS_END ); |
} |
/programs/games/fara/trunk/mainWnd.h |
---|
0,0 → 1,13 |
// mainWnd.h |
#define MW_NONE 0 |
#define MW_EXIT_APP 1 |
#define MW_START_GAME 2 |
// |
int MainWndLoop(); |
// ïîëíàÿ îòðèñîâêà ãëàâíîãî îêíà ïðîãðàììû (1) |
void DrawMainWindow(); |
// |
extern CKosBitmap mainWndFace; |
/programs/games/fara/trunk/mainfish.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/fara/trunk/mcarray.h |
---|
0,0 → 1,181 |
#define AR_CHUNK_SIZE 64 |
// |
template<class TYPE> |
class MCArray |
{ |
protected: |
TYPE * _dataPtr; |
int _elementsCount; |
int _capacity; |
public: |
MCArray(); |
virtual ~MCArray(); |
virtual int Add( const TYPE &element ); |
virtual int AddExclusive( const TYPE &element ); |
virtual TYPE & GetAt( int Ndx ); |
virtual TYPE & operator [] ( int Ndx ); |
virtual int Find( int startNdx, const TYPE & element ); |
virtual int RemoveAt( int Ndx ); |
virtual void Clear(void); |
virtual int GetCount(void); |
}; |
// |
// |
template<class TYPE> |
MCArray<TYPE>::MCArray() |
{ |
// óñòàíàâëèâàåì ïåðåìåííûå |
this->_dataPtr = NULL; |
this->_capacity = 0; |
this->_elementsCount = 0; |
} |
// |
template<class TYPE> |
MCArray<TYPE>::~MCArray() |
{ |
// |
this->_capacity = 0; |
this->_elementsCount = 0; |
// |
if ( this->_dataPtr != NULL ) |
{ |
delete this->_dataPtr; |
} |
} |
// |
template<class TYPE> |
int MCArray<TYPE>::AddExclusive( const TYPE &element ) |
{ |
// |
if ( this->Find( 0, element ) < 0 ) |
return this->Add( element ); |
else |
return -1; |
} |
// |
template<class TYPE> |
int MCArray<TYPE>::Add( const TYPE &element ) |
{ |
TYPE * dPtr; |
// åñòü ëè ìåñòî? |
if ( this->_elementsCount >= this->_capacity ) |
{ |
// çàíèìàåì åù¸ ïàìÿòè |
dPtr = new TYPE [this->_capacity + AR_CHUNK_SIZE]; |
// ïðîâåðêà |
if ( dPtr == NULL ) |
{ |
// |
return -1; |
} |
if ( this->_capacity > 0 ) |
{ |
// ñêîïèðóåì ñóùåñòâóþùèå äàííûå íà íîâîå ìåñòî |
memcpy( dPtr, this->_dataPtr, sizeof(TYPE) * this->_capacity ); |
// óäàëèì ñòàðóþ êîïèþ äàííûõ |
delete this->_dataPtr; |
} |
// ñêîððåêòèðóåì ðàçìåð |
this->_capacity += AR_CHUNK_SIZE; |
// ñêîððåêòèðóåì óêàçàòåëü íà äàííûå |
this->_dataPtr = dPtr; |
} |
// êîïèðóåì ýëåìåíò â ìàññèâ |
this->_dataPtr[this->_elementsCount] = element; |
//memcpy( this->_dataPtr + this->_elementsCount, &element, sizeof(TYPE) ); |
// óâåëè÷èâàåì ñ÷¸ò÷èê ýëåìåíòîâ |
return ++this->_elementsCount; |
} |
// |
template<class TYPE> |
TYPE & MCArray<TYPE>::GetAt( int Ndx ) |
{ |
//assert( Ndx >= 0 && Ndx < this->_elementsCount ); |
return this->_dataPtr[Ndx]; |
} |
// |
template<class TYPE> |
TYPE & MCArray<TYPE>::operator [] ( int Ndx ) |
{ |
return this->GetAt( Ndx ); |
} |
// |
template<class TYPE> |
int MCArray<TYPE>::Find( int startNdx, const TYPE & element ) |
{ |
int i; |
if ( startNdx < 0 || startNdx >= this->_elementsCount ) |
{ |
return -1; |
} |
for ( i = startNdx; i < this->_elementsCount; i++ ) |
{ |
if ( element == this->_dataPtr[i] ) |
{ |
return i; |
} |
} |
return -1; |
} |
// |
template<class TYPE> |
int MCArray<TYPE>::RemoveAt( int Ndx ) |
{ |
int mn; |
if ( Ndx < 0 || Ndx >= this->_elementsCount ) |
{ |
return 0; |
} |
mn = this->_elementsCount - Ndx; |
if ( mn != 1 ) |
{ |
memcpy( this->_dataPtr + Ndx, this->_dataPtr + Ndx + 1, sizeof(TYPE) * ( mn - 1 ) ); |
} |
this->_elementsCount--; |
return 1; |
} |
// |
template<class TYPE> |
void MCArray<TYPE>::Clear() |
{ |
this->_elementsCount = 0; |
} |
// |
template<class TYPE> |
int MCArray<TYPE>::GetCount() |
{ |
return this->_elementsCount; |
} |
/programs/games/fara/trunk/mcsmemm.cpp |
---|
0,0 → 1,298 |
// memman.cpp : Defines the entry point for the console application. |
// |
#include "kosSyst.h" |
#include "mcsmemm.h" |
void * __cdecl operator new ( size_t count, size_t element_size ) |
{ |
return allocmem( (Dword)(count * element_size) ); |
} |
void * __cdecl operator new [] ( size_t amount ) |
{ |
return allocmem( (Dword)amount ); |
} |
void * __cdecl operator new ( size_t amount ) |
{ |
return allocmem( (Dword)amount ); |
} |
void __cdecl operator delete ( void *pointer ) |
{ |
if ( pointer != NULL ) freemem( pointer ); |
} |
void __cdecl operator delete [] ( void *pointer ) |
{ |
if ( pointer != NULL ) freemem( pointer ); |
} |
// |
Dword mmMutex = FALSE; |
MemBlock *rootfree = NULL; |
MemBlock *rootuser = NULL; |
bool mmInitialized = false; |
Byte *mmHeapTop = NULL; |
// |
Byte *allocmem( Dword reqsize ) |
{ |
MemBlock *BlockForCheck; |
MemBlock *LastKnownGood; |
Dword tail; |
Byte *address; |
//ïîäðîâíÿåì ðàçìåð |
if( ( tail = reqsize % SIZE_ALIGN ) != 0 ) |
{ |
reqsize += SIZE_ALIGN - tail; |
} |
LastKnownGood = NULL; |
// æä¸ì îñâîáîæäåíèÿ ìüþòåêñà |
while ( rtlInterlockedExchange( &mmMutex, TRUE ) ) |
{ |
// |
kos_Pause( 1 ); |
} |
//èùåì ïîäõîäÿùèé ñâîáîäíûé áëîê |
if( rootfree != NULL ) |
{ |
for ( BlockForCheck = rootfree; ; BlockForCheck = BlockForCheck->Next ) |
{ |
if ( BlockForCheck->Size >= reqsize ) |
{ |
//íàøëè |
if ( LastKnownGood != NULL ) |
{ |
if ( LastKnownGood->Size >= BlockForCheck->Size ) |
LastKnownGood = BlockForCheck; |
} |
else |
LastKnownGood = BlockForCheck; |
if ( LastKnownGood->Size == reqsize ) |
break; |
} |
if ( BlockForCheck->Next == NULL ) |
break; |
} |
} |
if ( LastKnownGood != NULL ) |
{ |
//ïðîâåðèì íàéäåííûé áëîê íà âîçìîæíîñòü äåëåíèÿ |
tail = LastKnownGood->Size - reqsize; |
if ( tail >= ( sizeof(MemBlock) + SIZE_ALIGN ) ) |
{ |
//áóäåì ðàçáèâàòü |
BlockForCheck = (MemBlock *)( ( (Byte *)LastKnownGood ) + tail ); |
BlockForCheck->Size = reqsize; |
//âñòàâèì çàíÿòûé áëîê â íà÷àëî ñïèñêà çàíàòûõ áëîêîâ |
if( rootuser != NULL ) |
{ |
BlockForCheck->Next = rootuser; |
rootuser->Previous = BlockForCheck; |
BlockForCheck->Previous = NULL; |
rootuser = BlockForCheck; |
} |
else |
{ |
rootuser = BlockForCheck; |
BlockForCheck->Next = NULL; |
BlockForCheck->Previous = NULL; |
} |
//èçìåíèì ðàçìåð îñòàâøåéñÿ ÷àñòè |
LastKnownGood->Size = tail - sizeof(MemBlock); |
address = ( (Byte *)BlockForCheck ) + sizeof(MemBlock); |
// îòïóñòèì ìüþòåêñ |
rtlInterlockedExchange( &mmMutex, FALSE ); |
return address; |
} |
else |
{ |
//ïåðåìåñòè áëîê èç î÷åðåäè ñâîáîäíûõ â íà÷àëî î÷åðåäè çàíÿòûõ |
//ñíà÷àëà âûêèíåì åãî èç î÷åðåäè ñâîáîäíûõ |
if ( LastKnownGood->Previous != NULL ) |
{ |
LastKnownGood->Previous->Next = LastKnownGood->Next; |
} |
else |
{ |
//áëîê ñòîèò â íà÷àëå î÷åðåäè |
rootfree = LastKnownGood->Next; |
} |
if( LastKnownGood->Next != NULL ) |
{ |
LastKnownGood->Next->Previous = LastKnownGood->Previous; |
} |
//òåïåðü âñòàâèì åãî â î÷åðåäü çàíÿòûõ |
if( rootuser != NULL ) |
{ |
LastKnownGood->Next = rootuser; |
rootuser->Previous = LastKnownGood; |
LastKnownGood->Previous = NULL; |
rootuser = LastKnownGood; |
} |
else |
{ |
rootuser = LastKnownGood; |
LastKnownGood->Next = NULL; |
LastKnownGood->Previous = NULL; |
} |
// |
address = ( (Byte *)LastKnownGood ) + sizeof(MemBlock); |
// îòïóñòèì ìüþòåêñ |
rtlInterlockedExchange( &mmMutex, FALSE ); |
return address; |
} |
} |
else |
{ |
// íàäî ïîëó÷èòü åù¸ áëîê ïàìÿòè |
LastKnownGood = (MemBlock *)kos_malloc( |
(reqsize > 0x10000 - sizeof(MemBlock)) ? (reqsize + sizeof(MemBlock)) : 0x10000); |
if (LastKnownGood != NULL) |
{ |
LastKnownGood->Size = reqsize; |
// òåïåðü âñòàâèì åãî â î÷åðåäü çàíÿòûõ |
LastKnownGood->Next = rootuser; |
LastKnownGood->Previous = NULL; |
if (rootuser != NULL) |
rootuser->Previous = LastKnownGood; |
rootuser = LastKnownGood; |
// à òàêæå äîáàâèì õâîñò ñâåæåâûäåëåííîãî áîëüøîãî áëîêà â ñïèñîê ñâîáîäíûõ |
if (reqsize < 0x10000 - sizeof(MemBlock)) |
{ |
MemBlock* free = (MemBlock*)((Byte*)LastKnownGood + sizeof(MemBlock) + reqsize); |
free->Next = rootfree; |
free->Previous = NULL; |
if (rootfree != NULL) |
rootfree->Previous = free; |
rootfree = free; |
} |
address = (Byte*)LastKnownGood + sizeof(MemBlock); |
// îòïóñòèì ìüþòåêñ |
rtlInterlockedExchange(&mmMutex, FALSE); |
return address; |
} |
} |
// îòïóñòèì ìüþòåêñ |
rtlInterlockedExchange( &mmMutex, FALSE ); |
// |
rtlDebugOutString( "allocmem failed." ); |
kos_ExitApp(); |
// |
return NULL; |
} |
// |
Dword freemem( void *vaddress ) |
{ |
Dword result; |
Byte *checknext, *address = (Byte *)vaddress; |
// æä¸ì îñâîáîæäåíèÿ ìüþòåêñà |
while ( rtlInterlockedExchange( &mmMutex, TRUE ) ) |
{ |
// |
kos_Pause( 1 ); |
} |
MemBlock *released = (MemBlock *)( address - sizeof(MemBlock) ); |
result = released->Size; |
//óáèðàåì áëîê èç ñïèñêà çàíÿòûõ |
if ( released->Previous != NULL ) |
{ |
released->Previous->Next = released->Next; |
} |
else |
{ |
rootuser = released->Next; |
} |
if ( released->Next != NULL ) |
{ |
released->Next->Previous = released->Previous; |
} |
//çàêèíåì òåïåðü ýòîò áëîê â ñïèñîê ñâîáîäíûõ |
released->Next = rootfree; |
released->Previous = NULL; |
rootfree = released; |
if ( released->Next != NULL ) |
{ |
released->Next->Previous = released; |
} |
//òåïåðü ïîèùåì ñìåæíûå ñâîáîäíûå áëîêè |
checknext = (Byte *)(rootfree) + ( rootfree->Size + sizeof(MemBlock) ); |
// |
for ( released = rootfree->Next; released != NULL; released = released->Next ) |
{ |
if ( checknext == (Byte *)released ) |
{ |
//ñîáèðàåì áëîêè âìåñòå |
//ñíà÷àëà âûêèíåì èç î÷åðåäè ñâîáîäíûõ |
released->Previous->Next = released->Next; |
if( released->Next != NULL ) |
{ |
released->Next->Previous = released->Previous; |
} |
//òåïåðü óâåëè÷èì ðàçìåð êîðíåâîãî áëîêà |
rootfree->Size += released->Size + sizeof(MemBlock); |
break; |
} |
} |
//åñëè íàäî, ïîèùåì áëîêè ïåðåä òåêùèì. |
checknext = (Byte *)(rootfree); |
// |
if ( released == NULL ) |
{ |
for ( released = rootfree->Next; released != NULL; released = released->Next ) |
{ |
if ( checknext == (Byte *)released + ( released->Size + sizeof(MemBlock) ) ) |
{ |
//ñîáèðàåì áëîêè âìåñòå |
//óâåëè÷èì ðàçìåð áëîêà |
released->Size += rootfree->Size + sizeof(MemBlock); |
//òåïåðü âûêèíåì èç î÷åðåäè ñâîáîäíûõ |
released->Previous->Next = released->Next; |
if ( released->Next != NULL ) |
{ |
released->Next->Previous = released->Previous; |
} |
//è çàêèíåì åãî â íà÷àëî î÷åðåäè âìåñòî ïðèñîåäèí¸ííîãî áëîêà èç êîðíÿ ñïèñêà |
if ( rootfree->Next != NULL ) |
{ |
rootfree->Next->Previous = released; |
} |
released->Next = rootfree->Next; |
released->Previous = NULL; |
rootfree = released; |
break; |
} |
} |
} |
// îòïóñòèì ìüþòåêñ |
rtlInterlockedExchange( &mmMutex, FALSE ); |
return result; |
} |
/programs/games/fara/trunk/numbers.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/fara/trunk/top10wnd.cpp |
---|
0,0 → 1,361 |
// top10wnd.cpp |
#include "kosSyst.h" |
#include "KosFile.h" |
#include "gfxdef.h" |
#include "gameWnd.h" |
#include "mcarray.h" |
#include "top10wnd.h" |
#include "lang.h" |
// |
char top10FilePath[MAX_PATH]; |
// |
struct hiScoreHero |
{ |
char name[12]; |
Dword score; |
// |
hiScoreHero() |
{ |
// |
this->ClearName(); |
this->score = 0; |
}; |
// |
void ClearName() |
{ |
memset( (Byte *)(this->name), '.', sizeof(this->name) ); |
}; |
}; |
// |
hiScoreHero heroTbl[TOP_TBL_SIZE]; |
// |
struct hiScoreFile |
{ |
Byte block[512]; |
kosFileInfo fi; |
// |
hiScoreFile() |
{ |
int i; |
// |
this->fi.OffsetLow = this->fi.OffsetHigh = 0; |
this->fi.dataCount = 0; |
this->fi.bufferPtr = this->block; |
this->fi.rwMode = 0; |
memcpy( this->fi.fileURL, top10FilePath, strlen( top10FilePath ) + 1); |
// |
for ( i = 0; i < ( sizeof( this->block ) / sizeof( Dword ) ); i++ ) |
{ |
// |
((Dword *)(this->block))[i] = rtlRand(); |
} |
}; |
// |
virtual ~hiScoreFile() |
{} |
// |
bool LoadFromDisk() |
{ |
bool result; |
int i; |
Dword j, k; |
Byte *bPtr; |
// |
this->fi.rwMode = FO_READ; |
this->fi.OffsetLow = this->fi.OffsetHigh = 0; |
this->fi.dataCount = 512; |
result = kos_FileSystemAccess( &(this->fi) ) == 0; |
// |
if ( result ) |
{ |
// äåêîäèðóåì |
rtlSrand( ((Dword *)(this->block))[(sizeof(this->block) / sizeof(Dword)) - 1] ); |
// |
for ( i = 0; i < (sizeof( heroTbl ) * 5); i++ ) |
{ |
// íå òðîãàåì ïîñëåäíèé Dword |
j = rtlRand() % (sizeof(this->block) - 7); |
k = ( rtlRand() % 31 ) + 1; |
// |
bPtr = this->block + j; |
// |
__asm{ |
mov edx, bPtr |
mov ecx, k |
mov eax, [edx] |
bswap eax |
ror eax, cl |
mov [edx], eax |
} |
} |
// |
rtlSrand( kos_GetSystemClock() ); |
} |
// |
return result; |
}; |
// |
bool SaveToDisk() |
{ |
int i; |
Dword *rndList; |
Byte *bPtr; |
Dword k, keyLock; |
// |
rndList = new Dword[(sizeof( heroTbl ) * 5) * 2]; |
// |
keyLock = rtlRand(); |
// |
for ( i = 0; i < (sizeof( heroTbl ) * 5); i++ ) |
{ |
// |
rndList[i * 2] = rtlRand() % (sizeof(this->block) - 7); |
rndList[(i * 2) + 1] = ( rtlRand() % 31 ) + 1; |
} |
// |
for ( i = (sizeof( heroTbl ) * 5) - 1; i >= 0; i-- ) |
{ |
// |
bPtr = this->block + rndList[i * 2]; |
k = rndList[(i * 2) + 1]; |
// |
__asm{ |
mov edx, bPtr |
mov ecx, k |
mov eax, [edx] |
rol eax, cl |
bswap eax |
mov [edx], eax |
} |
} |
// |
delete rndList; |
// |
((Dword *)(this->block))[(sizeof(this->block) / sizeof(Dword)) - 1] = keyLock; |
// |
this->fi.rwMode = FO_WRITE; |
this->fi.dataCount = 512; |
return kos_FileSystemAccess( &( this->fi) ) == 0; |
}; |
}; |
/// |
hiScoreFile *top10Heroes = NULL; |
// |
#if LANG == RUS |
char Top10WndTitle[] = "Top 10"; |
char top10str1[] = "ENTER - ¨¬ï Ok."; |
char top10str2[] = "ESC - ¢ë室 ¢ ¬¥î"; |
#else |
char Top10WndTitle[] = "Top 10"; |
char top10str1[] = "Enter - name Ok."; |
char top10str2[] = "Esc - leave to menu"; |
#endif |
int enterName = -1; |
int enterCharNdx = 0; |
// |
void ReleaseTop10() |
{ |
// |
if ( top10Heroes != NULL ) |
{ |
// |
memcpy( top10Heroes->block, heroTbl, sizeof(heroTbl) ); |
// |
top10Heroes->SaveToDisk(); |
// |
delete top10Heroes; |
} |
} |
// |
void PrepareTop10() |
{ |
// |
top10Heroes = new hiScoreFile; |
// |
atexit( ReleaseTop10 ); |
// |
if ( top10Heroes->LoadFromDisk() ) |
{ |
// |
memcpy( heroTbl, top10Heroes->block, sizeof(heroTbl) ); |
} |
} |
// |
void SetUpTop10() |
{ |
int i, j; |
Byte keyCode; |
// |
while ( kos_CheckForEvent() == 2 ) kos_GetKey( keyCode ); |
// |
kos_SetKeyboardDataMode( KM_CHARS ); |
// |
kos_ChangeWindow( -1, -1, TOP10_WND_SIZE_X, TOP10_WND_SIZE_Y ); |
// |
for ( i = 0; i < TOP_TBL_SIZE; i++ ) |
{ |
// |
if ( heroTbl[i].score < playerScore ) |
{ |
// |
for ( j = TOP_TBL_SIZE - 1; j > i; j-- ) |
{ |
// |
heroTbl[j] = heroTbl[j-1]; |
} |
// |
heroTbl[i].ClearName(); |
heroTbl[i].score = playerScore; |
// |
enterName = i; |
enterCharNdx = 0; |
// |
break; |
} |
} |
} |
// |
void DrawTop10Window() |
{ |
int i; |
// |
kos_DefineAndDrawWindow( |
100, 100, |
TOP10_WND_SIZE_X, TOP10_WND_SIZE_Y, |
0, 0, |
0, 0x2040A0, |
0x2040A0 |
); |
// |
kos_WriteTextToWindow( |
4, 4, |
0x0, 0x42D2E2, |
Top10WndTitle, |
sizeof( Top10WndTitle ) - 1 |
); |
// |
for ( i = 0; i < TOP_TBL_SIZE; i++ ) |
{ |
// |
kos_WriteTextToWindow( |
6, 21 + 2 + (i * 10), |
0x0, enterName != i ? 0xFFFFFF : 0x00FF00, |
heroTbl[i].name, |
sizeof( heroTbl[0].name ) |
); |
// |
kos_DisplayNumberToWindow( |
heroTbl[i].score, |
8, |
112, 21 + 2 + (i * 10), |
0xFFFF55, |
nbDecimal, |
false |
); |
} |
// |
kos_WriteTextToWindow( |
6, 21 + 6 + (i * 10), |
0x10, 0x1060D0, |
enterName >= 0 ? top10str1 : top10str2, |
enterName >= 0 ? sizeof(top10str1) - 1 : sizeof(top10str2) - 1 |
); |
} |
// èãðîâîé ïðîöåññ |
void Top10Loop() |
{ |
Byte keyCode; |
// |
SetUpTop10(); |
// |
while ( true ) |
{ |
switch ( kos_WaitForEvent() ) |
{ |
// |
case 1: |
DrawTop10Window(); |
break; |
// |
case 2: |
// |
kos_GetKey( keyCode ); |
// |
if ( enterName < 0 ) |
{ |
// |
if ( keyCode == 0x1b ) |
{ |
// |
return; |
} |
} |
else |
{ |
// |
switch ( keyCode ) |
{ |
// |
case 13: |
// |
enterName = -1; |
break; |
// |
case 8: |
// |
if ( enterCharNdx > 0 ) |
{ |
// |
heroTbl[enterName].name[--enterCharNdx] = '.'; |
} |
break; |
// |
default: |
if ( keyCode >= 0x20 ) |
{ |
// |
heroTbl[enterName].name[enterCharNdx++] = keyCode; |
// |
if ( enterCharNdx >= sizeof(heroTbl[0].name) ) |
{ |
// |
enterName = -1; |
} |
} |
break; |
} |
// |
DrawTop10Window(); |
} |
// |
break; |
// |
default: |
break; |
} |
} |
} |
/programs/games/fara/trunk/top10wnd.h |
---|
0,0 → 1,14 |
// top10wnd.h |
#define TOP_TBL_SIZE 10 |
#define TOP10_WND_SIZE_X 176 |
#define TOP10_WND_SIZE_Y 144 |
extern char top10FilePath[MAX_PATH]; |
// èãðîâîé ïðîöåññ |
void Top10Loop(); |
// |
void PrepareTop10(); |
/programs/games/fara/trunk |
---|
Property changes: |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |
/programs/games/fara/. |
---|
Property changes: |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |