Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 967 → Rev 968

/programs/games/kosilka/History.txt
0,0 → 1,11
17.12.08 -- v1.1 -- Leency
- èçáàâëåíèå îò ïîëíûõ ïåðåðèñîâîê îêíà;
- óñòðàíåíèå ìåðöàíèÿ.
 
 
24.09.07 -- v1.05 -- diamond
- óìåíüøåíèå ðàçìåðà ïðîãðàììû, îïòèìèçàöèè.
 
 
22.09.07 -- v1.00 -- Andrey Mihaylovich (Dron2004)
- ñòàáèëüíàÿ âåðñèÿ.
/programs/games/kosilka/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 );
}
}
 
 
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/kosilka/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/kosilka/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/kosilka/compile.bat
0,0 → 1,5
cl /c /O2 /nologo kosilka.cpp kosFile.cpp kosSyst.cpp mcsmemm.cpp
link /nologo /entry:crtStartUp /subsystem:native /base:0 /fixed /align:16 /nodefaultlib kosilka.obj kosFile.obj kosSyst.obj mcsmemm.obj
pe2kos kosilka.exe kosilka
del kosilka.exe
pause
/programs/games/kosilka/kosSyst.cpp
0,0 → 1,834
#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;
}
 
#if _MSC_VER >= 1400
//
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
}
}
#endif
 
//
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 );
}
 
 
// ôóíêöèÿ 64 èçìåíåíèå êîëè÷åñòâà ïàìÿòè, âûäåëåííîé äëÿ ïðîãðàììû
bool kos_ApplicationMemoryResize( Dword targetSize )
{
Dword result;
 
//
__asm{
mov eax, 64
mov ebx, 1
mov ecx, targetSize
int 0x40
mov result, eax
}
//
return result == 0;
}
 
 
// ôóíêöèÿ 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)
#pragma data_seg(".CRT$XCA")
#pragma data_seg(".CRT$XCZ")
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()
{
// âûçûâàåì èíèöèàëèçàòîðû ïî ñïèñêó, 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/kosilka/kosSyst.h
0,0 → 1,209
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)
 
extern "C" double acos(double x);
extern "C" double asin(double x);
extern "C" double floor(double x);
extern "C" double round(double x);
#pragma function(acos,asin)
#if _MSC_VER > 1200
#pragma function(floor)
#endif
 
 
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 = (Byte)(value >> 16);
g = (Byte)(value >> 8);
b = (Byte)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 );
 
#if _MSC_VER < 1400
extern "C" void * __cdecl memcpy( void *dst, const void *src, size_t bytesCount );
extern "C" void memset( Byte *dst, Byte filler, Dword count );
#pragma intrinsic(memcpy,memset)
#else
void * __cdecl memcpy( void *dst, const void *src, size_t bytesCount );
void memset( Byte *dst, Byte filler, Dword count );
#endif
 
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 );
// ôóíêöèÿ 67 èçìåíåíèå êîëè÷åñòâà ïàìÿòè, âûäåëåííîé äëÿ ïðîãðàììû
bool kos_ApplicationMemoryResize( Dword targetSize );
// ôóíêöèÿ 66 ðåæèì ïîëó÷åíèÿ äàííûõ îò êëàâèàòóðû
void kos_SetKeyboardDataMode( Dword mode );
 
//
void kos_Main();
/programs/games/kosilka/kosilka.cpp
0,0 → 1,1464
/* ------- ÊÎÑÈËÊÀ ÄËß ÊÎËÈÁÐÈ -------
Èãðà ïèøåòñÿ íà C++ (èñïîëüçóåòñÿ MS Visual C++ 6.0).
Ýòî - èñõîäíèê âåðñèè 1.0.
Andrey Mihaylovich aka Dron2004
*/
 
 
 
#include "kosSyst.h"
#include "kosFile.h"
 
 
 
//ÂÍÅØÍÈÅ ÓÐÎÂÍÈ
bool external_levels_available=false;
bool external_levels = false;
int level_read_result;
Byte * externallevels;
Byte external_levels_count[1] = {0};
/////////////////
 
int lastkosilkadirection=1;
int laststep=0; //Ïîñëåäíèé õîä. Çäåñü
// 0 - íåò òàêîâîãî
// 1 - âíèç
// 2 - ââåðõ
// 3 - âëåâî
// 4 - âïðàâî
 
 
Byte skindata[13824];
int read_result=0;
bool skin_available=false;
bool w_redraw=true;
 
const char windowTitle[]="Š®á¨«ª  ¤«ï Š®«¨¡à¨";
const char version[]="‚¥àá¨ï 1.1";
int levelcount=7; //×èñëî óðîâíåé
 
char gamearea[20][20]; //Êàðòà
 
 
short int kosilkax; // Ïîëîæåíèå êîñèëêè
short int kosilkay;
short int kosilkadirection=1; //Íàïðàâëåíèå ïðîøëîãî øàãà. 1-âíèç, 2-ââåðõ, 3-âëåâî, 4-âïðàâî
short int lives=2; // Æèçíè
short int level=1; //Óðîâåíü
short int status=0; //Ãäå 0 - ïðèâåòñòâèå
// 1 - èãðà
// 2 - èãðà ïðîéäåíà
// 3 - âû ïðîèãðàëè
// 4 - âûáîð íàáîðà óðîâíåé (âñòðîåííûé èëè âíåøíèé)
// -1 - î ïðîãðàììå
bool gamestarted=false; //Áëîêèðîâêà èãðîâûõ êëàâèø. Åñëè false - èãðàòü íåëüçÿ
 
bool drawgraphics=true; //Ðèñîâàòü ëè äåòàëüíóþ ãðàôèêó (èëè îãðàíè÷èòüñÿ àñêåòè÷íîé)
bool drawanimation=true; //Àíèìèðîâàòü ëè
bool skinned=false;
int grassLeft(); //Ñîîáùèì î íàëè÷èè ôóíêöèè Grass Left
 
//Ãðàôèêà èãðû
 
RGB kosilka_d[576];
RGB kosilka_l[576];
RGB kosilka_r[576];
RGB kosilka_u[576];
RGB grass[576];
RGB stone[576];
RGB tree[576];
RGB skos[576];
 
Byte kosilka_d1[]={0,1,2,3,4,5,5,6,6,6,5,5,5,5,5,6,5,5,5,4,2,2,1,7,1,2,4,6,21
,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,6,5,2,40,1,4,62,63,63,64,65,66,66
,67,66,66,66,66,68,66,66,63,69,65,65,62,4,1,2,6,75,91,64,65,67,92,75,75,75,75,75
,75,75,75,75,93,65,94,94,62,6,2,3,6,76,94,96,67,103,104,104,104,104,104,104,105
,106,107,108,109,93,63,64,75,6,3,3,21,75,94,94,67,115,104,104,104,104,105,105
,106,107,108,116,117,92,65,96,76,21,4,3,21,62,64,63,78,115,105,105,105,105,106
,107,108,116,116,119,120,92,65,96,77,6,3,4,6,62,96,69,67,123,106,106,107,107,108
,108,116,119,119,127,124,92,66,64,77,21,4,3,21,62,64,91,67,123,107,108,108,116
,116,119,119,127,127,127,124,75,69,64,77,21,4,4,6,62,64,69,68,123,108,116,119
,119,127,127,127,129,129,129,125,93,63,64,77,21,4,4,21,62,64,91,67,123,119,119
,127,127,129,129,129,129,129,129,125,68,94,64,77,6,4,3,21,62,64,94,63,122,128
,128,121,121,121,121,121,121,121,121,76,66,69,91,77,21,4,4,21,62,64,94,69,69,65
,66,67,68,68,67,68,67,67,66,66,69,91,64,77,21,4,4,21,76,96,64,94,94,64,94,96,69
,91,94,94,64,69,69,94,64,64,64,77,6,4,3,6,75,64,64,64,64,64,64,64,64,64,64,64,64
,64,64,64,64,64,96,75,21,4,3,6,16,94,64,64,64,64,64,64,64,64,64,64,64,64,64,64
,64,64,96,75,6,2,2,6,75,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,62
,6,2,1,2,33,95,111,111,111,111,79,79,79,79,79,79,79,79,111,95,79,111,95,33,32,40
,7,42,49,44,47,72,44,47,80,49,45,72,45,70,47,47,47,46,71,45,44,49,50,15,15,43,45
,72,70,71,44,71,43,44,44,46,47,71,49,71,45,47,45,47,80,80,110,0,15,45,45,45,44
,44,72,72,70,45,44,71,46,71,80,44,45,47,44,71,72,71,45,9,14,45,47,72,46,73,45,47
,72,46,45,47,45,70,43,45,45,46,47,44,43,43,42,10,8,32,42,45,46,44,43,44,44,47,45
,45,49,44,46,46,45,44,45,44,45,42,41,9,10,114,36,36,12,10,12,14,9,11,10,36,13,11
,10,9,13,12,11,9,10,8,8,8
};
 
