Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 1804 → Rev 1805

/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