Merge pull request #36 from IngCenter/DarkCat09-patch-2
Add files via upload
This commit is contained in:
commit
66101ac18a
13 changed files with 9903 additions and 695 deletions
|
@ -33,6 +33,12 @@
|
||||||
<Add option="-fexceptions" />
|
<Add option="-fexceptions" />
|
||||||
</Compiler>
|
</Compiler>
|
||||||
<Unit filename="FallSimulation.cpp" />
|
<Unit filename="FallSimulation.cpp" />
|
||||||
|
<Unit filename="lib/Button.h" />
|
||||||
|
<Unit filename="lib/Consts.h" />
|
||||||
|
<Unit filename="lib/ElemFunctions.h" />
|
||||||
|
<Unit filename="lib/MapPart.h" />
|
||||||
|
<Unit filename="lib/ModesFunctions.h" />
|
||||||
|
<Unit filename="lib/TXLib.h" />
|
||||||
<Extensions>
|
<Extensions>
|
||||||
<code_completion />
|
<code_completion />
|
||||||
<envvars />
|
<envvars />
|
||||||
|
|
|
@ -1,682 +1,64 @@
|
||||||
#include <TXLib.h>
|
#include <TXLib.h>
|
||||||
#include <iostream>
|
#include "lib\\Consts.h"
|
||||||
#include <fstream>
|
#include "lib\\ElemFunctions.h"
|
||||||
|
#include "lib\\ModesFunctions.h"
|
||||||
using namespace std;
|
|
||||||
|
#include <iostream>
|
||||||
const COLORREF MY_LIGHTBLUE = RGB(75, 127, 196);
|
|
||||||
const COLORREF MY_BISQUE = RGB(255, 214, 89);
|
using namespace std;
|
||||||
|
|
||||||
const int BLOCK_SIZE = 120;
|
int main()
|
||||||
|
{
|
||||||
const int BLOCK_TYPE = 0;
|
txCreateWindow(1300, 600);
|
||||||
const int QUEST_TYPE = 1;
|
|
||||||
const int WATER_TYPE = 2;
|
block = txLoadImage("pictures\\block.bmp");
|
||||||
const int FIRE_TYPE = 3;
|
quest = txLoadImage("pictures\\question.bmp");
|
||||||
|
water = txLoadImage("pictures\\water.bmp");
|
||||||
const int MAP_LENGHT = 15;
|
fire = txLoadImage("pictures\\fire.bmp");
|
||||||
|
|
||||||
int middleX;
|
middleX = txGetExtentX() / 2;
|
||||||
int middleY;
|
middleY = txGetExtentY() / 2;
|
||||||
|
extentX = txGetExtentX();
|
||||||
int extentX;
|
extentY = txGetExtentY();
|
||||||
int extentY;
|
|
||||||
|
background(TX_WHITE);
|
||||||
int arrElem = 0;
|
txSleep(50);
|
||||||
|
|
||||||
bool lvlCreatingIsStarted = false;
|
txBegin();
|
||||||
bool gameIsStarted = false;
|
|
||||||
|
txSleep(1000);
|
||||||
struct Button {
|
|
||||||
RECT coords;
|
txSetColor(MY_LIGHTBLUE, 2);
|
||||||
const char* text;
|
txSetFillColor(TX_WHITE);
|
||||||
HDC picture;
|
txRectangle(0, 0, extentX, extentY);
|
||||||
};
|
|
||||||
|
txSetColor(MY_LIGHTBLUE, 2);
|
||||||
struct MapPart {
|
txSetFillColor(MY_LIGHTBLUE);
|
||||||
RECT coords;
|
txRectangle(0, 0, extentX, 50);
|
||||||
bool visible;
|
|
||||||
HDC picture;
|
txSetColor(TX_BLACK, 3);
|
||||||
int blocktype;
|
txSetFillColor(TX_WHITE);
|
||||||
};
|
txDrawText(0, 0, extentX, 50, "Êîíñòðóêòîð óðîâíåé èãðû FallSimulation");
|
||||||
|
|
||||||
MapPart gettedMapParts[MAP_LENGHT + 1];
|
drawMenu();
|
||||||
|
|
||||||
HDC block;
|
if (lvlCreatingIsStarted) {
|
||||||
HDC quest;
|
mainFunc();
|
||||||
HDC water;
|
}
|
||||||
HDC fire;
|
else if (gameIsStarted) {
|
||||||
|
playGame(gettedMapParts);
|
||||||
HDC light_stone;
|
}
|
||||||
HDC dark_stone;
|
|
||||||
HDC vdark_stone;
|
txEnd();
|
||||||
|
|
||||||
void background(COLORREF color);
|
txDeleteDC(block);
|
||||||
void drawMenu();
|
txDeleteDC(quest);
|
||||||
void drawButton(Button but);
|
txDeleteDC(water);
|
||||||
void loadingAnimation(int delay, int speed);
|
txDeleteDC(fire);
|
||||||
void mainFunc();
|
|
||||||
bool addingBlock(bool clicked, RECT blockBut, HDC pic,
|
txDeleteDC(light_stone);
|
||||||
int blocktype, int* arrElem, MapPart mapParts[]);
|
txDeleteDC(dark_stone);
|
||||||
|
txDeleteDC(vdark_stone);
|
||||||
int readFile(string file, MapPart gettedMapParts[]);
|
|
||||||
void playGame(MapPart gettedMapParts[]);
|
txDisableAutoPause();
|
||||||
void checkElem(MapPart mapParts[]);
|
}
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
txCreateWindow(1300, 600);
|
|
||||||
|
|
||||||
block = txLoadImage("pictures\\block.bmp");
|
|
||||||
quest = txLoadImage("pictures\\question.bmp");
|
|
||||||
water = txLoadImage("pictures\\water.bmp");
|
|
||||||
fire = txLoadImage("pictures\\fire.bmp");
|
|
||||||
|
|
||||||
middleX = txGetExtentX() / 2;
|
|
||||||
middleY = txGetExtentY() / 2;
|
|
||||||
extentX = txGetExtentX();
|
|
||||||
extentY = txGetExtentY();
|
|
||||||
|
|
||||||
background(TX_WHITE);
|
|
||||||
txSleep(50);
|
|
||||||
|
|
||||||
txBegin();
|
|
||||||
|
|
||||||
txSleep(1000);
|
|
||||||
|
|
||||||
txSetColor(MY_LIGHTBLUE, 2);
|
|
||||||
txSetFillColor(TX_WHITE);
|
|
||||||
txRectangle(0, 0, extentX, extentY);
|
|
||||||
|
|
||||||
txSetColor(MY_LIGHTBLUE, 2);
|
|
||||||
txSetFillColor(MY_LIGHTBLUE);
|
|
||||||
txRectangle(0, 0, extentX, 50);
|
|
||||||
|
|
||||||
txSetColor(TX_BLACK, 3);
|
|
||||||
txSetFillColor(TX_WHITE);
|
|
||||||
txDrawText(0, 0, extentX, 50, "Êîíñòðóêòîð óðîâíåé èãðû FallSimulation");
|
|
||||||
|
|
||||||
drawMenu();
|
|
||||||
|
|
||||||
if (lvlCreatingIsStarted) {
|
|
||||||
mainFunc();
|
|
||||||
}
|
|
||||||
else if (gameIsStarted) {
|
|
||||||
playGame(gettedMapParts);
|
|
||||||
}
|
|
||||||
|
|
||||||
txEnd();
|
|
||||||
|
|
||||||
txDeleteDC(block);
|
|
||||||
txDeleteDC(quest);
|
|
||||||
txDeleteDC(water);
|
|
||||||
txDeleteDC(fire);
|
|
||||||
|
|
||||||
txDeleteDC(light_stone);
|
|
||||||
txDeleteDC(dark_stone);
|
|
||||||
txDeleteDC(vdark_stone);
|
|
||||||
|
|
||||||
txDisableAutoPause();
|
|
||||||
}
|
|
||||||
|
|
||||||
void background(COLORREF color)
|
|
||||||
{
|
|
||||||
txSetFillColor(color);
|
|
||||||
txClear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawButton(Button but)
|
|
||||||
{
|
|
||||||
//drawing button
|
|
||||||
txRectangle(but.coords.left,
|
|
||||||
but.coords.top,
|
|
||||||
but.coords.right,
|
|
||||||
but.coords.bottom);
|
|
||||||
|
|
||||||
//drawing text
|
|
||||||
txDrawText (but.coords.left,
|
|
||||||
but.coords.top,
|
|
||||||
but.coords.right,
|
|
||||||
but.coords.bottom,
|
|
||||||
but.text,
|
|
||||||
DT_CENTER | DT_VCENTER);
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawMenu()
|
|
||||||
{
|
|
||||||
//button "Start" (to start level creating)
|
|
||||||
Button buttonStart = {
|
|
||||||
{
|
|
||||||
middleX - 100, extentY / 3 - 50,
|
|
||||||
middleX + 100, extentY / 3 + 50
|
|
||||||
}, "Start"
|
|
||||||
};
|
|
||||||
|
|
||||||
//button "Exit"
|
|
||||||
Button buttonExit = {
|
|
||||||
{
|
|
||||||
middleX - 100, extentY / 2 - 50,
|
|
||||||
middleX + 100, extentY / 2 + 50
|
|
||||||
}, "Exit"
|
|
||||||
};
|
|
||||||
|
|
||||||
//button "Help"
|
|
||||||
Button buttonHelp = {
|
|
||||||
{
|
|
||||||
extentX - 100, 0,
|
|
||||||
extentX , 50
|
|
||||||
}, "? Help"
|
|
||||||
};
|
|
||||||
|
|
||||||
//button "Play" (to play on created level)
|
|
||||||
Button buttonPlay = {
|
|
||||||
{
|
|
||||||
extentX - 100, extentY - 60,
|
|
||||||
extentX, extentY
|
|
||||||
}, "Play"
|
|
||||||
};
|
|
||||||
|
|
||||||
txSetColor(TX_BLACK, 3);
|
|
||||||
txSetFillColor(TX_WHITE);
|
|
||||||
|
|
||||||
drawButton(buttonStart);
|
|
||||||
drawButton(buttonExit);
|
|
||||||
drawButton(buttonPlay);
|
|
||||||
|
|
||||||
txSetColor(TX_BLACK, 3);
|
|
||||||
txSetFillColor(TX_TRANSPARENT);
|
|
||||||
|
|
||||||
drawButton(buttonHelp);
|
|
||||||
|
|
||||||
txSleep(50);
|
|
||||||
|
|
||||||
while (!GetAsyncKeyState('Q') && !GetAsyncKeyState(VK_ESCAPE)) {
|
|
||||||
if (!lvlCreatingIsStarted && !gameIsStarted) {
|
|
||||||
if (In(txMousePos(), buttonStart.coords) && txMouseButtons() & 1) {
|
|
||||||
while (txMouseButtons() & 1) {
|
|
||||||
txSleep(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
loadingAnimation(2, 7);
|
|
||||||
txSleep(50);
|
|
||||||
|
|
||||||
lvlCreatingIsStarted = true;
|
|
||||||
}
|
|
||||||
if (In(txMousePos(), buttonExit.coords) && txMouseButtons() & 1) {
|
|
||||||
while (txMouseButtons() & 1) {
|
|
||||||
txSleep(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (In(txMousePos(), buttonHelp.coords)) {
|
|
||||||
|
|
||||||
txSetColor(TX_BLACK);
|
|
||||||
txDrawText(buttonHelp.coords.left - 130,
|
|
||||||
buttonHelp.coords.bottom + 10,
|
|
||||||
txGetExtentX() - 10,
|
|
||||||
buttonHelp.coords.bottom + 100,
|
|
||||||
"This hyperlink will be\nopen in browser");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
txSetColor(TX_WHITE);
|
|
||||||
txSetFillColor(TX_WHITE);
|
|
||||||
txRectangle(buttonHelp.coords.left - 130,
|
|
||||||
buttonHelp.coords.bottom + 10,
|
|
||||||
txGetExtentX() - 10,
|
|
||||||
buttonHelp.coords.bottom + 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (In(txMousePos(), buttonHelp.coords) && txMouseButtons() & 1) {
|
|
||||||
while(txMouseButtons() & 1) {
|
|
||||||
txSleep(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
system("start help\\index.html");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (In(txMousePos(), buttonPlay.coords) && txMouseButtons() & 1) {
|
|
||||||
|
|
||||||
int arrElem = readFile("level1.fslvl", gettedMapParts);
|
|
||||||
|
|
||||||
gameIsStarted = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lvlCreatingIsStarted || gameIsStarted) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
txSleep(10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadingAnimation(int delay, int speed)
|
|
||||||
{
|
|
||||||
background(TX_WHITE);
|
|
||||||
|
|
||||||
for (int circle_radius = 0;
|
|
||||||
circle_radius * circle_radius < extentX * extentX + extentY * extentY;
|
|
||||||
circle_radius += speed) {
|
|
||||||
|
|
||||||
background(TX_WHITE);
|
|
||||||
|
|
||||||
txSetColor(TX_BLACK, 2);
|
|
||||||
txSetFillColor(TX_BLACK);
|
|
||||||
|
|
||||||
txCircle(0, 0, circle_radius);
|
|
||||||
|
|
||||||
txSleep(delay);
|
|
||||||
}
|
|
||||||
|
|
||||||
background(TX_WHITE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mainFunc()
|
|
||||||
{
|
|
||||||
int selectedPict = -1;
|
|
||||||
const int BLOCK_SIZE = 120;
|
|
||||||
|
|
||||||
RECT blockBut = {
|
|
||||||
extentX - BLOCK_SIZE, 0, extentX, BLOCK_SIZE
|
|
||||||
};
|
|
||||||
|
|
||||||
RECT questBut = {
|
|
||||||
extentX - BLOCK_SIZE, BLOCK_SIZE, extentX, 2 * BLOCK_SIZE
|
|
||||||
};
|
|
||||||
|
|
||||||
RECT waterBut = {
|
|
||||||
extentX - BLOCK_SIZE, 2 * BLOCK_SIZE, extentX, 3 * BLOCK_SIZE
|
|
||||||
};
|
|
||||||
|
|
||||||
RECT fireBut = {
|
|
||||||
extentX - BLOCK_SIZE, 3* BLOCK_SIZE, extentX, 4 * BLOCK_SIZE
|
|
||||||
};
|
|
||||||
|
|
||||||
RECT doneBut = {
|
|
||||||
extentX - 120, extentY - 120, extentX, extentY
|
|
||||||
};
|
|
||||||
|
|
||||||
MapPart mapParts[MAP_LENGHT + 1];
|
|
||||||
|
|
||||||
txSetColor(TX_BLACK, 3);
|
|
||||||
txSetFillColor(TX_WHITE);
|
|
||||||
Button completeButton = {doneBut, "\n\nSave\n\nFile"};
|
|
||||||
|
|
||||||
for (int elem = 0; elem < MAP_LENGHT; elem++) {
|
|
||||||
mapParts[elem].visible = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool clickedBlock = false;
|
|
||||||
bool clickedQuest = false;
|
|
||||||
bool clickedWater = false;
|
|
||||||
bool clickedFire = false;
|
|
||||||
|
|
||||||
while (!GetAsyncKeyState('Q') || !GetAsyncKeyState(VK_ESCAPE)) {
|
|
||||||
background(TX_WHITE);
|
|
||||||
|
|
||||||
Win32::TransparentBlt(txDC(), blockBut.left, blockBut.top, 120, 120, block,
|
|
||||||
0, 0, 60, 60, -1);
|
|
||||||
|
|
||||||
Win32::TransparentBlt(txDC(), questBut.left, questBut.top, 120, 120, quest,
|
|
||||||
0, 0, 60, 60, -1);
|
|
||||||
|
|
||||||
Win32::TransparentBlt(txDC(), waterBut.left, waterBut.top, 120, 120, water,
|
|
||||||
0, 0, 60, 60, -1);
|
|
||||||
|
|
||||||
Win32::TransparentBlt(txDC(), fireBut.left, fireBut.top, 120, 120, fire,
|
|
||||||
0, 0, 60, 60, -1);
|
|
||||||
|
|
||||||
drawButton(completeButton);
|
|
||||||
|
|
||||||
for (int elem = 0; elem < MAP_LENGHT; elem++) {
|
|
||||||
|
|
||||||
mapParts[elem].coords.left = round((mapParts[elem].coords.left + 30) / 60) * 60;
|
|
||||||
mapParts[elem].coords.top = round((mapParts[elem].coords.top + 30) / 60) * 60;
|
|
||||||
|
|
||||||
if (mapParts[elem].visible) {
|
|
||||||
|
|
||||||
txBitBlt(txDC(),
|
|
||||||
mapParts[elem].coords.left,
|
|
||||||
mapParts[elem].coords.top,
|
|
||||||
60, 60,
|
|
||||||
mapParts[elem].picture
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//blocks
|
|
||||||
clickedBlock = addingBlock(clickedBlock, blockBut, block, BLOCK_TYPE, &arrElem, mapParts);
|
|
||||||
clickedQuest = addingBlock(clickedQuest, questBut, quest, QUEST_TYPE, &arrElem, mapParts);
|
|
||||||
clickedWater = addingBlock(clickedWater, waterBut, water, WATER_TYPE, &arrElem, mapParts);
|
|
||||||
clickedFire = addingBlock(clickedFire, fireBut, fire, FIRE_TYPE, &arrElem, mapParts);
|
|
||||||
|
|
||||||
//checking
|
|
||||||
if (clickedBlock)
|
|
||||||
{
|
|
||||||
clickedQuest = false;
|
|
||||||
clickedWater = false;
|
|
||||||
clickedFire = false;
|
|
||||||
}
|
|
||||||
else if (clickedQuest)
|
|
||||||
{
|
|
||||||
clickedWater = false;
|
|
||||||
clickedFire = false;
|
|
||||||
}
|
|
||||||
else if (clickedWater)
|
|
||||||
{
|
|
||||||
clickedFire = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//selecting block
|
|
||||||
for (int i = 0; i < arrElem; i++) {
|
|
||||||
if (selectedPict < 0 &&
|
|
||||||
In(txMousePos(), mapParts[i].coords) && txMouseButtons() & 1 &&
|
|
||||||
!(clickedBlock || clickedQuest || clickedWater || clickedFire)) {
|
|
||||||
|
|
||||||
selectedPict = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//deleting picture
|
|
||||||
for (int i = 0; i < arrElem; i++) {
|
|
||||||
if (selectedPict < 0 &&
|
|
||||||
In(txMousePos(), mapParts[i].coords) && txMouseButtons() & 2 &&
|
|
||||||
!(clickedBlock || clickedQuest || clickedWater || clickedFire)) {
|
|
||||||
|
|
||||||
selectedPict = i;
|
|
||||||
mapParts[selectedPict] = mapParts[arrElem - 1];
|
|
||||||
mapParts[arrElem - 1].visible = false;
|
|
||||||
|
|
||||||
arrElem--;
|
|
||||||
selectedPict = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//moving picture
|
|
||||||
if (selectedPict >= 0 && txMouseButtons() & 1) {
|
|
||||||
|
|
||||||
txBitBlt(txDC(),
|
|
||||||
txMouseX() - 30, txMouseY() - 30,
|
|
||||||
60, 60, mapParts[selectedPict].picture);
|
|
||||||
}
|
|
||||||
if (selectedPict >= 0 && !(txMouseButtons() & 1)) {
|
|
||||||
|
|
||||||
RECT elRectCoords = {
|
|
||||||
(round((txMouseX() - 30) / 60) * 60),
|
|
||||||
(round((txMouseY() - 30) / 60) * 60),
|
|
||||||
(round((txMouseX() + 30) / 60) * 60),
|
|
||||||
(round((txMouseY() + 30) / 60) * 60)
|
|
||||||
};
|
|
||||||
|
|
||||||
mapParts[selectedPict].coords = elRectCoords;
|
|
||||||
checkElem(mapParts);
|
|
||||||
|
|
||||||
selectedPict = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//button to complete LevelCreating
|
|
||||||
if (In(txMousePos(), doneBut) && txMouseButtons() & 1) {
|
|
||||||
while (txMouseButtons() & 1) {
|
|
||||||
txSleep(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
ofstream lvlfile;
|
|
||||||
lvlfile.open("level1.fslvl");
|
|
||||||
for (int elem = 0; elem < arrElem; elem++) {
|
|
||||||
if (mapParts[elem].visible) {
|
|
||||||
switch(mapParts[elem].blocktype)
|
|
||||||
{
|
|
||||||
case BLOCK_TYPE:
|
|
||||||
lvlfile << "Block,";
|
|
||||||
break;
|
|
||||||
case QUEST_TYPE:
|
|
||||||
lvlfile << "Quest,";
|
|
||||||
break;
|
|
||||||
case WATER_TYPE:
|
|
||||||
lvlfile << "Water,";
|
|
||||||
break;
|
|
||||||
case FIRE_TYPE:
|
|
||||||
lvlfile << "Fire,";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
lvlfile << "Null,";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mapParts[elem].coords.left =
|
|
||||||
round((mapParts[elem].coords.left + 30) / 60) * 60;
|
|
||||||
|
|
||||||
mapParts[elem].coords.top =
|
|
||||||
round((mapParts[elem].coords.top + 30) / 60) * 60;
|
|
||||||
|
|
||||||
mapParts[elem].coords.right =
|
|
||||||
round((mapParts[elem].coords.right + 30) / 60) * 60;
|
|
||||||
|
|
||||||
mapParts[elem].coords.bottom =
|
|
||||||
round((mapParts[elem].coords.bottom + 30) / 60) * 60;
|
|
||||||
|
|
||||||
lvlfile << mapParts[elem].coords.left;
|
|
||||||
lvlfile << ",";
|
|
||||||
lvlfile << mapParts[elem].coords.top;
|
|
||||||
lvlfile << ",";
|
|
||||||
lvlfile << mapParts[elem].coords.right;
|
|
||||||
lvlfile << ",";
|
|
||||||
lvlfile << mapParts[elem].coords.bottom;
|
|
||||||
lvlfile << "\n";
|
|
||||||
|
|
||||||
lvlfile << "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
txMessageBox("Level File created!", "Information");
|
|
||||||
}
|
|
||||||
|
|
||||||
txSleep(10);
|
|
||||||
|
|
||||||
if (GetAsyncKeyState('Q') || GetAsyncKeyState(VK_ESCAPE)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool addingBlock(bool clicked, RECT blockBut, HDC pic,
|
|
||||||
int blocktype, int* arrElem, MapPart mapParts[])
|
|
||||||
{
|
|
||||||
if (In(txMousePos(), blockBut) && txMouseButtons() & 1) {
|
|
||||||
clicked = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (txMouseButtons() & 1 && clicked) {
|
|
||||||
txBitBlt(txDC(), txMouseX() - 30, txMouseY() - 30, 60, 60, pic);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(txMouseButtons() & 1) && clicked) {
|
|
||||||
|
|
||||||
if (*arrElem < MAP_LENGHT) {
|
|
||||||
|
|
||||||
RECT elRectCoords = {
|
|
||||||
|
|
||||||
(round((txMouseX() - 30) / 60) * 60),
|
|
||||||
(round((txMouseY() - 30) / 60) * 60),
|
|
||||||
(round((txMouseX() + 30) / 60) * 60),
|
|
||||||
(round((txMouseY() + 30) / 60) * 60)
|
|
||||||
};
|
|
||||||
|
|
||||||
if (txMouseX() < txGetExtentX() - BLOCK_SIZE)
|
|
||||||
{
|
|
||||||
|
|
||||||
mapParts[*arrElem] = {
|
|
||||||
elRectCoords, true, pic, blocktype
|
|
||||||
};
|
|
||||||
|
|
||||||
checkElem(mapParts);
|
|
||||||
|
|
||||||
(*arrElem)++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
char maplen_str[50];
|
|
||||||
|
|
||||||
sprintf(maplen_str, "You cannot add more than %d blocks", MAP_LENGHT);
|
|
||||||
txMessageBox(maplen_str, "Error");
|
|
||||||
|
|
||||||
(*arrElem)--;
|
|
||||||
}
|
|
||||||
|
|
||||||
clicked = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return clicked;
|
|
||||||
}
|
|
||||||
|
|
||||||
int readFile(string file, MapPart gettedMapParts[])
|
|
||||||
{
|
|
||||||
for (int i = 0; i < MAP_LENGHT; i++) {
|
|
||||||
|
|
||||||
gettedMapParts[i].visible = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int arrElem = 0;
|
|
||||||
|
|
||||||
ifstream lvlfile(file);
|
|
||||||
string buff;
|
|
||||||
|
|
||||||
while (lvlfile.good()) {
|
|
||||||
|
|
||||||
getline(lvlfile, buff);
|
|
||||||
|
|
||||||
if (buff.size() > 5) {
|
|
||||||
int posComma = buff.find(",");
|
|
||||||
int posComma2 = buff.find(",", posComma + 1);
|
|
||||||
int posComma3 = buff.find(",", posComma2 + 1);
|
|
||||||
int posComma4 = buff.find(",", posComma3 + 1);
|
|
||||||
|
|
||||||
string buff1 = buff.substr(0, posComma);
|
|
||||||
string buff2 = buff.substr(posComma + 1, posComma2 - posComma - 1);
|
|
||||||
string buff3 = buff.substr(posComma2 + 1, posComma3 - posComma2 - 1);
|
|
||||||
string buff4 = buff.substr(posComma3 + 1, posComma4 - posComma3 - 1);
|
|
||||||
string buff5 = buff.substr(posComma4 + 1, buff.size() - posComma4 - 1);
|
|
||||||
|
|
||||||
gettedMapParts[arrElem].coords = {
|
|
||||||
atoi(buff2.c_str()), atoi(buff3.c_str()),
|
|
||||||
atoi(buff4.c_str()), atoi(buff5.c_str())
|
|
||||||
};
|
|
||||||
|
|
||||||
gettedMapParts[arrElem].visible = true;
|
|
||||||
|
|
||||||
if (buff1 == "Block") {
|
|
||||||
gettedMapParts[arrElem].blocktype = BLOCK_TYPE;
|
|
||||||
gettedMapParts[arrElem].picture = block;
|
|
||||||
}
|
|
||||||
else if (buff1 == "Quest") {
|
|
||||||
gettedMapParts[arrElem].blocktype = QUEST_TYPE;
|
|
||||||
gettedMapParts[arrElem].picture = quest;
|
|
||||||
}
|
|
||||||
else if (buff1 == "Water") {
|
|
||||||
gettedMapParts[arrElem].blocktype = WATER_TYPE;
|
|
||||||
gettedMapParts[arrElem].picture = water;
|
|
||||||
}
|
|
||||||
else if (buff1 == "Fire") {
|
|
||||||
gettedMapParts[arrElem].blocktype = FIRE_TYPE;
|
|
||||||
gettedMapParts[arrElem].picture = fire;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
gettedMapParts[arrElem].blocktype = 0;
|
|
||||||
gettedMapParts[arrElem].visible = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
arrElem++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lvlfile.close();
|
|
||||||
|
|
||||||
return arrElem;
|
|
||||||
}
|
|
||||||
|
|
||||||
void playGame(MapPart gettedMapParts[])
|
|
||||||
{
|
|
||||||
int minX = gettedMapParts[0].coords.left;
|
|
||||||
int iMin = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < arrElem; i++) {
|
|
||||||
|
|
||||||
if (gettedMapParts[i].coords.left < minX)
|
|
||||||
{
|
|
||||||
minX = gettedMapParts[i].coords.left;
|
|
||||||
iMin = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int player_x = gettedMapParts[iMin].coords.left;
|
|
||||||
int player_y = gettedMapParts[iMin].coords.top;
|
|
||||||
|
|
||||||
while (!GetAsyncKeyState('Q') && !GetAsyncKeyState(VK_ESCAPE)) {
|
|
||||||
|
|
||||||
background(TX_WHITE);
|
|
||||||
|
|
||||||
txSetColor(TX_RED, 1);
|
|
||||||
txSetFillColor(TX_RED);
|
|
||||||
|
|
||||||
txRectangle(player_x,
|
|
||||||
player_y,
|
|
||||||
player_x + BLOCK_SIZE / 4,
|
|
||||||
player_y + BLOCK_SIZE / 4);
|
|
||||||
|
|
||||||
for (int i = 0; i < MAP_LENGHT; i++) {
|
|
||||||
|
|
||||||
if (gettedMapParts[i].visible) {
|
|
||||||
|
|
||||||
txBitBlt(txDC(),
|
|
||||||
gettedMapParts[i].coords.left,
|
|
||||||
gettedMapParts[i].coords.top,
|
|
||||||
60, 60,
|
|
||||||
gettedMapParts[i].picture
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetAsyncKeyState('W')) {
|
|
||||||
player_y += player_speed;
|
|
||||||
}
|
|
||||||
if (GetAsyncKeyState('A')) {
|
|
||||||
player_x -= player_speed;
|
|
||||||
}
|
|
||||||
if (GetAsyncKeyState('S')) {
|
|
||||||
player_y -= player_speed;
|
|
||||||
}
|
|
||||||
if (GetAsyncKeyState('D')) {
|
|
||||||
player_x += player_speed;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetAsyncKeyState(VK_OEM_PLUS)) {
|
|
||||||
player_speed++;
|
|
||||||
}
|
|
||||||
if (GetAsyncKeyState(VK_OEM_MINUS)) {
|
|
||||||
player_speed--;
|
|
||||||
}
|
|
||||||
|
|
||||||
txSleep(50);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void checkElem(MapPart mapParts[])
|
|
||||||
{
|
|
||||||
for (int elem = 0; elem < MAP_LENGHT; elem++) {
|
|
||||||
for (int elem2 = 0; elem2 < MAP_LENGHT; elem2++) {
|
|
||||||
|
|
||||||
if (elem2 != elem &&
|
|
||||||
mapParts[elem].coords.left == mapParts[elem2].coords.left &&
|
|
||||||
mapParts[elem].coords.top == mapParts[elem2].coords.top) {
|
|
||||||
|
|
||||||
mapParts[elem].coords.left = mapParts[elem].coords.left + 60;
|
|
||||||
mapParts[elem].coords.right = mapParts[elem].coords.right + 60;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
25
level1.fslvl
25
level1.fslvl
|
@ -1,13 +1,12 @@
|
||||||
Block,240,120,300,180
|
Block,120,420,180,480
|
||||||
Block,120,240,180,300
|
Block,300,360,360,420
|
||||||
Block,360,180,420,240
|
Quest,420,360,480,420
|
||||||
Block,420,180,480,240
|
Block,600,300,660,360
|
||||||
Quest,600,120,660,180
|
Block,720,360,780,420
|
||||||
Fire,600,180,660,240
|
Block,900,360,960,420
|
||||||
Water,300,300,360,360
|
Quest,1080,420,1140,480
|
||||||
Water,360,300,420,360
|
Fire,420,420,480,480
|
||||||
Water,420,300,480,360
|
Water,840,420,900,480
|
||||||
Block,780,240,840,300
|
Water,780,420,840,480
|
||||||
Block,960,300,1020,360
|
Fire,1020,480,1080,540
|
||||||
Block,900,240,960,300
|
Block,480,180,540,240
|
||||||
Quest,1080,360,1140,420
|
|
||||||
|
|
27
lib/Button.h
Normal file
27
lib/Button.h
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
struct Button {
|
||||||
|
RECT coords;
|
||||||
|
const char* text;
|
||||||
|
HDC picture;
|
||||||
|
};
|
||||||
|
|
||||||
|
void drawButton(Button but);
|
||||||
|
|
||||||
|
void drawButton(Button but)
|
||||||
|
{
|
||||||
|
//drawing button
|
||||||
|
txRectangle(but.coords.left,
|
||||||
|
but.coords.top,
|
||||||
|
but.coords.right,
|
||||||
|
but.coords.bottom);
|
||||||
|
|
||||||
|
//drawing text
|
||||||
|
txDrawText (but.coords.left,
|
||||||
|
but.coords.top,
|
||||||
|
but.coords.right,
|
||||||
|
but.coords.bottom,
|
||||||
|
but.text,
|
||||||
|
DT_CENTER | DT_VCENTER);
|
||||||
|
}
|
||||||
|
|
37
lib/Consts.h
Normal file
37
lib/Consts.h
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
//This library containing constants, global variables and structures
|
||||||
|
|
||||||
|
const COLORREF MY_LIGHTBLUE = RGB(75, 127, 196);
|
||||||
|
const COLORREF MY_BISQUE = RGB(255, 214, 89);
|
||||||
|
const COLORREF MY_RED = RGB(237, 28, 36);
|
||||||
|
|
||||||
|
const int BLOCK_SIZE = 120;
|
||||||
|
const int PLAYER_SIZE = BLOCK_SIZE / 5;
|
||||||
|
|
||||||
|
const int BLOCK_TYPE = 0;
|
||||||
|
const int QUEST_TYPE = 1;
|
||||||
|
const int WATER_TYPE = 2;
|
||||||
|
const int FIRE_TYPE = 3;
|
||||||
|
|
||||||
|
const int MAP_LENGHT = 15;
|
||||||
|
|
||||||
|
int middleX;
|
||||||
|
int middleY;
|
||||||
|
|
||||||
|
int extentX;
|
||||||
|
int extentY;
|
||||||
|
|
||||||
|
int arrElem = 0;
|
||||||
|
|
||||||
|
bool lvlCreatingIsStarted = false;
|
||||||
|
bool gameIsStarted = false;
|
||||||
|
|
||||||
|
HDC block;
|
||||||
|
HDC quest;
|
||||||
|
HDC water;
|
||||||
|
HDC fire;
|
||||||
|
|
||||||
|
HDC light_stone;
|
||||||
|
HDC dark_stone;
|
||||||
|
HDC vdark_stone;
|
57
lib/Consts.h.save
Normal file
57
lib/Consts.h.save
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
#include <TXLib.h>
|
||||||
|
#include "ElemFunctions.h"
|
||||||
|
#include "ModesFunctions.h"
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
//This library containing constants, global variables and structures
|
||||||
|
|
||||||
|
const COLORREF MY_LIGHTBLUE = RGB(75, 127, 196);
|
||||||
|
const COLORREF MY_BISQUE = RGB(255, 214, 89);
|
||||||
|
const COLORREF MY_RED = RGB(237, 28, 36);
|
||||||
|
|
||||||
|
const int BLOCK_SIZE = 120;
|
||||||
|
const int PLAYER_SIZE = BLOCK_SIZE / 5;
|
||||||
|
|
||||||
|
const int BLOCK_TYPE = 0;
|
||||||
|
const int QUEST_TYPE = 1;
|
||||||
|
const int WATER_TYPE = 2;
|
||||||
|
const int FIRE_TYPE = 3;
|
||||||
|
|
||||||
|
const int MAP_LENGHT = 15;
|
||||||
|
|
||||||
|
int middleX;
|
||||||
|
int middleY;
|
||||||
|
|
||||||
|
int extentX;
|
||||||
|
int extentY;
|
||||||
|
|
||||||
|
int arrElem = 0;
|
||||||
|
|
||||||
|
bool lvlCreatingIsStarted = false;
|
||||||
|
bool gameIsStarted = false;
|
||||||
|
|
||||||
|
struct Button {
|
||||||
|
RECT coords;
|
||||||
|
const char* text;
|
||||||
|
HDC picture;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MapPart {
|
||||||
|
RECT coords;
|
||||||
|
bool visible;
|
||||||
|
HDC picture;
|
||||||
|
int blocktype;
|
||||||
|
};
|
||||||
|
|
||||||
|
MapPart gettedMapParts[MAP_LENGHT + 1];
|
||||||
|
|
||||||
|
HDC block;
|
||||||
|
HDC quest;
|
||||||
|
HDC water;
|
||||||
|
HDC fire;
|
||||||
|
|
||||||
|
HDC light_stone;
|
||||||
|
HDC dark_stone;
|
||||||
|
HDC vdark_stone;
|
||||||
|
|
153
lib/ElemFunctions.h
Normal file
153
lib/ElemFunctions.h
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <TXLib.h>
|
||||||
|
#include "Consts.h"
|
||||||
|
#include "Button.h"
|
||||||
|
#include "MapPart.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
//This library containing functions for work with the elements
|
||||||
|
|
||||||
|
bool addingBlock(bool clicked, RECT blockBut, HDC pic,
|
||||||
|
int blocktype, int* arrElem, MapPart mapParts[]);
|
||||||
|
|
||||||
|
int readFile(string file, MapPart gettedMapParts[]);
|
||||||
|
void checkElem(MapPart mapParts[]);
|
||||||
|
|
||||||
|
bool addingBlock(bool clicked, RECT blockBut, HDC pic,
|
||||||
|
int blocktype, int* arrElem, MapPart mapParts[])
|
||||||
|
{
|
||||||
|
if (In(txMousePos(), blockBut) && txMouseButtons() & 1) {
|
||||||
|
clicked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (txMouseButtons() & 1 && clicked) {
|
||||||
|
txBitBlt(txDC(), txMouseX() - 30, txMouseY() - 30, 60, 60, pic);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(txMouseButtons() & 1) && clicked) {
|
||||||
|
|
||||||
|
if (*arrElem < MAP_LENGHT) {
|
||||||
|
|
||||||
|
RECT elRectCoords = {
|
||||||
|
|
||||||
|
(round((txMouseX() - 30) / 60) * 60),
|
||||||
|
(round((txMouseY() - 30) / 60) * 60),
|
||||||
|
(round((txMouseX() + 30) / 60) * 60),
|
||||||
|
(round((txMouseY() + 30) / 60) * 60)
|
||||||
|
};
|
||||||
|
|
||||||
|
if (txMouseX() < txGetExtentX() - BLOCK_SIZE)
|
||||||
|
{
|
||||||
|
|
||||||
|
mapParts[*arrElem] = {
|
||||||
|
elRectCoords, true, pic, blocktype
|
||||||
|
};
|
||||||
|
|
||||||
|
checkElem(mapParts);
|
||||||
|
|
||||||
|
(*arrElem)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
char maplen_str[50];
|
||||||
|
|
||||||
|
sprintf(maplen_str, "You cannot add more than %d blocks", MAP_LENGHT);
|
||||||
|
txMessageBox(maplen_str, "Error");
|
||||||
|
|
||||||
|
(*arrElem)--;
|
||||||
|
}
|
||||||
|
|
||||||
|
clicked = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return clicked;
|
||||||
|
}
|
||||||
|
|
||||||
|
int readFile(string file, MapPart gettedMapParts[])
|
||||||
|
{
|
||||||
|
for (int i = 0; i < MAP_LENGHT; i++) {
|
||||||
|
|
||||||
|
gettedMapParts[i].visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int arrElem = 0;
|
||||||
|
|
||||||
|
ifstream lvlfile(file);
|
||||||
|
string buff;
|
||||||
|
|
||||||
|
while (lvlfile.good()) {
|
||||||
|
|
||||||
|
getline(lvlfile, buff);
|
||||||
|
|
||||||
|
if (buff.size() > 5) {
|
||||||
|
int posComma = buff.find(",");
|
||||||
|
int posComma2 = buff.find(",", posComma + 1);
|
||||||
|
int posComma3 = buff.find(",", posComma2 + 1);
|
||||||
|
int posComma4 = buff.find(",", posComma3 + 1);
|
||||||
|
|
||||||
|
string buff1 = buff.substr(0, posComma);
|
||||||
|
string buff2 = buff.substr(posComma + 1, posComma2 - posComma - 1);
|
||||||
|
string buff3 = buff.substr(posComma2 + 1, posComma3 - posComma2 - 1);
|
||||||
|
string buff4 = buff.substr(posComma3 + 1, posComma4 - posComma3 - 1);
|
||||||
|
string buff5 = buff.substr(posComma4 + 1, buff.size() - posComma4 - 1);
|
||||||
|
|
||||||
|
gettedMapParts[arrElem].coords = {
|
||||||
|
atoi(buff2.c_str()), atoi(buff3.c_str()),
|
||||||
|
atoi(buff4.c_str()), atoi(buff5.c_str())
|
||||||
|
};
|
||||||
|
|
||||||
|
gettedMapParts[arrElem].visible = true;
|
||||||
|
|
||||||
|
if (buff1 == "Block") {
|
||||||
|
gettedMapParts[arrElem].blocktype = BLOCK_TYPE;
|
||||||
|
gettedMapParts[arrElem].picture = block;
|
||||||
|
}
|
||||||
|
else if (buff1 == "Quest") {
|
||||||
|
gettedMapParts[arrElem].blocktype = QUEST_TYPE;
|
||||||
|
gettedMapParts[arrElem].picture = quest;
|
||||||
|
}
|
||||||
|
else if (buff1 == "Water") {
|
||||||
|
gettedMapParts[arrElem].blocktype = WATER_TYPE;
|
||||||
|
gettedMapParts[arrElem].picture = water;
|
||||||
|
}
|
||||||
|
else if (buff1 == "Fire") {
|
||||||
|
gettedMapParts[arrElem].blocktype = FIRE_TYPE;
|
||||||
|
gettedMapParts[arrElem].picture = fire;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gettedMapParts[arrElem].blocktype = 0;
|
||||||
|
gettedMapParts[arrElem].visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
arrElem++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lvlfile.close();
|
||||||
|
|
||||||
|
return arrElem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkElem(MapPart mapParts[])
|
||||||
|
{
|
||||||
|
for (int elem = 0; elem < MAP_LENGHT; elem++) {
|
||||||
|
for (int elem2 = 0; elem2 < MAP_LENGHT; elem2++) {
|
||||||
|
|
||||||
|
if (elem2 != elem &&
|
||||||
|
mapParts[elem].coords.left == mapParts[elem2].coords.left &&
|
||||||
|
mapParts[elem].coords.top == mapParts[elem2].coords.top) {
|
||||||
|
|
||||||
|
mapParts[elem].coords.left = mapParts[elem].coords.left + 60;
|
||||||
|
mapParts[elem].coords.right = mapParts[elem].coords.right + 60;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
167
lib/ElemFunctions.h.save
Normal file
167
lib/ElemFunctions.h.save
Normal file
|
@ -0,0 +1,167 @@
|
||||||
|
#include "TXLib.h"
|
||||||
|
#include "Consts.h"
|
||||||
|
#include "ModesFunctions.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
//This library containing functions for work with the elements
|
||||||
|
|
||||||
|
void drawButton(Button but);
|
||||||
|
bool addingBlock(bool clicked, RECT blockBut, HDC pic,
|
||||||
|
int blocktype, int* arrElem, MapPart mapParts[]);
|
||||||
|
|
||||||
|
int readFile(string file, MapPart gettedMapParts[]);
|
||||||
|
void checkElem(MapPart mapParts[]);
|
||||||
|
|
||||||
|
void drawButton(Button but)
|
||||||
|
{
|
||||||
|
//drawing button
|
||||||
|
txRectangle(but.coords.left,
|
||||||
|
but.coords.top,
|
||||||
|
but.coords.right,
|
||||||
|
but.coords.bottom);
|
||||||
|
|
||||||
|
//drawing text
|
||||||
|
txDrawText (but.coords.left,
|
||||||
|
but.coords.top,
|
||||||
|
but.coords.right,
|
||||||
|
but.coords.bottom,
|
||||||
|
but.text,
|
||||||
|
DT_CENTER | DT_VCENTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool addingBlock(bool clicked, RECT blockBut, HDC pic,
|
||||||
|
int blocktype, int* arrElem, MapPart mapParts[])
|
||||||
|
{
|
||||||
|
if (In(txMousePos(), blockBut) && txMouseButtons() & 1) {
|
||||||
|
clicked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (txMouseButtons() & 1 && clicked) {
|
||||||
|
txBitBlt(txDC(), txMouseX() - 30, txMouseY() - 30, 60, 60, pic);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(txMouseButtons() & 1) && clicked) {
|
||||||
|
|
||||||
|
if (*arrElem < MAP_LENGHT) {
|
||||||
|
|
||||||
|
RECT elRectCoords = {
|
||||||
|
|
||||||
|
(round((txMouseX() - 30) / 60) * 60),
|
||||||
|
(round((txMouseY() - 30) / 60) * 60),
|
||||||
|
(round((txMouseX() + 30) / 60) * 60),
|
||||||
|
(round((txMouseY() + 30) / 60) * 60)
|
||||||
|
};
|
||||||
|
|
||||||
|
if (txMouseX() < txGetExtentX() - BLOCK_SIZE)
|
||||||
|
{
|
||||||
|
|
||||||
|
mapParts[*arrElem] = {
|
||||||
|
elRectCoords, true, pic, blocktype
|
||||||
|
};
|
||||||
|
|
||||||
|
checkElem(mapParts);
|
||||||
|
|
||||||
|
(*arrElem)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
char maplen_str[50];
|
||||||
|
|
||||||
|
sprintf(maplen_str, "You cannot add more than %d blocks", MAP_LENGHT);
|
||||||
|
txMessageBox(maplen_str, "Error");
|
||||||
|
|
||||||
|
(*arrElem)--;
|
||||||
|
}
|
||||||
|
|
||||||
|
clicked = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return clicked;
|
||||||
|
}
|
||||||
|
|
||||||
|
int readFile(string file, MapPart gettedMapParts[])
|
||||||
|
{
|
||||||
|
for (int i = 0; i < MAP_LENGHT; i++) {
|
||||||
|
|
||||||
|
gettedMapParts[i].visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int arrElem = 0;
|
||||||
|
|
||||||
|
ifstream lvlfile(file);
|
||||||
|
string buff;
|
||||||
|
|
||||||
|
while (lvlfile.good()) {
|
||||||
|
|
||||||
|
getline(lvlfile, buff);
|
||||||
|
|
||||||
|
if (buff.size() > 5) {
|
||||||
|
int posComma = buff.find(",");
|
||||||
|
int posComma2 = buff.find(",", posComma + 1);
|
||||||
|
int posComma3 = buff.find(",", posComma2 + 1);
|
||||||
|
int posComma4 = buff.find(",", posComma3 + 1);
|
||||||
|
|
||||||
|
string buff1 = buff.substr(0, posComma);
|
||||||
|
string buff2 = buff.substr(posComma + 1, posComma2 - posComma - 1);
|
||||||
|
string buff3 = buff.substr(posComma2 + 1, posComma3 - posComma2 - 1);
|
||||||
|
string buff4 = buff.substr(posComma3 + 1, posComma4 - posComma3 - 1);
|
||||||
|
string buff5 = buff.substr(posComma4 + 1, buff.size() - posComma4 - 1);
|
||||||
|
|
||||||
|
gettedMapParts[arrElem].coords = {
|
||||||
|
atoi(buff2.c_str()), atoi(buff3.c_str()),
|
||||||
|
atoi(buff4.c_str()), atoi(buff5.c_str())
|
||||||
|
};
|
||||||
|
|
||||||
|
gettedMapParts[arrElem].visible = true;
|
||||||
|
|
||||||
|
if (buff1 == "Block") {
|
||||||
|
gettedMapParts[arrElem].blocktype = BLOCK_TYPE;
|
||||||
|
gettedMapParts[arrElem].picture = block;
|
||||||
|
}
|
||||||
|
else if (buff1 == "Quest") {
|
||||||
|
gettedMapParts[arrElem].blocktype = QUEST_TYPE;
|
||||||
|
gettedMapParts[arrElem].picture = quest;
|
||||||
|
}
|
||||||
|
else if (buff1 == "Water") {
|
||||||
|
gettedMapParts[arrElem].blocktype = WATER_TYPE;
|
||||||
|
gettedMapParts[arrElem].picture = water;
|
||||||
|
}
|
||||||
|
else if (buff1 == "Fire") {
|
||||||
|
gettedMapParts[arrElem].blocktype = FIRE_TYPE;
|
||||||
|
gettedMapParts[arrElem].picture = fire;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gettedMapParts[arrElem].blocktype = 0;
|
||||||
|
gettedMapParts[arrElem].visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
arrElem++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lvlfile.close();
|
||||||
|
|
||||||
|
return arrElem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkElem(MapPart mapParts[])
|
||||||
|
{
|
||||||
|
for (int elem = 0; elem < MAP_LENGHT; elem++) {
|
||||||
|
for (int elem2 = 0; elem2 < MAP_LENGHT; elem2++) {
|
||||||
|
|
||||||
|
if (elem2 != elem &&
|
||||||
|
mapParts[elem].coords.left == mapParts[elem2].coords.left &&
|
||||||
|
mapParts[elem].coords.top == mapParts[elem2].coords.top) {
|
||||||
|
|
||||||
|
mapParts[elem].coords.left = mapParts[elem].coords.left + 60;
|
||||||
|
mapParts[elem].coords.right = mapParts[elem].coords.right + 60;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
10
lib/MapPart.h
Normal file
10
lib/MapPart.h
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
struct MapPart {
|
||||||
|
RECT coords;
|
||||||
|
bool visible;
|
||||||
|
HDC picture;
|
||||||
|
int blocktype;
|
||||||
|
};
|
||||||
|
|
||||||
|
MapPart gettedMapParts[MAP_LENGHT + 1];
|
434
lib/ModesFunctions.h
Normal file
434
lib/ModesFunctions.h
Normal file
|
@ -0,0 +1,434 @@
|
||||||
|
#include <TXLib.h>
|
||||||
|
#include "Consts.h"
|
||||||
|
#include "Button.h"
|
||||||
|
#include "MapPart.h"
|
||||||
|
#include "ElemFunctions.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
//This library containing game mode functions
|
||||||
|
|
||||||
|
void drawMenu();
|
||||||
|
void background(COLORREF color);
|
||||||
|
void loadingAnimation(int delay, int speed);
|
||||||
|
void mainFunc();
|
||||||
|
void playGame(MapPart gettedMapParts[]);
|
||||||
|
|
||||||
|
void drawMenu()
|
||||||
|
{
|
||||||
|
//button "Start" (to start level creating)
|
||||||
|
Button buttonStart = {
|
||||||
|
{
|
||||||
|
middleX - 100, extentY / 3 - 50,
|
||||||
|
middleX + 100, extentY / 3 + 50
|
||||||
|
}, "Start"
|
||||||
|
};
|
||||||
|
|
||||||
|
//button "Exit"
|
||||||
|
Button buttonExit = {
|
||||||
|
{
|
||||||
|
middleX - 100, extentY / 2 - 50,
|
||||||
|
middleX + 100, extentY / 2 + 50
|
||||||
|
}, "Exit"
|
||||||
|
};
|
||||||
|
|
||||||
|
//button "Help"
|
||||||
|
Button buttonHelp = {
|
||||||
|
{
|
||||||
|
extentX - 100, 0,
|
||||||
|
extentX , 50
|
||||||
|
}, "? Help"
|
||||||
|
};
|
||||||
|
|
||||||
|
//button "Play" (to play on created level)
|
||||||
|
Button buttonPlay = {
|
||||||
|
{
|
||||||
|
extentX - 100, extentY - 60,
|
||||||
|
extentX, extentY
|
||||||
|
}, "Play"
|
||||||
|
};
|
||||||
|
|
||||||
|
txSetColor(TX_BLACK, 3);
|
||||||
|
txSetFillColor(TX_WHITE);
|
||||||
|
|
||||||
|
drawButton(buttonStart);
|
||||||
|
drawButton(buttonExit);
|
||||||
|
drawButton(buttonPlay);
|
||||||
|
|
||||||
|
txSetColor(TX_BLACK, 3);
|
||||||
|
txSetFillColor(TX_TRANSPARENT);
|
||||||
|
|
||||||
|
drawButton(buttonHelp);
|
||||||
|
|
||||||
|
txSleep(50);
|
||||||
|
|
||||||
|
while (!GetAsyncKeyState('Q') && !GetAsyncKeyState(VK_ESCAPE)) {
|
||||||
|
if (!lvlCreatingIsStarted && !gameIsStarted) {
|
||||||
|
if (In(txMousePos(), buttonStart.coords) && txMouseButtons() & 1) {
|
||||||
|
while (txMouseButtons() & 1) {
|
||||||
|
txSleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadingAnimation(2, 7);
|
||||||
|
txSleep(50);
|
||||||
|
|
||||||
|
lvlCreatingIsStarted = true;
|
||||||
|
}
|
||||||
|
if (In(txMousePos(), buttonExit.coords) && txMouseButtons() & 1) {
|
||||||
|
while (txMouseButtons() & 1) {
|
||||||
|
txSleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (In(txMousePos(), buttonHelp.coords)) {
|
||||||
|
|
||||||
|
txSetColor(TX_BLACK);
|
||||||
|
txDrawText(buttonHelp.coords.left - 130,
|
||||||
|
buttonHelp.coords.bottom + 10,
|
||||||
|
txGetExtentX() - 10,
|
||||||
|
buttonHelp.coords.bottom + 100,
|
||||||
|
"This hyperlink will be\nopen in browser");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
txSetColor(TX_WHITE);
|
||||||
|
txSetFillColor(TX_WHITE);
|
||||||
|
txRectangle(buttonHelp.coords.left - 130,
|
||||||
|
buttonHelp.coords.bottom + 10,
|
||||||
|
txGetExtentX() - 10,
|
||||||
|
buttonHelp.coords.bottom + 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (In(txMousePos(), buttonHelp.coords) && txMouseButtons() & 1) {
|
||||||
|
while(txMouseButtons() & 1) {
|
||||||
|
txSleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
system("start help\\index.html");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (In(txMousePos(), buttonPlay.coords) && txMouseButtons() & 1) {
|
||||||
|
|
||||||
|
int arrElem = readFile("level1.fslvl", gettedMapParts);
|
||||||
|
|
||||||
|
gameIsStarted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lvlCreatingIsStarted || gameIsStarted) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
txSleep(10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void background(COLORREF color)
|
||||||
|
{
|
||||||
|
txSetFillColor(color);
|
||||||
|
txClear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loadingAnimation(int delay, int speed)
|
||||||
|
{
|
||||||
|
background(TX_WHITE);
|
||||||
|
|
||||||
|
for (int circle_radius = 0;
|
||||||
|
circle_radius * circle_radius < extentX * extentX + extentY * extentY;
|
||||||
|
circle_radius += speed) {
|
||||||
|
|
||||||
|
background(TX_WHITE);
|
||||||
|
|
||||||
|
txSetColor(TX_BLACK, 2);
|
||||||
|
txSetFillColor(TX_BLACK);
|
||||||
|
|
||||||
|
txCircle(0, 0, circle_radius);
|
||||||
|
|
||||||
|
txSleep(delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
background(TX_WHITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mainFunc()
|
||||||
|
{
|
||||||
|
int selectedPict = -1;
|
||||||
|
const int BLOCK_SIZE = 120;
|
||||||
|
|
||||||
|
RECT blockBut = {
|
||||||
|
extentX - BLOCK_SIZE, 0, extentX, BLOCK_SIZE
|
||||||
|
};
|
||||||
|
|
||||||
|
RECT questBut = {
|
||||||
|
extentX - BLOCK_SIZE, BLOCK_SIZE, extentX, 2 * BLOCK_SIZE
|
||||||
|
};
|
||||||
|
|
||||||
|
RECT waterBut = {
|
||||||
|
extentX - BLOCK_SIZE, 2 * BLOCK_SIZE, extentX, 3 * BLOCK_SIZE
|
||||||
|
};
|
||||||
|
|
||||||
|
RECT fireBut = {
|
||||||
|
extentX - BLOCK_SIZE, 3* BLOCK_SIZE, extentX, 4 * BLOCK_SIZE
|
||||||
|
};
|
||||||
|
|
||||||
|
RECT doneBut = {
|
||||||
|
extentX - 120, extentY - 120, extentX, extentY
|
||||||
|
};
|
||||||
|
|
||||||
|
MapPart mapParts[MAP_LENGHT + 1];
|
||||||
|
|
||||||
|
txSetColor(TX_BLACK, 3);
|
||||||
|
txSetFillColor(TX_WHITE);
|
||||||
|
Button completeButton = {doneBut, "\n\nSave\n\nFile"};
|
||||||
|
|
||||||
|
for (int elem = 0; elem < MAP_LENGHT; elem++) {
|
||||||
|
mapParts[elem].visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool clickedBlock = false;
|
||||||
|
bool clickedQuest = false;
|
||||||
|
bool clickedWater = false;
|
||||||
|
bool clickedFire = false;
|
||||||
|
|
||||||
|
while (!GetAsyncKeyState('Q') || !GetAsyncKeyState(VK_ESCAPE)) {
|
||||||
|
background(TX_WHITE);
|
||||||
|
|
||||||
|
Win32::TransparentBlt(txDC(), blockBut.left, blockBut.top, 120, 120, block,
|
||||||
|
0, 0, 60, 60, -1);
|
||||||
|
|
||||||
|
Win32::TransparentBlt(txDC(), questBut.left, questBut.top, 120, 120, quest,
|
||||||
|
0, 0, 60, 60, -1);
|
||||||
|
|
||||||
|
Win32::TransparentBlt(txDC(), waterBut.left, waterBut.top, 120, 120, water,
|
||||||
|
0, 0, 60, 60, -1);
|
||||||
|
|
||||||
|
Win32::TransparentBlt(txDC(), fireBut.left, fireBut.top, 120, 120, fire,
|
||||||
|
0, 0, 60, 60, -1);
|
||||||
|
|
||||||
|
drawButton(completeButton);
|
||||||
|
|
||||||
|
for (int elem = 0; elem < MAP_LENGHT; elem++) {
|
||||||
|
|
||||||
|
mapParts[elem].coords.left = round((mapParts[elem].coords.left + 30) / 60) * 60;
|
||||||
|
mapParts[elem].coords.top = round((mapParts[elem].coords.top + 30) / 60) * 60;
|
||||||
|
|
||||||
|
if (mapParts[elem].visible) {
|
||||||
|
|
||||||
|
txBitBlt(txDC(),
|
||||||
|
mapParts[elem].coords.left,
|
||||||
|
mapParts[elem].coords.top,
|
||||||
|
60, 60,
|
||||||
|
mapParts[elem].picture
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//blocks
|
||||||
|
clickedBlock = addingBlock(clickedBlock, blockBut, block, BLOCK_TYPE, &arrElem, mapParts);
|
||||||
|
clickedQuest = addingBlock(clickedQuest, questBut, quest, QUEST_TYPE, &arrElem, mapParts);
|
||||||
|
clickedWater = addingBlock(clickedWater, waterBut, water, WATER_TYPE, &arrElem, mapParts);
|
||||||
|
clickedFire = addingBlock(clickedFire, fireBut, fire, FIRE_TYPE, &arrElem, mapParts);
|
||||||
|
|
||||||
|
//checking
|
||||||
|
if (clickedBlock)
|
||||||
|
{
|
||||||
|
clickedQuest = false;
|
||||||
|
clickedWater = false;
|
||||||
|
clickedFire = false;
|
||||||
|
}
|
||||||
|
else if (clickedQuest)
|
||||||
|
{
|
||||||
|
clickedWater = false;
|
||||||
|
clickedFire = false;
|
||||||
|
}
|
||||||
|
else if (clickedWater)
|
||||||
|
{
|
||||||
|
clickedFire = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//selecting block
|
||||||
|
for (int i = 0; i < arrElem; i++) {
|
||||||
|
if (selectedPict < 0 &&
|
||||||
|
In(txMousePos(), mapParts[i].coords) && txMouseButtons() & 1 &&
|
||||||
|
!(clickedBlock || clickedQuest || clickedWater || clickedFire)) {
|
||||||
|
|
||||||
|
selectedPict = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//deleting picture
|
||||||
|
for (int i = 0; i < arrElem; i++) {
|
||||||
|
if (selectedPict < 0 &&
|
||||||
|
In(txMousePos(), mapParts[i].coords) && txMouseButtons() & 2 &&
|
||||||
|
!(clickedBlock || clickedQuest || clickedWater || clickedFire)) {
|
||||||
|
|
||||||
|
selectedPict = i;
|
||||||
|
mapParts[selectedPict] = mapParts[arrElem - 1];
|
||||||
|
mapParts[arrElem - 1].visible = false;
|
||||||
|
|
||||||
|
arrElem--;
|
||||||
|
selectedPict = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//moving picture
|
||||||
|
if (selectedPict >= 0 && txMouseButtons() & 1) {
|
||||||
|
|
||||||
|
txBitBlt(txDC(),
|
||||||
|
txMouseX() - 30, txMouseY() - 30,
|
||||||
|
60, 60, mapParts[selectedPict].picture);
|
||||||
|
}
|
||||||
|
if (selectedPict >= 0 && !(txMouseButtons() & 1)) {
|
||||||
|
|
||||||
|
RECT elRectCoords = {
|
||||||
|
(round((txMouseX() - 30) / 60) * 60),
|
||||||
|
(round((txMouseY() - 30) / 60) * 60),
|
||||||
|
(round((txMouseX() + 30) / 60) * 60),
|
||||||
|
(round((txMouseY() + 30) / 60) * 60)
|
||||||
|
};
|
||||||
|
|
||||||
|
mapParts[selectedPict].coords = elRectCoords;
|
||||||
|
checkElem(mapParts);
|
||||||
|
|
||||||
|
selectedPict = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//button to complete LevelCreating
|
||||||
|
if (In(txMousePos(), doneBut) && txMouseButtons() & 1) {
|
||||||
|
while (txMouseButtons() & 1) {
|
||||||
|
txSleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
ofstream lvlfile;
|
||||||
|
lvlfile.open("level1.fslvl");
|
||||||
|
for (int elem = 0; elem < arrElem; elem++) {
|
||||||
|
if (mapParts[elem].visible) {
|
||||||
|
switch(mapParts[elem].blocktype)
|
||||||
|
{
|
||||||
|
case BLOCK_TYPE:
|
||||||
|
lvlfile << "Block,";
|
||||||
|
break;
|
||||||
|
case QUEST_TYPE:
|
||||||
|
lvlfile << "Quest,";
|
||||||
|
break;
|
||||||
|
case WATER_TYPE:
|
||||||
|
lvlfile << "Water,";
|
||||||
|
break;
|
||||||
|
case FIRE_TYPE:
|
||||||
|
lvlfile << "Fire,";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
lvlfile << "Null,";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mapParts[elem].coords.left =
|
||||||
|
round((mapParts[elem].coords.left + 30) / 60) * 60;
|
||||||
|
|
||||||
|
mapParts[elem].coords.top =
|
||||||
|
round((mapParts[elem].coords.top + 30) / 60) * 60;
|
||||||
|
|
||||||
|
mapParts[elem].coords.right =
|
||||||
|
round((mapParts[elem].coords.right + 30) / 60) * 60;
|
||||||
|
|
||||||
|
mapParts[elem].coords.bottom =
|
||||||
|
round((mapParts[elem].coords.bottom + 30) / 60) * 60;
|
||||||
|
|
||||||
|
lvlfile << mapParts[elem].coords.left;
|
||||||
|
lvlfile << ",";
|
||||||
|
lvlfile << mapParts[elem].coords.top;
|
||||||
|
lvlfile << ",";
|
||||||
|
lvlfile << mapParts[elem].coords.right;
|
||||||
|
lvlfile << ",";
|
||||||
|
lvlfile << mapParts[elem].coords.bottom;
|
||||||
|
lvlfile << "\n";
|
||||||
|
|
||||||
|
lvlfile << "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
txMessageBox("Level File created!", "Information");
|
||||||
|
}
|
||||||
|
|
||||||
|
txSleep(10);
|
||||||
|
|
||||||
|
if (GetAsyncKeyState('Q') || GetAsyncKeyState(VK_ESCAPE)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void playGame(MapPart gettedMapParts[])
|
||||||
|
{
|
||||||
|
int minX = gettedMapParts[0].coords.left;
|
||||||
|
int iMin = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < arrElem; i++) {
|
||||||
|
|
||||||
|
if (gettedMapParts[i].coords.left < minX)
|
||||||
|
{
|
||||||
|
minX = gettedMapParts[i].coords.left;
|
||||||
|
iMin = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int player_x = gettedMapParts[iMin].coords.left;
|
||||||
|
int player_y = gettedMapParts[iMin].coords.top - (PLAYER_SIZE + 5);
|
||||||
|
|
||||||
|
int player_speed = PLAYER_SIZE;
|
||||||
|
|
||||||
|
while (!GetAsyncKeyState('Q') && !GetAsyncKeyState(VK_ESCAPE)) {
|
||||||
|
|
||||||
|
background(TX_WHITE);
|
||||||
|
|
||||||
|
txSetColor(MY_RED, 3);
|
||||||
|
txSetFillColor(MY_RED);
|
||||||
|
|
||||||
|
txRectangle(player_x,
|
||||||
|
player_y,
|
||||||
|
player_x + PLAYER_SIZE,
|
||||||
|
player_y + PLAYER_SIZE);
|
||||||
|
|
||||||
|
for (int i = 0; i < MAP_LENGHT; i++) {
|
||||||
|
|
||||||
|
if (gettedMapParts[i].visible) {
|
||||||
|
|
||||||
|
txBitBlt(txDC(),
|
||||||
|
gettedMapParts[i].coords.left,
|
||||||
|
gettedMapParts[i].coords.top,
|
||||||
|
60, 60,
|
||||||
|
gettedMapParts[i].picture
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetAsyncKeyState('W') || GetAsyncKeyState(VK_UP)) {
|
||||||
|
player_y -= player_speed;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState('A') || GetAsyncKeyState(VK_LEFT)) {
|
||||||
|
player_x -= player_speed;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState('S') || GetAsyncKeyState(VK_DOWN)) {
|
||||||
|
player_y += player_speed;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState('D') || GetAsyncKeyState(VK_RIGHT)) {
|
||||||
|
player_x += player_speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetAsyncKeyState(VK_OEM_PLUS)) {
|
||||||
|
player_speed += BLOCK_SIZE / 10;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState(VK_OEM_MINUS)) {
|
||||||
|
player_speed -= BLOCK_SIZE / 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
txSleep(50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
424
lib/ModesFunctions.h.save
Normal file
424
lib/ModesFunctions.h.save
Normal file
|
@ -0,0 +1,424 @@
|
||||||
|
#include "TXLib.h"
|
||||||
|
#include "lib\\Consts.h"
|
||||||
|
#include "lib\\ElemFunctions.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
//This library containing game mode functions
|
||||||
|
|
||||||
|
void drawMenu();
|
||||||
|
void loadingAnimation(int delay, int speed);
|
||||||
|
void mainFunc();
|
||||||
|
void playGame(MapPart gettedMapParts[]);
|
||||||
|
|
||||||
|
void drawMenu()
|
||||||
|
{
|
||||||
|
//button "Start" (to start level creating)
|
||||||
|
Button buttonStart = {
|
||||||
|
{
|
||||||
|
middleX - 100, extentY / 3 - 50,
|
||||||
|
middleX + 100, extentY / 3 + 50
|
||||||
|
}, "Start"
|
||||||
|
};
|
||||||
|
|
||||||
|
//button "Exit"
|
||||||
|
Button buttonExit = {
|
||||||
|
{
|
||||||
|
middleX - 100, extentY / 2 - 50,
|
||||||
|
middleX + 100, extentY / 2 + 50
|
||||||
|
}, "Exit"
|
||||||
|
};
|
||||||
|
|
||||||
|
//button "Help"
|
||||||
|
Button buttonHelp = {
|
||||||
|
{
|
||||||
|
extentX - 100, 0,
|
||||||
|
extentX , 50
|
||||||
|
}, "? Help"
|
||||||
|
};
|
||||||
|
|
||||||
|
//button "Play" (to play on created level)
|
||||||
|
Button buttonPlay = {
|
||||||
|
{
|
||||||
|
extentX - 100, extentY - 60,
|
||||||
|
extentX, extentY
|
||||||
|
}, "Play"
|
||||||
|
};
|
||||||
|
|
||||||
|
txSetColor(TX_BLACK, 3);
|
||||||
|
txSetFillColor(TX_WHITE);
|
||||||
|
|
||||||
|
drawButton(buttonStart);
|
||||||
|
drawButton(buttonExit);
|
||||||
|
drawButton(buttonPlay);
|
||||||
|
|
||||||
|
txSetColor(TX_BLACK, 3);
|
||||||
|
txSetFillColor(TX_TRANSPARENT);
|
||||||
|
|
||||||
|
drawButton(buttonHelp);
|
||||||
|
|
||||||
|
txSleep(50);
|
||||||
|
|
||||||
|
while (!GetAsyncKeyState('Q') && !GetAsyncKeyState(VK_ESCAPE)) {
|
||||||
|
if (!lvlCreatingIsStarted && !gameIsStarted) {
|
||||||
|
if (In(txMousePos(), buttonStart.coords) && txMouseButtons() & 1) {
|
||||||
|
while (txMouseButtons() & 1) {
|
||||||
|
txSleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadingAnimation(2, 7);
|
||||||
|
txSleep(50);
|
||||||
|
|
||||||
|
lvlCreatingIsStarted = true;
|
||||||
|
}
|
||||||
|
if (In(txMousePos(), buttonExit.coords) && txMouseButtons() & 1) {
|
||||||
|
while (txMouseButtons() & 1) {
|
||||||
|
txSleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (In(txMousePos(), buttonHelp.coords)) {
|
||||||
|
|
||||||
|
txSetColor(TX_BLACK);
|
||||||
|
txDrawText(buttonHelp.coords.left - 130,
|
||||||
|
buttonHelp.coords.bottom + 10,
|
||||||
|
txGetExtentX() - 10,
|
||||||
|
buttonHelp.coords.bottom + 100,
|
||||||
|
"This hyperlink will be\nopen in browser");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
txSetColor(TX_WHITE);
|
||||||
|
txSetFillColor(TX_WHITE);
|
||||||
|
txRectangle(buttonHelp.coords.left - 130,
|
||||||
|
buttonHelp.coords.bottom + 10,
|
||||||
|
txGetExtentX() - 10,
|
||||||
|
buttonHelp.coords.bottom + 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (In(txMousePos(), buttonHelp.coords) && txMouseButtons() & 1) {
|
||||||
|
while(txMouseButtons() & 1) {
|
||||||
|
txSleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
system("start help\\index.html");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (In(txMousePos(), buttonPlay.coords) && txMouseButtons() & 1) {
|
||||||
|
|
||||||
|
int arrElem = readFile("level1.fslvl", gettedMapParts);
|
||||||
|
|
||||||
|
gameIsStarted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lvlCreatingIsStarted || gameIsStarted) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
txSleep(10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadingAnimation(int delay, int speed)
|
||||||
|
{
|
||||||
|
background(TX_WHITE);
|
||||||
|
|
||||||
|
for (int circle_radius = 0;
|
||||||
|
circle_radius * circle_radius < extentX * extentX + extentY * extentY;
|
||||||
|
circle_radius += speed) {
|
||||||
|
|
||||||
|
background(TX_WHITE);
|
||||||
|
|
||||||
|
txSetColor(TX_BLACK, 2);
|
||||||
|
txSetFillColor(TX_BLACK);
|
||||||
|
|
||||||
|
txCircle(0, 0, circle_radius);
|
||||||
|
|
||||||
|
txSleep(delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
background(TX_WHITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mainFunc()
|
||||||
|
{
|
||||||
|
int selectedPict = -1;
|
||||||
|
const int BLOCK_SIZE = 120;
|
||||||
|
|
||||||
|
RECT blockBut = {
|
||||||
|
extentX - BLOCK_SIZE, 0, extentX, BLOCK_SIZE
|
||||||
|
};
|
||||||
|
|
||||||
|
RECT questBut = {
|
||||||
|
extentX - BLOCK_SIZE, BLOCK_SIZE, extentX, 2 * BLOCK_SIZE
|
||||||
|
};
|
||||||
|
|
||||||
|
RECT waterBut = {
|
||||||
|
extentX - BLOCK_SIZE, 2 * BLOCK_SIZE, extentX, 3 * BLOCK_SIZE
|
||||||
|
};
|
||||||
|
|
||||||
|
RECT fireBut = {
|
||||||
|
extentX - BLOCK_SIZE, 3* BLOCK_SIZE, extentX, 4 * BLOCK_SIZE
|
||||||
|
};
|
||||||
|
|
||||||
|
RECT doneBut = {
|
||||||
|
extentX - 120, extentY - 120, extentX, extentY
|
||||||
|
};
|
||||||
|
|
||||||
|
MapPart mapParts[MAP_LENGHT + 1];
|
||||||
|
|
||||||
|
txSetColor(TX_BLACK, 3);
|
||||||
|
txSetFillColor(TX_WHITE);
|
||||||
|
Button completeButton = {doneBut, "\n\nSave\n\nFile"};
|
||||||
|
|
||||||
|
for (int elem = 0; elem < MAP_LENGHT; elem++) {
|
||||||
|
mapParts[elem].visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool clickedBlock = false;
|
||||||
|
bool clickedQuest = false;
|
||||||
|
bool clickedWater = false;
|
||||||
|
bool clickedFire = false;
|
||||||
|
|
||||||
|
while (!GetAsyncKeyState('Q') || !GetAsyncKeyState(VK_ESCAPE)) {
|
||||||
|
background(TX_WHITE);
|
||||||
|
|
||||||
|
Win32::TransparentBlt(txDC(), blockBut.left, blockBut.top, 120, 120, block,
|
||||||
|
0, 0, 60, 60, -1);
|
||||||
|
|
||||||
|
Win32::TransparentBlt(txDC(), questBut.left, questBut.top, 120, 120, quest,
|
||||||
|
0, 0, 60, 60, -1);
|
||||||
|
|
||||||
|
Win32::TransparentBlt(txDC(), waterBut.left, waterBut.top, 120, 120, water,
|
||||||
|
0, 0, 60, 60, -1);
|
||||||
|
|
||||||
|
Win32::TransparentBlt(txDC(), fireBut.left, fireBut.top, 120, 120, fire,
|
||||||
|
0, 0, 60, 60, -1);
|
||||||
|
|
||||||
|
drawButton(completeButton);
|
||||||
|
|
||||||
|
for (int elem = 0; elem < MAP_LENGHT; elem++) {
|
||||||
|
|
||||||
|
mapParts[elem].coords.left = round((mapParts[elem].coords.left + 30) / 60) * 60;
|
||||||
|
mapParts[elem].coords.top = round((mapParts[elem].coords.top + 30) / 60) * 60;
|
||||||
|
|
||||||
|
if (mapParts[elem].visible) {
|
||||||
|
|
||||||
|
txBitBlt(txDC(),
|
||||||
|
mapParts[elem].coords.left,
|
||||||
|
mapParts[elem].coords.top,
|
||||||
|
60, 60,
|
||||||
|
mapParts[elem].picture
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//blocks
|
||||||
|
clickedBlock = addingBlock(clickedBlock, blockBut, block, BLOCK_TYPE, &arrElem, mapParts);
|
||||||
|
clickedQuest = addingBlock(clickedQuest, questBut, quest, QUEST_TYPE, &arrElem, mapParts);
|
||||||
|
clickedWater = addingBlock(clickedWater, waterBut, water, WATER_TYPE, &arrElem, mapParts);
|
||||||
|
clickedFire = addingBlock(clickedFire, fireBut, fire, FIRE_TYPE, &arrElem, mapParts);
|
||||||
|
|
||||||
|
//checking
|
||||||
|
if (clickedBlock)
|
||||||
|
{
|
||||||
|
clickedQuest = false;
|
||||||
|
clickedWater = false;
|
||||||
|
clickedFire = false;
|
||||||
|
}
|
||||||
|
else if (clickedQuest)
|
||||||
|
{
|
||||||
|
clickedWater = false;
|
||||||
|
clickedFire = false;
|
||||||
|
}
|
||||||
|
else if (clickedWater)
|
||||||
|
{
|
||||||
|
clickedFire = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//selecting block
|
||||||
|
for (int i = 0; i < arrElem; i++) {
|
||||||
|
if (selectedPict < 0 &&
|
||||||
|
In(txMousePos(), mapParts[i].coords) && txMouseButtons() & 1 &&
|
||||||
|
!(clickedBlock || clickedQuest || clickedWater || clickedFire)) {
|
||||||
|
|
||||||
|
selectedPict = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//deleting picture
|
||||||
|
for (int i = 0; i < arrElem; i++) {
|
||||||
|
if (selectedPict < 0 &&
|
||||||
|
In(txMousePos(), mapParts[i].coords) && txMouseButtons() & 2 &&
|
||||||
|
!(clickedBlock || clickedQuest || clickedWater || clickedFire)) {
|
||||||
|
|
||||||
|
selectedPict = i;
|
||||||
|
mapParts[selectedPict] = mapParts[arrElem - 1];
|
||||||
|
mapParts[arrElem - 1].visible = false;
|
||||||
|
|
||||||
|
arrElem--;
|
||||||
|
selectedPict = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//moving picture
|
||||||
|
if (selectedPict >= 0 && txMouseButtons() & 1) {
|
||||||
|
|
||||||
|
txBitBlt(txDC(),
|
||||||
|
txMouseX() - 30, txMouseY() - 30,
|
||||||
|
60, 60, mapParts[selectedPict].picture);
|
||||||
|
}
|
||||||
|
if (selectedPict >= 0 && !(txMouseButtons() & 1)) {
|
||||||
|
|
||||||
|
RECT elRectCoords = {
|
||||||
|
(round((txMouseX() - 30) / 60) * 60),
|
||||||
|
(round((txMouseY() - 30) / 60) * 60),
|
||||||
|
(round((txMouseX() + 30) / 60) * 60),
|
||||||
|
(round((txMouseY() + 30) / 60) * 60)
|
||||||
|
};
|
||||||
|
|
||||||
|
mapParts[selectedPict].coords = elRectCoords;
|
||||||
|
checkElem(mapParts);
|
||||||
|
|
||||||
|
selectedPict = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//button to complete LevelCreating
|
||||||
|
if (In(txMousePos(), doneBut) && txMouseButtons() & 1) {
|
||||||
|
while (txMouseButtons() & 1) {
|
||||||
|
txSleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
ofstream lvlfile;
|
||||||
|
lvlfile.open("level1.fslvl");
|
||||||
|
for (int elem = 0; elem < arrElem; elem++) {
|
||||||
|
if (mapParts[elem].visible) {
|
||||||
|
switch(mapParts[elem].blocktype)
|
||||||
|
{
|
||||||
|
case BLOCK_TYPE:
|
||||||
|
lvlfile << "Block,";
|
||||||
|
break;
|
||||||
|
case QUEST_TYPE:
|
||||||
|
lvlfile << "Quest,";
|
||||||
|
break;
|
||||||
|
case WATER_TYPE:
|
||||||
|
lvlfile << "Water,";
|
||||||
|
break;
|
||||||
|
case FIRE_TYPE:
|
||||||
|
lvlfile << "Fire,";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
lvlfile << "Null,";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mapParts[elem].coords.left =
|
||||||
|
round((mapParts[elem].coords.left + 30) / 60) * 60;
|
||||||
|
|
||||||
|
mapParts[elem].coords.top =
|
||||||
|
round((mapParts[elem].coords.top + 30) / 60) * 60;
|
||||||
|
|
||||||
|
mapParts[elem].coords.right =
|
||||||
|
round((mapParts[elem].coords.right + 30) / 60) * 60;
|
||||||
|
|
||||||
|
mapParts[elem].coords.bottom =
|
||||||
|
round((mapParts[elem].coords.bottom + 30) / 60) * 60;
|
||||||
|
|
||||||
|
lvlfile << mapParts[elem].coords.left;
|
||||||
|
lvlfile << ",";
|
||||||
|
lvlfile << mapParts[elem].coords.top;
|
||||||
|
lvlfile << ",";
|
||||||
|
lvlfile << mapParts[elem].coords.right;
|
||||||
|
lvlfile << ",";
|
||||||
|
lvlfile << mapParts[elem].coords.bottom;
|
||||||
|
lvlfile << "\n";
|
||||||
|
|
||||||
|
lvlfile << "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
txMessageBox("Level File created!", "Information");
|
||||||
|
}
|
||||||
|
|
||||||
|
txSleep(10);
|
||||||
|
|
||||||
|
if (GetAsyncKeyState('Q') || GetAsyncKeyState(VK_ESCAPE)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void playGame(MapPart gettedMapParts[])
|
||||||
|
{
|
||||||
|
int minX = gettedMapParts[0].coords.left;
|
||||||
|
int iMin = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < arrElem; i++) {
|
||||||
|
|
||||||
|
if (gettedMapParts[i].coords.left < minX)
|
||||||
|
{
|
||||||
|
minX = gettedMapParts[i].coords.left;
|
||||||
|
iMin = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int player_x = gettedMapParts[iMin].coords.left;
|
||||||
|
int player_y = gettedMapParts[iMin].coords.top - (PLAYER_SIZE + 5);
|
||||||
|
|
||||||
|
int player_speed = PLAYER_SIZE;
|
||||||
|
|
||||||
|
while (!GetAsyncKeyState('Q') && !GetAsyncKeyState(VK_ESCAPE)) {
|
||||||
|
|
||||||
|
background(TX_WHITE);
|
||||||
|
|
||||||
|
txSetColor(MY_RED, 3);
|
||||||
|
txSetFillColor(MY_RED);
|
||||||
|
|
||||||
|
txRectangle(player_x,
|
||||||
|
player_y,
|
||||||
|
player_x + PLAYER_SIZE,
|
||||||
|
player_y + PLAYER_SIZE);
|
||||||
|
|
||||||
|
for (int i = 0; i < MAP_LENGHT; i++) {
|
||||||
|
|
||||||
|
if (gettedMapParts[i].visible) {
|
||||||
|
|
||||||
|
txBitBlt(txDC(),
|
||||||
|
gettedMapParts[i].coords.left,
|
||||||
|
gettedMapParts[i].coords.top,
|
||||||
|
60, 60,
|
||||||
|
gettedMapParts[i].picture
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetAsyncKeyState('W') || GetAsyncKeyState(VK_UP)) {
|
||||||
|
player_y -= player_speed;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState('A') || GetAsyncKeyState(VK_LEFT)) {
|
||||||
|
player_x -= player_speed;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState('S') || GetAsyncKeyState(VK_DOWN)) {
|
||||||
|
player_y += player_speed;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState('D') || GetAsyncKeyState(VK_RIGHT)) {
|
||||||
|
player_x += player_speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetAsyncKeyState(VK_OEM_PLUS)) {
|
||||||
|
player_speed += BLOCK_SIZE / 10;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState(VK_OEM_MINUS)) {
|
||||||
|
player_speed -= BLOCK_SIZE / 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
txSleep(50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
8499
lib/TXLib.h
Normal file
8499
lib/TXLib.h
Normal file
File diff suppressed because it is too large
Load diff
13
mylvl.fslvl
Normal file
13
mylvl.fslvl
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
Block,240,120,300,180
|
||||||
|
Block,120,240,180,300
|
||||||
|
Block,360,180,420,240
|
||||||
|
Block,420,180,480,240
|
||||||
|
Quest,600,120,660,180
|
||||||
|
Fire,600,180,660,240
|
||||||
|
Water,300,300,360,360
|
||||||
|
Water,360,300,420,360
|
||||||
|
Water,420,300,480,360
|
||||||
|
Block,780,240,840,300
|
||||||
|
Block,960,300,1020,360
|
||||||
|
Block,900,240,960,300
|
||||||
|
Quest,1080,360,1140,420
|
Loading…
Add table
Reference in a new issue