Byte kosilka_u1[]={8,9,9,10,9,11,12,13,9,10,11,13,8,10,11,9,14,12,10,12,14,8,11
,10,9,41,42,43,44,45,44,45,46,46,44,45,45,45,47,44,44,43,44,46,45,42,32,0,14,42
,45,43,44,47,46,45,45,43,70,45,71,45,46,72,47,45,73,46,44,71,45,14,11,45,71,72
,71,44,47,45,44,80,71,46,71,44,45,70,72,72,44,44,45,45,45,15,0,110,80,80,71,45
,47,45,71,49,71,47,46,44,44,43,71,44,71,70,72,43,71,15,15,50,49,44,45,71,46,47
,47,71,70,45,72,45,49,80,47,44,72,47,44,45,50,15,1,32,121,95,111,79,95,111,79,79
,79,79,79,79,79,79,111,111,111,111,95,121,3,1,2,5,62,96,64,64,64,64,64,64,64,64
,64,64,64,64,64,64,64,96,96,75,5,2,2,6,75,94,64,64,64,64,64,64,64,64,64,64,64,64
,64,64,64,64,96,76,6,3,4,21,75,96,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64
,64,94,76,6,3,4,21,77,64,64,64,94,69,69,64,94,94,91,69,64,94,64,94,94,64,64,16
,21,4,4,6,77,64,91,69,66,66,66,67,67,67,68,68,67,66,65,69,69,94,64,77,21,4
,4,21,77,64,69,66,76,121,121,121,121,121,121,121,121,128,128,122,63,94,64,62,21
,3,4,6,77,64,94,67,125,129,129,129,129,129,129,127,127,119,119,123,66,91,64,62
,21,4,4,21,77,64,63,92,125,129,129,129,127,127,127,119,119,116,108,123,68,69,64
,62,6,4,4,21,77,64,63,92,124,127,127,127,119,119,116,108,108,108,108,123,68,91
,64,62,21,3,4,21,77,91,66,92,124,127,119,119,116,108,108,107,107,106,106,123,67
,69,64,62,21,3,3,21,77,64,65,92,120,119,116,116,108,107,106,105,105,105,105,115
,93,63,64,62,6,3,4,21,75,64,65,92,117,116,108,107,106,105,105,105,104,104,104
,115,67,94,96,76,21,3,3,6,75,96,63,93,109,108,107,106,105,104,104,104,104,104
,104,136,67,96,94,76,6,3,2,6,62,94,94,65,93,75,75,75,75,75,75,75,92,75,93,67,65
,64,64,75,6,2,1,4,62,65,65,69,63,65,66,67,66,66,65,65,67,66,66,65,64,63,65,62,4
,1,1,2,6,6,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,6,4,2,1,7,1,2,2,4,5
,5,6,6,5,5,5,6,6,6,6,6,5,6,3,4,2,1,0
};
 
Byte kosilka_l1[]={10,8,14,15,15,15,1,2,3,2,4,4,3,3,4,3,3,3,3,3,2,1,1,0,11,48,49
,45,47,50,3,6,6,6,21,21,21,21,6,21,21,6,21,6,5,4,2,1,29,42,71,45,74,49,33,75,76
,76,76,62,62,62,62,62,62,62,76,76,75,62,4,2,14,70,72,45,72,44,95,96,94,94,94,96
,64,64,64,64,64,96,94,94,94,66,6,3,12,46,46,44,70,47,111,64,96,96,64,94,94,91,69
,91,69,63,94,96,64,63,21,4,10,44,73,44,71,72,111,64,64,64,94,69,63,66,68,67,67
,68,67,67,65,64,21,5,12,43,45,72,44,44,111,64,64,64,94,69,122,123,123,123,123
,115,115,103,67,63,21,6,14,44,47,72,71,47,111,64,64,64,64,65,128,119,116,107,106
,105,104,104,93,66,21,6,9,44,72,70,43,80,79,64,64,64,94,66,128,119,116,108,106
,105,104,104,75,66,21,6,11,47,46,45,44,49,79,64,64,64,64,67,121,127,116,108,107
,105,104,104,92,67,21,6,10,45,45,44,44,45,79,64,64,64,69,68,121,127,119,116,107
,106,104,104,75,66,21,6,8,49,47,71,46,72,79,64,64,64,91,68,121,129,127,116,108
,106,105,104,75,66,21,6,13,45,45,46,47,45,79,64,64,64,94,67,121,129,127,119,108
,107,105,104,75,66,21,4,11,44,70,71,71,70,79,64,64,64,94,67,121,129,127,119,116
,108,106,105,75,66,21,5,10,46,43,80,49,47,79,64,64,64,64,67,121,129,129,127,119
,108,107,106,75,67,21,4,9,46,45,44,71,47,79,64,64,64,69,67,121,129,129,127,119
,116,108,107,75,66,21,6,13,45,45,45,45,47,111,64,64,64,69,66,121,129,129,127,127
,119,116,108,75,66,21,6,12,44,46,47,47,46,95,64,64,64,94,66,76,125,125,124,124
,120,117,109,93,63,21,4,11,45,47,44,45,71,79,64,64,64,64,69,66,68,92,75,92,92,92
,93,65,69,21,6,9,44,44,71,47,45,111,64,64,64,64,91,69,94,63,69,66,65,65,63,94,65
,21,4,10,47,43,72,80,44,95,64,64,64,64,64,64,64,64,64,64,64,64,64,64,63,6,2,9,42
,45,47,80,45,121,62,75,75,77,77,77,77,77,77,77,77,75,75,62,75,5,2,0,48,42,45,71
,50,2,6,6,21,6,21,21,6,21,21,21,21,21,6,6,4,2,40,8,11,51,9,8,15,1,2,2,4,4,3,4,4
,4,4,4,3,3,3,2,1,1,7
};
 
Byte kosilka_r1[]={7,1,1,2,3,3,3,4,4,4,4,4,4,4,4,2,2,1,15,0,9,12,9,8,40,2,4,6,6
,21,21,21,21,21,6,21,21,6,4,1,15,51,52,53,47,45,23,9,2,6,62,62,75,75,77,77,77,77
,77,77,77,77,77,77,78,79,45,80,47,71,42,9,2,6,65,94,94,94,96,64,64,64,64,64,64
,96,64,64,64,95,44,72,44,43,45,10,4,21,65,94,63,65,65,66,69,63,94,69,91,64,64,64
,64,79,43,47,71,44,72,9,5,21,69,65,93,92,92,92,92,92,67,66,69,64,64,64,64,79,71
,45,44,47,43,11,5,21,63,93,109,117,120,124,124,125,125,76,66,94,64,64,64,95,46
,47,47,46,72,12,6,21,65,75,108,116,119,127,127,129,129,121,66,69,64,64,64,111,47
,45,45,45,45,13,6,21,66,75,107,108,116,119,127,129,129,121,66,69,64,64,64,79,47
,71,44,45,44,9,4,21,67,75,106,107,116,119,127,129,129,121,67,64,64,64,64,79,47
,49,80,43,44,10,5,21,66,75,105,106,108,116,119,127,129,121,67,94,64,64,64,79,70
,71,71,70,72,11,4,21,66,75,104,105,107,108,119,127,129,121,67,94,64,64,64,79,45
,47,46,45,45,13,6,21,66,75,104,105,106,108,116,127,129,121,68,91,64,64,64,79,72
,46,71,47,45,8,6,21,65,75,104,104,105,107,116,119,127,121,68,69,64,64,64,79,45
,44,44,45,45,10,6,21,67,75,104,104,105,107,108,116,127,121,67,64,64,64,64,79,49
,44,45,46,46,11,6,21,66,92,104,104,105,106,108,116,119,128,66,94,64,64,64,79,80
,43,70,72,72,9,6,21,66,92,104,104,105,106,107,108,119,128,65,64,64,64,64,111,47
,71,72,47,72,14,6,21,65,67,103,115,115,123,123,123,123,122,69,94,64,64,64,111,44
,44,72,45,47,12,5,21,64,65,67,67,93,68,68,93,66,63,69,94,64,64,64,111,72,71,44
,73,72,10,3,21,63,64,96,94,63,69,91,69,91,94,94,64,64,64,64,111,47,70,44,46,44
,12,4,6,63,64,64,64,64,64,64,64,64,64,64,64,64,64,64,95,44,72,45,72,45,14,2,4,62
,75,76,76,62,62,62,62,62,62,62,76,62,62,77,79,45,43,45,46,42,36,1,2,5,6,6,21,6
,21,21,6,21,21,21,21,6,6,6,37,52,46,45,45,20,11,0,40,40,2,3,4,4,3,3,4,4,2,4,4,3
,3,2,1,15,15,15,14,36,10
};
 
Byte skos1[]={13,14,14,14,12,11,10,14,11,14,10,9,13,13,13,14,9,13,8,12,13,11,14
,8,11,10,9,8,10,10,12,11,14,10,9,14,14,9,10,12,10,14,9,11,10,8,10,8,13,14,10,8
,10,10,13,13,10,11,11,10,8,14,12,13,9,12,12,12,9,9,9,12,8,13,9,13,8,14,13,8,12
,13,11,9,11,14,9,10,10,9,14,10,8,12,12,13,9,10,14,12,14,12,9,9,8,8,10,8,12,8,14
,13,13,14,8,10,9,10,10,9,13,9,8,9,8,12,12,9,14,14,10,14,14,14,14,9,12,14,12,14
,13,10,11,51,12,13,10,14,8,8,11,13,8,8,8,9,14,12,8,13,14,14,9,14,13,9,8,126
,12,8,10,11,10,8,14,14,10,8,12,12,13,12,9,13,10,14,13,11,12,9,11,12,13,13,11,13
,12,13,13,10,8,10,14,12,11,10,11,9,14,10,11,11,11,12,9,8,9,13,14,8,8,14,10,11,9
,14,13,9,10,11,12,8,11,8,8,13,9,12,9,10,10,11,12,8,10,11,9,9,10,10,14,14,8,14,8
,13,14,9,14,11,8,12,12,14,12,14,13,9,11,8,8,14,10,9,11,12,11,10,9,9,9,11,11,14
,10,11,14,11,9,8,12,12,9,14,14,10,14,14,14,14,9,12,14,12,14,13,10,11,10,10,10,10
,8,8,8,10,13,9,12,9,12,8,8,14,11,11,13,13,12,13,12,8,11,12,13,11,12,10,13,8,8,8
,10,9,11,13,14,12,14,12,12,12,8,14,12,13,10,10,8,14,11,13,14,11,9,10,12,13,8,10
,11,13,11,11,14,9,11,8,10,14,10,14,10,12,8,8,14,14,11,13,11,12,8,8,13,12,11,14,9
,13,11,8,12,10,10,8,12,12,51,10,9,8,9,13,10,14,8,14,8,9,9,14,8,10,14,13,8,11,8
,11,13,12,13,10,13,10,10,10,9,12,11,13,14,13,11,8,14,8,10,10,10,14,13,10,11,10
,11,13,13,12,12,9,11,12,8,13,9,10,14,10,9,9,9,13,12,12,11,8,13,13,36,13,9,10,13
,12,8,13,12,9,13,10,11,12,12,10,9,13,8,9,12,10,11,12,14,9,14,14,8,11,14,12,12,10
,11,9,8,8,14,14,11,13,11,12,8,8,13,12,8,8,10,13,14,10,11,8,8,8,11,11,14,11,12,10
,13,9,14,14,9,9,11,9,10,11,8,14,12,10,12,14,9,11,10,8,13,11,10,9,13,12,11,9,10,9
,9,8
};
 
Byte grass1[]={16,17,17,18,17,19,20,21,22,22,23,22,24,18,23,23,25,18,22,26,27,28
,28,18,20,24,28,54,55,19,54,56,24,20,54,24,24,20,24,20,20,24,27,24,17,54,54,24
,55,55,28,55,55,54,54,55,54,24,54,54,24,24,54,20,54,17,54,54,55,24,81,55,17,19
,17,27,81,27,54,19,17,54,41,18,24,24,81,23,19,55,18,27,24,97,20,54,19,112,55,81
,18,24,19,24,48,20,55,28,81,28,18,24,112,55,18,81,17,54,24,54,118,19,54,81,23,81
,55,41,26,23,26,26,41,20,26,55,19,81,18,17,28,54,19,28,55,54,17,22,17,55,17,17
,81,18,28,25,97,18,27,112,112,81,24,24,27,26,81,54,24,54,17,27,55,28,23,97,25,54
,28,23,26,26,22,112,55,97,24,28,27,26,16,55,17,27,54,18,19,54,23,16,97,20,54,25
,26,26,19,19,48,18,16,28,17,23,20,19,28,55,24,20,19,28,20,48,23,33,19,97,26,26
,55,54,18,26,25,19,28,26,28,17,27,55,81,23,19,19,18,20,24,41,54,22,26,81,17,27
,17,25,26,28,24,48,22,27,26,55,54,55,55,28,16,33,5,24,41,18,48,55,19,48,97,16,26
,27,48,33,23,97,22,28,19,54,48,81,21,6,21,41,26,33,33,28,54,20,16,48,18,26,33,16
,48,23,17,19,112,26,23,48,21,21,131,48,26,33,97,17,17,20,16,25,97,16,16,26,21,20
,19,112,54,26,26,21,20,41,6,33,16,25,33,55,19,16,41,25,48,16,26,48,97,24,55,54
,24,24,23,21,23,97,48,21,33,24,6,54,54,132,54,18,16,97,28,26,22,28,27,54,20,16
,23,33,22,16,26,48,17,20,33,54,24,19,20,25,97,48,54,54,26,27,20,20,41,21,97,6,33
,23,26,48,19,17,48,24,23,24,27,16,18,16,55,55,19,26,27,54,48,21,24,48,23,33,25
,33,28,23,97,97,6,16,16,20,25,48,17,48,97,22,27,24,20,48,22,17,27,48,48,16,22,25
,24,41,33,25,25,54,23,97,17,18,27,22,97,24,20,18,23,27,17,23,48,25,23,97,27,97
,18,26,18,22,26,18,19,17,28,26,23,17,81,97,25,81,27,24,6,97,48,18,97,16,16,81,33
,18,22,26,24,17,27,23,26,17,27,23,26,26,54,41,33,18,97,22,18,22,48,18,16,97,22
,18,18,27,27,26,48,27,17,97,18,27,55,21,20,26,23,26,27,27,22,26,16,23,22,26,27
,140,19,20
};
 
Byte stone1[]={13,14,14,29,30,31,31,31,30,3,32,33,32,34,35,36,9,13,8,12,13,11,14
,8,11,10,36,30,31,57,58,57,31,59,59,59,59,31,31,30,32,29,11,11,10,8,10,8,13,8,30
,31,58,82,83,82,82,83,84,84,85,84,83,58,59,30,30,51,9,9,9,12,8,98,30,57,99,83,83
,83,83,84,84,85,100,73,49,74,73,82,31,30,8,12,12,13,9,0,30,57,82,83,83,83,83,84
,84,85,85,73,49,74,113,74,84,59,30,114,10,9,12,0,30,59,58,82,83,83,83,83,84,85
,85,73,49,74,74,113,113,83,31,30,11,10,12,13,30,30,57,99,82,83,83,83,84,84,85
,100,49,49,74,113,113,74,99,30,29,13,12,8,0,30,57,82,83,83,83,83,83,84,85,100,73
,49,74,113,113,113,85,31,40,12,13,13,1,30,99,83,83,83,83,83,83,84,84,85,73,49,74
,74,113,113,74,57,32,8,9,13,30,59,82,83,82,83,83,83,83,83,84,85,100,73,49,74,74
,113,113,57,5,51,10,0,30,57,82,82,83,83,83,83,83,83,84,85,85,73,49,74,74,113,113
,58,130,11,12,29,30,57,82,82,83,83,83,83,83,83,83,84,85,100,73,49,74,74,74,99,30
,11,9,29,30,57,82,82,83,83,83,83,83,83,83,84,84,85,73,49,49,74,74,82,30,0,8,8,30
,31,99,82,82,83,83,83,83,83,83,83,84,85,100,73,49,74,74,83,31,15,12,10,15,30,58
,82,82,82,83,83,83,83,83,83,84,84,85,100,73,49,74,84,31,1,11,13,7,30,58,82,82,82
,82,82,82,83,83,82,83,84,85,85,100,73,49,84,31,15,8,8,7,30,58,82,82,82,82,82,82
,82,82,82,83,84,84,85,85,73,73,82,30,35,10,10,35,30,57,82,82,82,82,82,82,82,82
,83,82,83,84,84,85,85,85,59,30,51,13,10,133,30,59,99,99,82,82,82,82,82,82,82,83
,82,83,84,84,84,57,30,35,10,11,13,13,1,31,58,82,99,82,82,82,99,58,58,82,82,83,83
,99,57,31,40,13,13,8,13,9,0,30,59,99,99,99,99,99,58,59,59,57,57,57,59,31,30,15
,10,11,12,14,9,14,14,15,30,31,58,58,58,57,30,30,30,30,30,30,32,1,37,8,8,13,12,8
,8,10,13,14,35,30,30,31,30,30,30,8,0,37,0,133,9,14,14,9,9,11,9,10,11,8,14,12,10
,37,40,32,1,35,8,13,11,10,9,13,12,11,9,10,9,9,8
};
 
Byte tree1[]={13,14,8,36,37,11,10,36,38,39,0,14,13,13,13,14,9,13,8,12,13,11,14,8
,11,36,39,39,39,34,38,39,60,61,60,39,34,0,37,37,14,36,15,36,14,8,10,8,11,86,60
,87,61,60,88,61,89,90,89,61,60,88,39,86,39,88,88,88,39,15,9,12,34,88,87,89,89
,101,89,89,89,89,89,89,101,61,61,90,89,89,102,87,60,39,37,13,34,60,89,89,89,89
,89,89,89,89,89,89,89,89,89,89,89,89,89,89,102,88,7,11,15,88,102,101,89,89,89,89
,89,89,101,89,89,101,89,89,89,89,89,89,101,60,34,51,8,39,60,102,89,89,89,89,89
,90,102,101,89,101,101,89,89,89,89,89,101,60,39,51,37,34,60,90,101,89,89,101,89
,101,101,89,89,89,89,89,89,89,89,89,89,87,88,15,37,60,89,89,89,89,101,90,89,89
,89,89,89,89,89,89,89,89,89,89,89,101,102,88,39,102,89,89,89,89,101,90,89,89,89
,89,89,89,101,101,101,101,89,89,89,89,89,61,32,102,89,89,89,89,101,90,90,101,89
,89,89,101,87,101,89,89,89,89,89,89,89,102,39,61,89,89,89,89,89,89,101,102,101
,89,89,90,89,89,89,89,89,89,89,89,89,90,9,39,61,101,89,89,89,89,101,102,102,89
,101,101,89,89,89,89,89,89,89,89,89,102,36,34,88,102,89,89,89,89,89,101,101,89
,89,89,89,89,89,89,89,89,89,101,90,60,8,39,60,101,89,89,89,89,89,89,89,89,89,89
,89,89,89,89,89,89,89,101,101,60,34,88,101,89,89,89,89,89,89,89,89,89,89,89,89
,89,89,89,89,101,101,89,89,102,34,60,89,89,89,89,89,89,89,89,89,89,89,89,89,89
,89,89,101,90,101,89,89,101,34,88,87,89,89,101,89,89,89,89,90,102,89,89,89,89,89
,89,89,89,101,89,89,102,37,32,60,102,87,87,89,89,89,134,135,135,101,89,89,89,89
,89,89,89,101,102,102,60,11,51,37,38,34,88,61,102,61,39,137,131,134,101,101,101
,102,90,89,89,102,60,39,37,8,51,11,37,37,0,39,39,32,15,137,137,138,60,61,60,88
,88,102,102,60,39,40,10,11,9,14,8,8,36,40,36,51,51,137,137,137,34,39,34,29,38,39
,39,32,15,13,12,8,8,10,51,14,37,37,8,8,8,137,137,137,8,9,139,51,8,7,7,14,11,11,9
,10,11,8,14,51,10,12,14,11,11,137,137,137,11,10,9,13,51,14,11,51,9,9,8
};
 
 
//Ïàëèòðà öâåòîâ. Äåêîäèðóåì â 0xRRGGBB
 
char * apppath;
char * levpath;
char * getSkinPathName(){
 
int lastslashindex=0;
static char skinfilename[]="kosskin.gfx";
int tempslfnd=0;
 
for (tempslfnd=0; tempslfnd < strlen(kosExePath); tempslfnd++){
if (kosExePath[tempslfnd]=='/'){lastslashindex=tempslfnd;}
}
 
apppath = new char[lastslashindex+strlen(skinfilename)+1];
 
for (tempslfnd=0; tempslfnd <= lastslashindex; tempslfnd++){
apppath[tempslfnd]=kosExePath[tempslfnd];
}
for (tempslfnd=0; tempslfnd < strlen(skinfilename); tempslfnd++){
apppath[tempslfnd+lastslashindex+1]=skinfilename[tempslfnd];
}
 
return apppath;
 
}
 
char * getLevelsPathName(){
 
int lastslashindex=0;
static char levfilename[]="koslevel.pak";
int tempslfnd=0;
 
for (tempslfnd=0; tempslfnd < strlen(kosExePath); tempslfnd++){
if (kosExePath[tempslfnd]=='/'){lastslashindex=tempslfnd;}
}
 
levpath = new char[lastslashindex+strlen(levfilename)+1];
 
for (tempslfnd=0; tempslfnd <= lastslashindex; tempslfnd++){
levpath[tempslfnd]=kosExePath[tempslfnd];
}
for (tempslfnd=0; tempslfnd < strlen(levfilename); tempslfnd++){
levpath[tempslfnd+lastslashindex+1]=levfilename[tempslfnd];
}
 
return levpath;
 
}
 
 
void decode_graphics(Byte * source, RGB * target){
static RGB palette[] = {
0x978A31,0x8B7F2E,0x867B2B,0x82762B,0x7F7428,0x79702B,0x766C26,0x90832E,
0x978A2F,0x9A8C31,0x9B8D32,0x998C31,0x9C8E33,0x9D8F34,0x988B30,0x928531,
0x887532,0xBAA454,0xA18C3D,0xC6B26A,0xA08E46,0x6B5F26,0xAF9844,0x9C873B,
0xAB964D,0x988338,0xA89140,0xB49D4C,0xC1AC5C,0x94872F,0x303030,0x343435,
0x827933,0x806E2F,0x8B8134,0x938632,0x96892F,0x988C33,0x8F873B,0x7E9F39,
0x8E812D,0x92803F,0x75715C,0x676462,0x6D6A68,0x666260,0x6B6866,0x6A6664,
0x8E7B35,0x626161,0x797641,0x9B8E33,0x7F7954,0x776A67,0xB29E55,0xBCA75E,
0x978C3E,0x3E3E3D,0x434245,0x373938,0x3C9737,0x209437,0xB97934,0xE6863E,
0xF28C41,0xE2833D,0xDD803B,0xD77C3A,0xD17938,0xEA883F,0x605D5B,0x686563,
0x706D6B,0x5F5F5E,0x656566,0xB56931,0xAC663B,0xC17D36,0xC88338,0x997246,
0x737271,0xA89546,0x4D4D4E,0x515152,0x565656,0x5A5A59,0x687B41,0x098933,
0x5B9B38,0x009036,0x069136,0xF18B41,0xC27034,0xCD7737,0xEE8A40,0xA0774B,
0xF18C41,0x948037,0x988B34,0x49484A,0x5D5D5D,0x039036,0x0E9236,0xB06B7B,
0x949CF8,0x7C85F6,0x6A74F5,0x5A66F4,0x4653F1,0x5F53B6,0x726462,0x9C7449,
0xD0C472,0x696969,0x998B32,0x9D6676,0x3B47DD,0x5349A0,0xD8CD77,0x343EC1,
0x4F438C,0x8E5538,0xC37341,0x895D71,0x483B74,0x433359,0x9C8D34,0x2A329A,
0x995F49,0x1D236D,0x756E37,0x524819,0x8D8848,0x9B8D34,0x157F2F,0x2D6C28,
0xAA778B,0x663C15,0x4E5924,0x9D8F31,0xBCAD48
};
 
for (int lc=0;lc<576;lc++)
target[lc] = palette[source[lc]];
}
 
 
void interlevelpause(){ //Ïàóçà ìåæäó óðîâíÿìè
Byte tempCode;
RGB tmprgb;
int tmpa=0;
laststep=0;
static int yellow_pal[] = {0xA8A93D,0xBEBF4C,0xD6D856,0xDFE15A,0xECEE5B,
0xECEE5B,0xDFE15A,0xD6D856,0xBEBF4C,0xA8A93D};
for (int iic=0;iic<240;iic++){
kos_WaitForEvent(1);
kos_GetKey(tempCode);
 
kos_DrawBar(iic*2,0,2,480,yellow_pal[tmpa]);
 
tmpa++;
if (tmpa>9){tmpa=0;}
}
}
 
void draw_element(int elx, int ely){ //Îòðèñîâêà ýëåìåíòà êàðòû
switch (gamearea[elx][ely]){
case 'g':
if (drawgraphics==true){
kos_PutImage((RGB*)grass,24,24,elx*24,ely*24);
}
else
{
kos_DrawBar(elx*24,ely*24,24,24,0xAAAA00);
}
break;
case 'k':
if (drawgraphics==true){
switch(kosilkadirection){
case 1:
kos_PutImage((RGB*)kosilka_d,24,24,elx*24,ely*24);
break;
case 2:
kos_PutImage((RGB*)kosilka_u,24,24,elx*24,ely*24);
break;
case 3:
kos_PutImage((RGB*)kosilka_l,24,24,elx*24,ely*24);
break;
case 4:
kos_PutImage((RGB*)kosilka_r,24,24,elx*24,ely*24);
break;
}
 
 
}
else
{
kos_DrawBar(elx*24,ely*24,24,24,0x00AAAA);
}
 
 
break;
case 'n':
if (drawgraphics==true){
kos_PutImage((RGB*)skos,24,24,elx*24,ely*24);
}
else
{
kos_DrawBar(elx*24,ely*24,24,24,0xAAAAAA);
}
 
 
break;
case 's':
if (drawgraphics==true){
kos_PutImage((RGB*)stone,24,24,elx*24,ely*24);
}
else
{
kos_DrawBar(elx*24,ely*24,24,24,0x555555);
}
 
 
break;
 
case 't':
if (drawgraphics==true){
kos_PutImage((RGB*)tree,24,24,elx*24,ely*24);
}
else
{
kos_DrawBar(elx*24,ely*24,24,24,0x005500);
}
 
 
break;
 
}
 
}
 
 
void display_grass_left(){ //Âûâîäèì íà ýêðàí êîëè÷åñòâî îñòàâøåéñÿ òðàâû
kos_DrawBar(605,120,20,10,0xEEEEEE);
kos_DisplayNumberToWindow(grassLeft(),3,605,120,0x0000FF,nbDecimal,false);
}
 
 
void animate(int initcellx, int initcelly, int direction){ //àíèìàöèÿ äâèæåíèÿ êîñèëêè
int tmpp=0;
switch (direction){
case 1:
for (tmpp=0; tmpp<23;tmpp++){
if (drawgraphics==true){
kos_PutImage((RGB*)skos,24,24,initcellx*24,initcelly*24);
kos_PutImage((RGB*)kosilka_d,24,24,initcellx*24,initcelly*24+tmpp);
} else {
kos_DrawBar(initcellx*24,initcelly*24,24,24,0xAAAAAA);
kos_DrawBar(initcellx*24,initcelly*24+tmpp,24,24,0x00AAAA);
 
}
kos_Pause(1);
}
break;
case 2:
for (tmpp=0; tmpp<23;tmpp++){
if (drawgraphics==true){
kos_PutImage((RGB*)skos,24,24,initcellx*24,initcelly*24);
kos_PutImage((RGB*)kosilka_u,24,24,initcellx*24,initcelly*24-tmpp);
} else {
kos_DrawBar(initcellx*24,initcelly*24,24,24,0xAAAAAA);
kos_DrawBar(initcellx*24,initcelly*24-tmpp,24,24,0x00AAAA);
}
kos_Pause(1);
}
break;
case 3:
for (tmpp=0; tmpp<23;tmpp++){
if (drawgraphics==true){
kos_PutImage((RGB*)skos,24,24,initcellx*24,initcelly*24);
kos_PutImage((RGB*)kosilka_r,24,24,initcellx*24+tmpp,initcelly*24);
} else {
kos_DrawBar(initcellx*24,initcelly*24,24,24,0xAAAAAA);
kos_DrawBar(initcellx*24+tmpp,initcelly*24,24,24,0x00AAAA);
 
}
kos_Pause(1);
}
break;
case 4:
for (tmpp=0; tmpp<23;tmpp++){
if (drawgraphics==true){
kos_PutImage((RGB*)skos,24,24,initcellx*24,initcelly*24);
kos_PutImage((RGB*)kosilka_l,24,24,initcellx*24-tmpp,initcelly*24);
} else {
kos_DrawBar(initcellx*24,initcelly*24,24,24,0xAAAAAA);
kos_DrawBar(initcellx*24-tmpp,initcelly*24,24,24,0x00AAAA);
 
}
kos_Pause(1);
}
break;
}
 
}
 
 
void draw_window(void){ //Ïåðåðèñîâêà îêíà
//----Leency
if (w_redraw)
{
kos_WindowRedrawStatus(1); //Íà÷àëî ïåðåðèñîâêè
kos_DefineAndDrawWindow(50,50,640,506,0x74,0xEEEEEE,0,0,(Dword)windowTitle);
}
w_redraw=false;
 
 
//Ïåðåðèñîâêà êàðòû
if ((status!=0)&&(status!=-1)&&(status!=4))
{
kos_DrawBar(631-151,0,151,480,0xEEEEEE);
 
kos_WriteTextToWindow(505,30,0x80, 0 ,"Š Ž ‘ ˆ ‹ Š €",19);
kos_WriteTextToWindow(522,40,0x80, 0 ,"¤«ï Š®«¨¡à¨ Ž‘",14);
 
kos_WriteTextToWindow(495,80,0x80, 0 ,"“஢¥­ì:",6);
kos_DisplayNumberToWindow(level,3,605,80,0x0000FF,nbDecimal,false);
 
kos_WriteTextToWindow(495,95,0x80, 0 ,"Žáâ «®áì ¯®¯ë⮪:",11);
kos_DisplayNumberToWindow(lives,1,605,95,0x0000FF,nbDecimal,false);
 
kos_WriteTextToWindow(495,120,0x80, 0 ,"Žáâ «®áì âà ¢ë:",11);
display_grass_left();
 
kos_WriteTextToWindow(526,450,0x80, 0 ,(char*)version,12);
 
for (int cy=0;cy<20;cy++) for (int cx=0;cx<20;cx++) draw_element(cx,cy);
}
 
if (status==0){
kos_DrawBar(0,0,4,480,0x000000);
kos_DrawBar(628,0,3,480,0x000000);
//Leency----
 
for (int tmpppy=0;tmpppy<20;tmpppy++){
for (int tmpppx=0;tmpppx<26;tmpppx++){
if ((tmpppx==0) || (tmpppx==25) || (tmpppy==0) || (tmpppy==19)){
kos_PutImage((RGB*)stone,24,24,4+tmpppx*24,tmpppy*24);
}
else
{
kos_PutImage((RGB*)skos,24,24,4+tmpppx*24,tmpppy*24);
}
}
}
 
if (drawgraphics==true){
kos_PutImage((RGB*)kosilka_d,24,24,305,150);
}
else
{
kos_DrawBar(305,150,24,24,0x00AAAA);
}
 
 
if (drawanimation==true){
kos_DrawBar(335,150,24,24,0x00AA00);
}
else
{
kos_DrawBar(335,150,24,24,0xAA0000);
}
 
kos_WriteTextToWindow(257,200,0x80, 0xFFFFFF ,"Š Ž ‘ ˆ ‹ Š €",19);
kos_WriteTextToWindow(290, 220,0x80, 0xFFFFFF ,"¤«ï Š®«¨¡à¨ Ž‘",14);
kos_WriteTextToWindow(239, 240,0x80, 0xFFFFFF ,"<¤«ï ­ ç «  ¨£àë ­ ¦¬¨â¥ ENTER>",30);
kos_WriteTextToWindow(30, 380,0x80, 0xFFFFFF ,"<­ ¦¬¨â¥ <g> ¤«ï ¯¥à¥ª«î祭¨ï ०¨¬  £à ä¨ª¨>",53);
kos_WriteTextToWindow(30, 400,0x80, 0xFFFFFF ,"<­ ¦¬¨â¥ <a> ¤«ï ¢ª«î祭¨ï/¢ëª«î祭¨ï  ­¨¬ æ¨¨>",41);
kos_WriteTextToWindow(30, 420,0x80, 0xFFFFFF ,"<­ ¦¬¨â¥ <h> ¤«ï ¯à®á¬®âà  á¢¥¤¥­¨© ® ¯à®£à ¬¬¥>",32);
if (skin_available==true) {kos_WriteTextToWindow(30, 440,0x80, 0xFFFFFF ,"<­ ¦¬¨â¥ <s> çâ®¡ë ¢ëª«îç¨âì/¢ª«îç¨âì ᪨­>",27);}
 
 
// kos_WriteTextToWindow(470, 440,0x80, 0xFFFFFF ,"­ ¦¬¨â¥ <ESC> ¤«ï ¢ë室 ",27);
// kos_DisplayNumberToWindow(external_levels_count[0],3,200,340,0x0000FF,nbDecimal,false);
 
 
 
kos_WriteTextToWindow(536, 440,0x80, 0xFFFFFF ,(char*)version,0);
}
if (status==2){
kos_DrawBar(10,150,610,200,0x528B4C);
kos_DrawBar(15,155,601,190,0x3BCF46);
kos_WriteTextToWindow(240,230,0x80, 0xFFFFFF ,"‚ë ¢ë¨£à «¨!",13);
kos_WriteTextToWindow(240,250,0x80, 0xFFFFFF ,"<­ ¦¬¨â¥ q ¤«ï ¢®§¢à â  ¢ ¬¥­î>",17);
}
if (status==3){
kos_DrawBar(10,150,610,200,0x8B4C4C);
kos_DrawBar(15,155,601,190,0xCF3B3B);
kos_WriteTextToWindow(220,220,0x80, 0xFFFFFF ,"ˆ£à  ®ª®­ç¥­ ...",13);
kos_WriteTextToWindow(220,240,0x80, 0xFFFFFF ,"<­ ¦¬¨â¥ r ¤«ï ⮣®, ç⮡ë áë£à âì ¥éñ à §>",23);
kos_WriteTextToWindow(220,260,0x80, 0xFFFFFF ,"<­ ¦¬¨â¥ q ¤«ï ¢®§¢à â  ¢ ¬¥­î>",17);
}
if (status==-1){
 
kos_DrawBar(0,0,4,480,0x000000);
kos_DrawBar(631-3,0,3,480,0x000000);
 
for (int tmpppy=0;tmpppy<20;tmpppy++){
for (int tmpppx=0;tmpppx<26;tmpppx++){
if ((tmpppx==0) || (tmpppx==25) || (tmpppy==0) || (tmpppy==19)){
kos_PutImage((RGB*)stone,24,24,4+tmpppx*24,tmpppy*24);
}
else
{
kos_PutImage((RGB*)skos,24,24,4+tmpppx*24,tmpppy*24);
}
}
}
 
kos_WriteTextToWindow(40,40,0x80, 0xFFFFFF ,"Š®á¨«ª  ¤«ï Ž‘ Š®«¨¡à¨",22);
kos_WriteTextToWindow(40,60,0x80, 0xFFFFFF ,(char*)version,12);
kos_WriteTextToWindow(40,75,0x80, 0xFFFFFF ,"________________________________________",40);
kos_WriteTextToWindow(40,120,0x80, 0xFFFFFF ,"Š®««¥ªâ¨¢ ࠧࠡ®â稪®¢:",18);
kos_WriteTextToWindow(40,150,0x80, 0xEEFFEE ,"€­¤à¥© Œ¨å ©«®¢¨ç aka Dron2004 - ¯à®£à ¬¬¨à®¢ ­¨¥, ¢áâ஥­­ ï £à ä¨ª  (¡¥§ ᪨­ )",32);
kos_WriteTextToWindow(40,170,0x80, 0xDDFFDD ,"Mario79 - â¥áâ¨à®¢ ­¨¥, ¯®¬®éì ¢ ࠧࠡ®âª¥, ¢ ¦­ë¥ ¨¤¥¨",35);
kos_WriteTextToWindow(40,190,0x80, 0xCCFFCC ,"Ataualpa - â¥áâ¨à®¢ ­¨¥, ¯®¬®éì ¢ ࠧࠡ®âª¥",36);
kos_WriteTextToWindow(40,210,0x80, 0xBBFFBB ,"Leency - â¥áâ¨à®¢ ­¨¥, ¯®¬®éì ¢ ࠧࠡ®âª¥, § ¬¥ç â¥«ì­ë¥ ᪨­ë, ¢ ¦­ë¥ ¨¤¥¨",62);
kos_WriteTextToWindow(40,230,0x80, 0xAAFFAA ,"Mike - â¥áâ¨à®¢ ­¨¥, ¯®¬®éì ¢ ࠧࠡ®âª¥",34);
kos_WriteTextToWindow(40,250,0x80, 0x99FF99 ,"bw - â¥áâ¨à®¢ ­¨¥, ¯®¬®éì ¢ ࠧࠡ®âª¥, ¢ ¦­ë¥ ¨¤¥¨",49);
kos_WriteTextToWindow(40,270,0x80, 0x99FF99 ,"diamond - ¨¤¥ï ®â¬¥­ë 室 , â¥áâ¨à®¢ ­¨¥",49);
 
kos_WriteTextToWindow(40,300,0x80, 0x88FF88 ,"Žâ¤¥«ì­®¥ ᯠᨡ®:",16);
kos_WriteTextToWindow(40,330,0x80, 0x77FF77 ,"‚ᥬ, ªâ® ¨£à ¥â ¢ íâã ¨£àã :-) !",50);
 
 
kos_WriteTextToWindow(40,430,0x80, 0x66FF66 ,"­ ¦¬¨â¥ <BACKSPACE> ¤«ï ¢®§¢à â  ¢ ¬¥­î",35);
}
 
 
if (status==4){
kos_DrawBar(0,0,631,480,0x000000);
 
for (int tmpppy=0;tmpppy<20;tmpppy++){
for (int tmpppx=0;tmpppx<26;tmpppx++){
if ((tmpppx==0) || (tmpppx==25) || (tmpppy==0) || (tmpppy==19)){
kos_PutImage((RGB*)stone,24,24,4+tmpppx*24,tmpppy*24);
}
else
{
kos_PutImage((RGB*)skos,24,24,4+tmpppx*24,tmpppy*24);
}
}
}
 
kos_WriteTextToWindow(215, 200,0x80, 0xFFFFFF ,"‚ë¡¥à¨â¥ ­ ¡®à ã஢­¥© (­ ¦¬¨â¥ <1> ¨«¨ <2>):",0);
kos_WriteTextToWindow(215, 220,0x80, 0xFFFFFF ,"1. ‚áâ஥­­ë¥ ã஢­¨",0);
kos_WriteTextToWindow(215, 240,0x80, 0xFFFFFF ,"2. ‚­¥è­¨© ­ ¡®à ã஢­¥©",0);
 
}
 
kos_WindowRedrawStatus(2); //Êîíåö ïåðåðèñîâêè
 
}
 
 
 
//Îïèñàíèå óðîâíåé èãðû
//, ãäå k - êîñèëêà
// g - òðàâà
// n - ñêîøåííàÿ òðàâà
// s - êàìåíü
// t - äåðåâî
void initializeLevel(int levnum){
laststep=0;
if (external_levels==false){
 
kosilkadirection=1;
if (levnum==1){
static char tmparea[20][20]={{'k','t','g','g','g','g','g','s','g','g','g','g','g','g','g','g','g','g','g','g'},
{'g','s','g','s','g','g','g','s','g','s','g','g','s','g','g','g','g','g','g','g'},
{'g','t','g','s','g','g','g','s','g','s','g','g','s','g','g','g','g','g','g','g'},
{'g','s','g','s','g','g','g','s','g','s','g','g','s','g','g','g','g','g','g','g'},
{'g','t','g','s','g','g','g','s','g','s','g','g','s','g','g','g','g','g','g','g'},
{'g','s','g','s','g','g','g','s','g','g','g','g','s','g','g','g','g','g','g','g'},
{'g','t','g','s','g','g','g','s','g','g','g','g','s','g','g','s','s','s','g','g'},
{'g','s','g','s','g','g','g','s','g','g','g','g','s','g','g','s','s','s','g','g'},
{'g','t','g','s','g','g','g','s','g','g','g','g','s','g','g','s','s','s','g','g'},
{'g','s','g','s','g','g','g','s','g','g','g','g','s','g','g','s','g','g','g','g'},
{'g','t','g','s','g','g','g','s','g','g','g','g','s','g','g','g','g','g','g','g'},
{'g','s','g','s','g','g','g','s','g','g','g','g','s','g','g','g','g','g','g','g'},
{'g','t','g','s','g','g','g','s','g','g','g','g','s','g','g','g','g','g','g','g'},
{'g','s','g','s','g','g','g','s','g','g','g','g','s','g','g','g','g','g','g','g'},
{'g','t','g','s','g','g','g','s','g','g','g','g','s','g','g','g','g','g','g','g'},
{'g','s','g','s','g','g','g','s','g','g','g','g','s','g','g','g','g','g','g','g'},
{'g','t','g','s','g','g','g','s','g','g','g','g','s','g','g','g','g','g','g','g'},
{'g','s','g','s','g','g','g','s','g','g','g','g','s','g','g','g','g','g','g','g'},
{'g','t','g','s','g','g','g','s','g','g','g','g','s','g','g','g','g','g','g','g'},
{'g','g','g','s','g','g','g','g','g','s','g','g','s','g','g','g','g','g','g','g'}};
for (int tyy=0;tyy<20;tyy++){
for (int txx=0;txx<20;txx++){
if (tmparea[txx][tyy]=='k'){
kosilkax=tyy;
kosilkay=txx;
}
 
gamearea[txx][tyy]=tmparea[tyy][txx];
}
}
}
if (levnum==2){
static char tmparea[20][20]={{'s','s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g'},
{'s','s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s','s','g'},
{'g','k','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s','s','g'},
{'g','g','g','g','g','g','g','g','g','g','g','g','s','s','g','g','g','g','g','g'},
{'g','g','g','g','g','g','g','g','g','g','g','g','s','s','g','g','g','g','g','g'},
{'g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g'},
{'g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g'},
{'g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g'},
{'s','s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g'},
{'s','s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g'},
{'g','g','g','g','g','g','g','g','s','s','g','g','g','g','g','g','g','s','s','g'},
{'g','g','g','g','g','g','g','g','s','s','g','g','g','g','g','g','g','s','s','g'},
{'g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g'},
{'g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g'},
{'g','g','g','g','g','g','g','g','g','g','g','g','g','s','s','g','g','g','g','g'},
{'g','g','g','g','g','g','g','g','g','g','g','g','g','s','s','g','g','g','g','g'},
{'g','g','g','s','s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g'},
{'g','g','g','s','s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g'},
{'g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g'},
{'g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g'}};
for (int tyy=0;tyy<20;tyy++){
for (int txx=0;txx<20;txx++){
if (tmparea[txx][tyy]=='k'){
kosilkax=tyy;
kosilkay=txx;
}
 
gamearea[txx][tyy]=tmparea[tyy][txx];
}
}
}
 
if (levnum==3){
static char tmparea[20][20]={{'t','n','t','n','t','n','t','n','t','n','t','n','t','n','t','n','t','n','t','k'},
{'n','t','g','g','g','g','g','g','g','g','g','g','s','n','n','s','n','s','t','g'},
{'t','n','g','g','g','g','g','g','g','g','g','g','n','t','n','n','n','t','t','g'},
{'n','t','g','g','g','g','g','g','g','g','g','g','n','s','n','s','n','s','t','g'},
{'t','n','g','g','g','g','g','s','s','g','g','g','n','n','n','n','n','t','t','g'},
{'n','t','g','g','g','g','g','g','g','g','g','g','t','n','s','n','n','s','t','g'},
{'t','n','g','g','g','g','g','g','g','g','g','g','n','n','n','n','n','t','t','g'},
{'n','t','g','g','g','g','g','g','g','g','g','g','n','n','s','n','n','s','t','g'},
{'t','n','g','g','g','g','g','g','g','g','g','g','n','s','n','n','n','t','t','g'},
{'n','t','g','g','g','g','g','g','g','g','g','g','s','n','n','n','n','t','g','g'},
{'t','n','g','g','g','s','g','g','g','g','g','g','t','t','t','t','t','t','g','g'},
{'n','t','g','g','g','s','g','g','g','g','g','g','g','g','g','g','g','t','g','g'},
{'t','n','g','g','g','g','g','g','g','g','g','g','t','t','g','g','g','t','g','g'},
{'n','t','g','g','g','g','g','g','t','t','g','g','g','t','g','g','g','t','g','g'},
{'t','n','g','g','g','g','g','g','t','t','g','g','g','t','g','g','g','t','g','g'},
{'n','t','g','g','g','g','g','g','g','g','g','g','g','t','g','g','g','t','g','g'},
{'t','n','g','g','g','g','g','g','g','g','g','g','g','t','t','g','g','t','g','g'},
{'n','t','g','g','g','g','g','g','g','g','g','g','g','g','t','g','g','t','g','g'},
{'t','n','g','g','g','g','g','g','g','g','g','g','g','g','t','g','g','t','g','g'},
{'n','t','s','s','s','s','s','s','s','s','s','s','s','s','t','g','g','g','g','g'}};
for (int tyy=0;tyy<20;tyy++){
for (int txx=0;txx<20;txx++){
if (tmparea[txx][tyy]=='k'){
kosilkax=tyy;
kosilkay=txx;
}
 
gamearea[txx][tyy]=tmparea[tyy][txx];
}
}
}
 
if (levnum==4){
static char tmparea[20][20]={{'t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t'},
{'t','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s','n','t'},
{'t','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s','n','t'},
{'t','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s','n','t'},
{'t','g','g','g','g','g','g','g','t','t','g','g','g','g','g','g','g','s','n','t'},
{'t','g','g','g','g','g','g','g','t','t','g','g','g','g','g','g','g','s','n','t'},
{'t','g','g','g','g','g','g','g','t','t','g','g','g','g','g','g','g','s','n','t'},
{'t','g','g','g','g','g','g','g','t','t','g','g','g','g','g','g','g','s','n','t'},
{'t','g','g','g','g','g','g','g','t','t','g','g','g','g','g','g','g','s','s','t'},
{'t','g','g','g','g','t','t','t','t','t','t','t','t','g','g','g','g','g','g','t'},
{'t','g','g','g','g','t','t','t','t','t','t','t','t','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','g','t','t','g','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','g','t','t','g','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','g','t','t','g','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','g','t','t','g','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','g','t','t','g','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','t'},
{'t','k','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','t'},
{'t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t'}};
for (int tyy=0;tyy<20;tyy++){
for (int txx=0;txx<20;txx++){
if (tmparea[txx][tyy]=='k'){
kosilkax=tyy;
kosilkay=txx;
}
 
gamearea[txx][tyy]=tmparea[tyy][txx];
}
}
}
 
if (levnum==5){
static char tmparea[20][20]={{'t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t'},
{'t','s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','t'},
{'t','t','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','t'},
{'t','s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','t'},
{'t','s','g','g','g','g','g','t','g','g','t','g','g','g','g','g','g','g','g','t'},
{'t','t','g','g','g','g','t','n','t','t','t','g','g','g','g','g','g','g','g','t'},
{'t','s','g','g','g','g','t','n','n','n','t','g','g','g','g','g','g','g','g','t'},
{'t','k','g','g','g','g','t','n','n','n','t','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','t','n','n','n','t','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','t','n','n','t','g','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','t','n','n','t','g','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','t','n','n','n','t','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','t','n','n','n','t','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','t','n','t','t','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','t','t','g','g','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','t'},
{'t','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','t'},
{'t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t','t'}};
for (int tyy=0;tyy<20;tyy++){
for (int txx=0;txx<20;txx++){
if (tmparea[txx][tyy]=='k'){
kosilkax=tyy;
kosilkay=txx;
}
 
gamearea[txx][tyy]=tmparea[tyy][txx];
}
}
}
 
if (levnum==6){
static char tmparea[20][20]={{'s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s'},
{'s','k','t','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s'},
{'s','g','g','s','s','s','s','s','s','s','s','s','s','s','s','s','s','g','g','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','t','t','s','g','g','s'},
{'s','g','g','s','g','g','g','g','g','g','g','g','g','g','t','t','s','g','g','s'},
{'s','g','g','s','g','g','g','g','g','g','g','g','g','g','t','t','s','g','g','s'},
{'s','g','g','s','g','g','g','g','g','t','t','g','g','g','g','g','s','g','g','s'},
{'s','g','g','s','g','g','g','g','g','t','t','t','g','g','g','g','s','g','g','s'},
{'s','g','g','s','g','g','g','t','t','t','t','t','t','g','g','g','s','g','g','s'},
{'s','g','g','s','g','g','g','t','t','t','t','t','t','g','g','g','s','g','g','s'},
{'s','g','g','s','g','g','g','g','g','t','t','g','g','g','g','g','s','g','g','s'},
{'s','g','g','s','g','g','g','g','g','t','t','g','g','g','g','g','s','g','g','s'},
{'s','g','g','s','g','g','g','g','g','g','g','g','g','g','g','g','s','g','g','s'},
{'s','g','g','s','g','g','g','g','g','g','g','g','g','g','g','g','s','g','g','s'},
{'s','g','g','s','g','g','g','g','g','g','g','g','g','g','g','g','s','g','g','s'},
{'s','g','g','s','s','s','s','s','s','s','s','s','s','s','s','s','s','g','g','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s'},
{'s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s'}};
for (int tyy=0;tyy<20;tyy++){
for (int txx=0;txx<20;txx++){
if (tmparea[txx][tyy]=='k'){
kosilkax=tyy;
kosilkay=txx;
}
 
gamearea[txx][tyy]=tmparea[tyy][txx];
}
}
}
 
 
if (levnum==7){
static char tmparea[20][20]={{'s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s','t','t','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s','t','t','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s','t','t','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s','t','t','s'},
{'s','g','g','g','g','g','t','t','t','t','t','t','g','g','g','g','s','t','t','s'},
{'s','g','g','g','g','g','t','k','g','g','g','t','g','g','g','g','s','t','t','s'},
{'s','g','g','g','g','g','t','g','g','g','g','t','g','g','g','g','s','t','t','s'},
{'s','g','g','g','g','g','t','g','g','g','g','t','g','g','g','g','s','t','t','s'},
{'s','g','g','g','g','g','t','g','g','g','g','t','g','g','g','g','s','s','s','s'},
{'s','g','g','g','g','g','t','g','g','g','g','t','g','g','g','g','g','g','g','s'},
{'s','g','g','g','g','g','t','t','t','t','g','t','g','g','g','g','g','g','g','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s'},
{'s','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','g','s'},
{'s','g','g','g','g','g','g','g','g','t','g','g','t','g','g','g','g','g','g','s'},
{'s','g','g','g','g','g','g','g','g','t','g','g','t','g','g','g','g','g','g','s'},
{'s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s','s'}};
for (int tyy=0;tyy<20;tyy++){
for (int txx=0;txx<20;txx++){
if (tmparea[txx][tyy]=='k'){
kosilkax=tyy;
kosilkay=txx;
}
 
gamearea[txx][tyy]=tmparea[tyy][txx];
}
}
}
}
else
{
//ÂÍÅØÍÈÅ ÓÐÎÂÍÈ
kosilkadirection=1;
 
int currentrow=0;
int currentcol=0;
 
for (int tmpcntr=0;tmpcntr<400;tmpcntr++){
currentcol=(int)(tmpcntr/20);
currentrow=tmpcntr-(((int)(tmpcntr/20))*20);
switch(externallevels[tmpcntr+(400*(levnum-1))]){
 
case 0:
gamearea[currentrow][currentcol]='n';
break;
case 1:
gamearea[currentrow][currentcol]='g';
break;
case 2:
gamearea[currentrow][currentcol]='k';
kosilkax=currentrow;
kosilkay=currentcol;
break;
case 3:
gamearea[currentrow][currentcol]='s';
break;
case 4:
gamearea[currentrow][currentcol]='t';
break;
 
}
}
 
}
 
draw_window();
 
}
 
//Ïðåîâåðÿåì îñòàòîê òðàâû
int grassLeft(){
int leftgrass=0;
for (int chky=0;chky<20;chky++){
for (int chkx=0;chkx<20;chkx++){
if (gamearea[chkx][chky]=='g') {
leftgrass++;
}
}
}
return leftgrass;
}
 
 
//Ìåíÿåì óðîâåíü èëè âûâîäèì ñîîáùåíèå î òîì, ÷òî âñå óðîâíè ïðîéäåíû
void updateStatus(){
 
if (grassLeft()==0) {
if (level==levelcount){
gamestarted=false;
status=2;
draw_window();
} else {
gamestarted=false;
interlevelpause();
level++;
initializeLevel(level);
gamestarted=true;
}
}
}
 
 
 
 
void decode_skin(){
int currentbyte3x=0;
RGB tmpRGB;
int tmpcc1=0;
 
for (tmpcc1=0;tmpcc1<576;tmpcc1++){
 
tmpRGB.r= skindata[currentbyte3x];
tmpRGB.g= skindata[currentbyte3x+1];
tmpRGB.b= skindata[currentbyte3x+2];
kosilka_d[tmpcc1]=tmpRGB;
currentbyte3x+=3;
}
 
for (tmpcc1=0;tmpcc1<576;tmpcc1++){
 
tmpRGB.r= skindata[currentbyte3x];
tmpRGB.g= skindata[currentbyte3x+1];
tmpRGB.b= skindata[currentbyte3x+2];
kosilka_u[tmpcc1]=tmpRGB;
currentbyte3x+=3;
}
 
for (tmpcc1=0;tmpcc1<576;tmpcc1++){
 
tmpRGB.r= skindata[currentbyte3x];
tmpRGB.g= skindata[currentbyte3x+1];
tmpRGB.b= skindata[currentbyte3x+2];
kosilka_l[tmpcc1]=tmpRGB;
currentbyte3x+=3;
}
 
for (tmpcc1=0;tmpcc1<576;tmpcc1++){
 
tmpRGB.r= skindata[currentbyte3x];
tmpRGB.g= skindata[currentbyte3x+1];
tmpRGB.b= skindata[currentbyte3x+2];
kosilka_r[tmpcc1]=tmpRGB;
currentbyte3x+=3;
}
 
for (tmpcc1=0;tmpcc1<576;tmpcc1++){
 
tmpRGB.r= skindata[currentbyte3x];
tmpRGB.g= skindata[currentbyte3x+1];
tmpRGB.b= skindata[currentbyte3x+2];
skos[tmpcc1]=tmpRGB;
currentbyte3x+=3;
}
 
for (tmpcc1=0;tmpcc1<576;tmpcc1++){
 
tmpRGB.r= skindata[currentbyte3x];
tmpRGB.g= skindata[currentbyte3x+1];
tmpRGB.b= skindata[currentbyte3x+2];
grass[tmpcc1]=tmpRGB;
currentbyte3x+=3;
}
 
for (tmpcc1=0;tmpcc1<576;tmpcc1++){
 
tmpRGB.r= skindata[currentbyte3x];
tmpRGB.g= skindata[currentbyte3x+1];
tmpRGB.b= skindata[currentbyte3x+2];
stone[tmpcc1]=tmpRGB;
currentbyte3x+=3;
}
 
for (tmpcc1=0;tmpcc1<576;tmpcc1++){
 
tmpRGB.r= skindata[currentbyte3x];
tmpRGB.g= skindata[currentbyte3x+1];
tmpRGB.b= skindata[currentbyte3x+2];
tree[tmpcc1]=tmpRGB;
currentbyte3x+=3;
}
 
}
 
 
 
void load_external_levels(){
 
CKosFile lev(getLevelsPathName());
 
level_read_result=lev.Read (external_levels_count,1);
 
if (level_read_result == 1){
external_levels_available=true;
}
else
{
external_levels_available=false;
};
 
 
if (external_levels_count[0]==0){
external_levels_available=false;
}
else
{
externallevels = new Byte[400*external_levels_count[0]];
lev.Read (externallevels,400*external_levels_count[0]);
}
 
 
}
 
void app_halt(){
 
delete apppath;
delete levpath;
if (external_levels_available==true) {delete externallevels;}
kos_ExitApp();
 
}
 
void kos_Main(){
 
load_external_levels();
 
CKosFile skin(getSkinPathName());
read_result=skin.Read (skindata,13824);
if (read_result != 13824){
skin_available=false;
}
else
{
skin_available=true;
};
 
if (skin_available==false){
decode_graphics(kosilka_d1,kosilka_d);
decode_graphics(kosilka_u1,kosilka_u);
decode_graphics(kosilka_l1,kosilka_l);
decode_graphics(kosilka_r1,kosilka_r);
decode_graphics(skos1,skos);
decode_graphics(stone1,stone);
decode_graphics(tree1,tree);
decode_graphics(grass1,grass);
skinned=false;
}
else
{
decode_skin();
skinned=true;
}
 
draw_window();
 
for (;;){
 
switch (kos_WaitForEvent()){
case 1:
w_redraw=true;
draw_window();
break;
case 2:
Byte keyCode;
kos_GetKey(keyCode);
if (status==1){
if (gamestarted==true){
switch (keyCode){
case 177:
if (kosilkay<19){
if (gamearea[kosilkax][kosilkay+1]=='g'){
gamearea[kosilkax][kosilkay]='n';
gamearea[kosilkax][kosilkay+1]='k';
if (drawanimation==true) {animate(kosilkax,kosilkay,1);}
 
 
lastkosilkadirection=kosilkadirection;
laststep=1;
 
kosilkay++;
kosilkadirection=1;
draw_element(kosilkax,kosilkay);
draw_element(kosilkax,kosilkay-1);
display_grass_left();
updateStatus();
}
}
break;
case 178:
if (kosilkay>0){
if (gamearea[kosilkax][kosilkay-1]=='g'){
gamearea[kosilkax][kosilkay]='n';
gamearea[kosilkax][kosilkay-1]='k';
 
if (drawanimation==true) {animate(kosilkax,kosilkay,2);}
 
lastkosilkadirection=kosilkadirection;
laststep=2;
 
kosilkay--;
kosilkadirection=2;
draw_element(kosilkax,kosilkay);
draw_element(kosilkax,kosilkay+1);
display_grass_left();
updateStatus();
}
}
break;
case 179:
if (kosilkax<19){
if (gamearea[kosilkax+1][kosilkay]=='g'){
gamearea[kosilkax][kosilkay]='n';
gamearea[kosilkax+1][kosilkay]='k';
 
if (drawanimation==true) {animate(kosilkax,kosilkay,3);}
 
 
lastkosilkadirection=kosilkadirection;
laststep=3;
 
kosilkax++;
kosilkadirection=4;
 
draw_element(kosilkax,kosilkay);
draw_element(kosilkax-1,kosilkay);
display_grass_left();
updateStatus();
}
}
break;
case 176:
if (kosilkax>0){
if (gamearea[kosilkax-1][kosilkay]=='g'){
gamearea[kosilkax][kosilkay]='n';
gamearea[kosilkax-1][kosilkay]='k';
 
if (drawanimation==true) {animate(kosilkax,kosilkay,4);}
 
lastkosilkadirection=kosilkadirection;
laststep=4;
 
kosilkax--;
kosilkadirection=3;
 
draw_element(kosilkax,kosilkay);
draw_element(kosilkax+1,kosilkay);
display_grass_left();
updateStatus();
}
}
break;
 
case 27:
if (lives>0){
lives--;
initializeLevel(level);
 
} else {
gamestarted=false;
status=3;
draw_window();
}
break;
 
case 8:
if (laststep!=0){
kosilkadirection=lastkosilkadirection;
if (laststep==1){
gamearea[kosilkax][kosilkay]='g';
gamearea[kosilkax][kosilkay-1]='k';
draw_element(kosilkax,kosilkay);
draw_element(kosilkax,kosilkay-1);
kosilkay--;
}
if (laststep==2){
gamearea[kosilkax][kosilkay]='g';
gamearea[kosilkax][kosilkay+1]='k';
draw_element(kosilkax,kosilkay);
draw_element(kosilkax,kosilkay+1);
kosilkay++;
}
 
if (laststep==3){
gamearea[kosilkax][kosilkay]='g';
gamearea[kosilkax-1][kosilkay]='k';
draw_element(kosilkax,kosilkay);
draw_element(kosilkax-1,kosilkay);
kosilkax--;
}
 
if (laststep==4){
gamearea[kosilkax][kosilkay]='g';
gamearea[kosilkax+1][kosilkay]='k';
draw_element(kosilkax,kosilkay);
draw_element(kosilkax+1,kosilkay);
kosilkax++;
}
 
 
laststep=0;
}
break;
}
 
}
}
if (status==0){
if (keyCode==13){ //enter
if (external_levels_available==true){
status=4;
draw_window();
}
else
{
status=1;
initializeLevel(1);
gamestarted=true;
}
}
 
if (keyCode==103){
if (drawgraphics==true){
drawgraphics=false;
} else {
drawgraphics=true;
}
if (drawgraphics==true){
kos_PutImage((RGB*)kosilka_d,24,24,305,150);
}
else
{
kos_DrawBar(305,150,24,24,0x00AAAA);
}
}
if (keyCode==97){
if (drawanimation==true){
drawanimation=false;
} else {
drawanimation=true;
}
if (drawanimation==true){
kos_DrawBar(335,150,24,24,0x00AA00);
}
else
{
kos_DrawBar(335,150,24,24,0xAA0000);
}
}
if (keyCode==104){
status=-1;
draw_window();
}
 
if (keyCode==115){
if (skin_available==true){
if (skinned==true){
skinned=false;
decode_graphics(kosilka_d1,kosilka_d);
decode_graphics(kosilka_u1,kosilka_u);
decode_graphics(kosilka_l1,kosilka_l);
decode_graphics(kosilka_r1,kosilka_r);
decode_graphics(skos1,skos);
decode_graphics(stone1,stone);
decode_graphics(tree1,tree);
decode_graphics(grass1,grass);
} else {
skinned=true;
decode_skin();
}
 
draw_window();
 
}
 
}
if (keyCode==27){
app_halt();
}
}
 
if (status==4){
if (keyCode==49){ //1
external_levels=false;
status=1;
initializeLevel(1);
gamestarted=true;
}
if (keyCode==50){ //2
external_levels=true;
levelcount=external_levels_count[0];
status=1;
initializeLevel(1);
gamestarted=true;
}
}
 
if (status==2){
if (keyCode==113){
lives=2;
status=0;
level=1;
draw_window();
gamestarted=true;
}
}
if (status==3){
if (keyCode==113){
lives=2;
status=0;
level=1;
draw_window();
gamestarted=true;
 
}
if (keyCode==114){
lives=2;
status=1;
level=1;
initializeLevel(1);
gamestarted=true;
}
 
}
 
if (status==-1){
if (keyCode==8){
status=0;
draw_window();
}
}
 
//Âûâîäèì êîä íàæàòîé êëàâèøè. Ôè÷à âðåìåííàÿ
/* kos_DrawBar(20,250,150,10,0xEEEEEE);
kos_WriteTextToWindow(20,250,0x80, 0 ,"Button",0);
kos_DisplayNumberToWindow(keyCode,3,70,250,0x0000FF,nbDecimal,false); */
break;
case 3:
app_halt();
break;
}
}
}
 
// Êîíåö èñõîäíèêà ;-)
/programs/games/kosilka/mcsmemm.cpp
0,0 → 1,329
// 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 * AllocMemFromSystem( Dword reqSize )
{
Byte *result;
sProcessInfo pInfo;
//
if ( mmInitialized )
{
result = mmHeapTop;
}
else
{
//
kos_ProcessInfo( &pInfo );
//
result = (Byte *)(pInfo.processInfo.used_memory + 1);
//
mmInitialized = true;
}
//
if ( ! kos_ApplicationMemoryResize( ((Dword)result) + reqSize ) )
{
result = NULL;
}
//
mmHeapTop = result + reqSize;
//
return result;
}
 
 
//
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 *)AllocMemFromSystem( reqsize + sizeof(MemBlock) );
//
if( LastKnownGood != NULL )
{
LastKnownGood->Size = reqsize;
//òåïåðü âñòàâèì åãî â î÷åðåäü çàíÿòûõ
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;
}
}
 
// îòïóñòèì ìüþòåêñ
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/kosilka
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property