diff --git a/FallSimulation.cbp b/FallSimulation.cbp
index 74959d6..8bc7660 100644
--- a/FallSimulation.cbp
+++ b/FallSimulation.cbp
@@ -33,6 +33,10 @@
+
+
+
+
diff --git a/FallSimulation.cpp b/FallSimulation.cpp
index aca0d5d..da95412 100644
--- a/FallSimulation.cpp
+++ b/FallSimulation.cpp
@@ -1,65 +1,13 @@
#include
+#include "lib\\Consts.h"
+#include "lib\\ElemFunctions.h"
+#include "lib\\ModesFunctions.h"
+
#include
-#include
using namespace std;
-const COLORREF MY_LIGHTBLUE = RGB(75, 127, 196);
-const COLORREF MY_BISQUE = RGB(255, 214, 89);
-
-const int BLOCK_SIZE = 120;
-
-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;
-
-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;
-
void background(COLORREF color);
-void drawMenu();
-void drawButton(Button but);
-void loadingAnimation(int delay, int speed);
-void mainFunc();
-bool addingBlock(bool clicked, RECT blockBut, HDC pic,
- int blocktype, int* arrElem, MapPart mapParts[]);
-
-int readFile(string file, MapPart gettedMapParts[]);
-void playGame(MapPart gettedMapParts[]);
-bool areElemWithTheseCoordsExisting(RECT coords, MapPart mapParts[]);
int main()
{
@@ -123,530 +71,3 @@ void background(COLORREF 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 arrElem = 0;
- 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;
- }
- }
-
- //round((mapParts[elem].coords.left + 30) / 60) * 60
-
- //moving picture
- RECT oldCoords = mapParts[selectedPict].coords;
-
- 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)
- };
-
- if (!areElemWithTheseCoordsExisting(elRectCoords, mapParts)) {
-
- mapParts[selectedPict].coords = elRectCoords;
- selectedPict = -1;
- }
- else {
- mapParts[selectedPict].coords = oldCoords;
- 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) &&
- !(areElemWithTheseCoordsExisting(elRectCoords, mapParts)))
- {
- cout << !(areElemWithTheseCoordsExisting(elRectCoords, mapParts)) << endl;
-
- mapParts[*arrElem] = {
- elRectCoords, true, pic, blocktype
- };
-
- (*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[])
-{
- background(TX_WHITE);
-
- 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
- );
- }
- }
-}
-
-bool areElemWithTheseCoordsExisting(RECT coords, MapPart mapParts[])
-{
- RECT elemCoords;
- bool areElemExisting;
-
- for (int i = 0; i < MAP_LENGHT + 1; i++) {
-
- elemCoords = mapParts[i].coords;
-
- if (coords.left == elemCoords.left &&
- coords.top == elemCoords.top &&
- coords.right == elemCoords.right &&
- coords.bottom == elemCoords.bottom &&
-
- mapParts[i].visible
- ) {
- areElemExisting = true;
- }
- else {
- areElemExisting = false;
- }
- }
-
- return areElemExisting;
-}
-
diff --git a/level1.fslvl b/level1.fslvl
index 3e1858e..db944c2 100644
--- a/level1.fslvl
+++ b/level1.fslvl
@@ -1,13 +1,12 @@
-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
+Block,120,420,180,480
+Block,300,360,360,420
+Quest,420,360,480,420
+Block,600,300,660,360
+Block,720,360,780,420
+Block,900,360,960,420
+Quest,1080,420,1140,480
+Fire,420,420,480,480
+Water,840,420,900,480
+Water,780,420,840,480
+Fire,1020,480,1080,540
+Block,480,180,540,240
diff --git a/lib/Consts.h b/lib/Consts.h
new file mode 100644
index 0000000..5a44ab9
--- /dev/null
+++ b/lib/Consts.h
@@ -0,0 +1,57 @@
+#include
+#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;
+
diff --git a/lib/Consts.h.save b/lib/Consts.h.save
new file mode 100644
index 0000000..5a44ab9
--- /dev/null
+++ b/lib/Consts.h.save
@@ -0,0 +1,57 @@
+#include
+#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;
+
diff --git a/lib/ElemFunctions.h b/lib/ElemFunctions.h
new file mode 100644
index 0000000..a305686
--- /dev/null
+++ b/lib/ElemFunctions.h
@@ -0,0 +1,167 @@
+#include
+#include "Consts.h"
+#include "ModesFunctions.h"
+
+#include
+#include
+
+#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;
+ }
+ }
+ }
+}
+
diff --git a/lib/ElemFunctions.h.save b/lib/ElemFunctions.h.save
new file mode 100644
index 0000000..baf66a8
--- /dev/null
+++ b/lib/ElemFunctions.h.save
@@ -0,0 +1,167 @@
+#include "TXLib.h"
+#include "Consts.h"
+#include "ModesFunctions.h"
+
+#include
+#include
+
+#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;
+ }
+ }
+ }
+}
+
diff --git a/lib/ModesFunctions.h b/lib/ModesFunctions.h
new file mode 100644
index 0000000..05c0ae2
--- /dev/null
+++ b/lib/ModesFunctions.h
@@ -0,0 +1,424 @@
+#include
+#include "Consts.h"
+#include "ElemFunctions.h"
+
+#include
+#include
+
+#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);
+ }
+}
+
diff --git a/lib/ModesFunctions.h.save b/lib/ModesFunctions.h.save
new file mode 100644
index 0000000..33f4d6f
--- /dev/null
+++ b/lib/ModesFunctions.h.save
@@ -0,0 +1,424 @@
+#include "TXLib.h"
+#include "lib\\Consts.h"
+#include "lib\\ElemFunctions.h"
+
+#include
+#include
+
+#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);
+ }
+}
+
diff --git a/lib/TXLib.h b/lib/TXLib.h
new file mode 100644
index 0000000..7142542
--- /dev/null
+++ b/lib/TXLib.h
@@ -0,0 +1,8499 @@
+//=================================================================================================================
+// [These sections are for folding control in Code::Blocks]
+//{ [Best viewed with "Fold all on file open" option enabled] [best screen width is 115 chars]
+//=================================================================================================================
+//!
+//! @file TXLib.h
+//! @brief Библиотека Тупого Художника (The Dumb Artist Library, TX Library, TXLib).
+//!
+//! $Version: 00172a, Revision: 104 $
+//! $Copyright: (C) Ded (Ilya Dedinsky, http://txlib.ru) $
+//! $Date: 2014-08-09 16:37:26 +0400 $
+//!
+//! TX Library - компактная библиотека двумерной графики для Win32 на С++.
+//! Это небольшая "песочница" для начинающих реализована с целью помочь им в изучении
+//! простейших принципов программирования. Документация на русском языке.
+//!
+//! Философия1 TX Library - облегчить первые шаги
+//! в программировании и подтолкнуть к творчеству и самостоятельности.
+//!
+//! TX Library is a tiny 2D graphics library for Win32 written in C++. This is a small
+//! sandbox for the very beginners to help them to learn basic programming principles.
+//! The documentation is currently in Russian.
+//!
+//! Официальный сайт библиотеки: txlib.ru.
+//!
+//! См. также страницу проекта на SourceForge.
+//!
+//! @warning Это альфа-версия. Для использования требуется согласование с автором библиотеки. @nn
+//! Правила использования материалов библиотеки и сайта см. на
+//! официальном сайте.
+//!
+//! @par Трекеры на SourceForge:
+//! - Сообщить об ошибке
+//! - Предложить улучшение
+//!
+//! @par Литература
+//! -#
+//! Сальников В.Н., Ильин В.В., Шарко Ф.С., Митина Н.В., Белая И.В., Индукаев А.К., Дединский И.Р.
+//! Структура и динамика поведенческих реакций в условиях информационной перегрузки. Batman
+//! Proceedings in Sheep Philosophy, 2003, Vol. 22. pp. 23-24.
+//!
+// $Copyright: (C) Ded (Ilya Dedinsky, http://txlib.ru) $
+//-----------------------------------------------------------------------------------------------------------------
+//!
+//! @defgroup Drawing Рисование
+//! @defgroup Mouse Поддержка мыши
+//! @defgroup Dialogs Диалоговые окна
+//! @defgroup Misc Разное
+//! @defgroup Service Служебное
+//! @defgroup Technical Технические детали
+//}
+//=================================================================================================================
+
+#if !defined (__TXLIB_H_INCLUDED) // <<<<<<<<< The code is here, unfold it <<<<<<<<<<<<<<<<<<<<<<<<<
+#define __TXLIB_H_INCLUDED
+
+//-----------------------------------------------------------------------------------------------------------------
+//{ Version information
+//-----------------------------------------------------------------------------------------------------------------
+
+//! @cond INTERNAL
+#define _TX_V_FROM_CVS(_1,file,ver,rev,date,auth,_2) "TXLib [Ver: " #ver ", Rev: " #rev "]"
+#define _TX_A_FROM_CVS(_1,file,ver,rev,date,auth,_2) "Copyright (C) " auth
+#define _TX_v_FROM_CVS(_1,file,ver,rev,date,auth,_2) ((0x##ver << 16) | 0x##rev)
+//! @endcond
+
+//{----------------------------------------------------------------------------------------------------------------
+//! @ingroup Technical
+//! @brief Текущая версия библиотеки.
+//!
+//! @code
+//! #define _TX_VERSION "TXLib [Version: 1.72a, Revision 50]" (пример)
+//! #define _TX_AUTHOR "Copyright (C) Ded (Ilya Dedinsky, http://txlib.ru)"
+//! @endcode
+//! Эти константы автоматически обновляются при изменении версии.
+//!
+//! @see txVersion()
+//!
+//! @hideinitializer
+//}----------------------------------------------------------------------------------------------------------------
+//! @{
+
+#define _TX_VERSION _TX_V_FROM_CVS ($VersionInfo: , TXLib.h, 00172a, 104, 2014-08-09 16:37:26 +0400, "Ded (Ilya Dedinsky, http://txlib.ru) ", $)
+#define _TX_AUTHOR _TX_A_FROM_CVS ($VersionInfo: , TXLib.h, 00172a, 104, 2014-08-09 16:37:26 +0400, "Ded (Ilya Dedinsky, http://txlib.ru) ", $)
+
+//! @}
+//{----------------------------------------------------------------------------------------------------------------
+//! @ingroup Technical
+//! @brief Версия библиотеки в целочисленном формате.
+//!
+//! Формат: старшее слово - номер версии, младшее - номер ревизии, в двоично-десятичном формате.
+//! Например, @c 0x172a0050 - версия @c 0.172a, ревизия @c 50.
+//!
+//! Эта константа автоматически обновляется при изменении версии.
+//!
+//! @see txVersion()
+//! @usage @code
+//! #if !(defined (_TX_VER) && (_TX_VER >= 0x172a0000))
+//! #error Must use TXLib.h version >= 1.72 to compile this.
+//! #endif
+//! @endcode
+//!
+//! @hideinitializer
+//}----------------------------------------------------------------------------------------------------------------
+
+#define _TX_VER _TX_v_FROM_CVS ($VersionInfo: , TXLib.h, 00172a, 104, 2014-08-09 16:37:26 +0400, "Ded (Ilya Dedinsky, http://txlib.ru) ", $)
+
+//}
+//-----------------------------------------------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------------------------------------------
+//{ Compiler- and platform-specific
+//! @name Адаптация к компиляторам и платформам
+//-----------------------------------------------------------------------------------------------------------------
+//! @{ @cond INTERNAL
+
+#if !defined (__cplusplus)
+
+ #ifdef __GNUC__
+ #error
+ #error --------------------------------------------------------------------------------------------------------
+ #endif
+ #error TXLib.h: Must use C++ to compile TXLib.h.
+ #error
+ #error CHECK source file EXTENSION. Maybe it is ".C". It must be ".CPP".
+ #error If your file is named, for example, "Untitled.C", go to menu [File], then
+ #error then [Save As] and rename it to "Untitled.CPP". Please do NOT use spaces.
+ #error --------------------------------------------------------------------------------------------------------
+ #error
+
+#endif
+
+#if !defined (WIN32) && !defined (__WIN32__) && !defined(_WIN32) && !defined(_WIN32_WINNT)
+
+ #ifdef __GNUC__
+ #error
+ #error --------------------------------------------------------------------------------------------------------
+ #endif
+ #error TXLib.h: Windows (MSVC/Win32 or GCC/MinGW) is the only supported system, sorry.
+ #error
+ #error In Linux or iOS, you should write your own TXLib and share it with your friends,
+ #error or use wine.
+ #error --------------------------------------------------------------------------------------------------------
+ #error
+
+#endif
+
+#if defined (UNICODE) || defined (_UNICODE)
+
+ #ifdef __GNUC__
+ #warning TXLib.h: Disabling the UNICODE
+ #endif
+
+ #undef UNICODE // Burn Unicode, burn
+ #undef _UNICODE
+
+ #if defined (_WINDOWS_H) || defined (_INC_WINDOWS) || defined (_WINDOWS_) || defined (__WINDOWS__)
+
+ #ifdef __GNUC__
+ #error
+ #error --------------------------------------------------------------------------------------------------------
+ #endif
+ #error TXLib.h: Should include "TXLib.h" BEFORE or INSTEAD of in UNICODE mode.
+ #error
+ #error REARRANGE your #include directives, or DISABLE the UNICODE mode.
+ #error --------------------------------------------------------------------------------------------------------
+ #error
+
+ #endif
+
+#endif
+
+#if defined (__STRICT_ANSI__) // Try to extend strict ANSI rules
+
+ #ifdef __GNUC__
+ #warning TXLib.h: Trying to extend strict ANSI compatibility
+ #endif
+
+ #undef __STRICT_ANSI__
+ #define __STRICT_ANSI__UNDEFINED
+
+ #if defined (_STRING_H_) || defined (_INC_STRING) || defined (_STDIO_H_) || defined (_INC_STDIO)
+
+ #ifdef __GNUC__
+ #error
+ #error --------------------------------------------------------------------------------------------------------
+ #endif
+ #error TXLib.h: Should include "TXLib.h" BEFORE or in Strict ANSI mode.
+ #error
+ #error REARRANGE your #include directives, or DISABLE ANSI-compliancy.
+ #error --------------------------------------------------------------------------------------------------------
+ #error
+
+ #endif
+
+#endif
+
+#if defined (__GNUC__)
+
+ #define _GCC_VER ( __GNUC__*100 + __GNUC_MINOR__*10 + __GNUC_PATCHLEVEL__ )
+
+ #if defined (_GCC_VER) && (_GCC_VER >= 420)
+
+ #if (_GCC_VER >= 460)
+ #pragma GCC diagnostic push
+ #endif
+
+ #pragma GCC optimize ("no-strict-aliasing")
+ #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+
+ #pragma GCC diagnostic ignored "-Wshadow"
+
+ #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+ #pragma GCC diagnostic ignored "-Wunreachable-code"
+ #pragma GCC diagnostic ignored "-Wold-style-cast"
+ #pragma GCC diagnostic ignored "-Wunused-label" // Just for fun in _txCanvas_OnCmdAbout()
+ #pragma GCC diagnostic ignored "-Winline"
+
+ #define _TX_THREAD __thread
+
+ #else
+ #define _TX_THREAD
+
+ #endif
+
+ #define _TX_CHECK_FORMAT( at ) __attribute__ (( format (printf, (at), (at)+1) ))
+
+ template
+ inline T _txNOP (T value) { return value; } // To suppress performance warnings in assert etc
+
+ // From MinGW\include\float.h which is replaced by MinGW\lib\gcc\i686-pc-mingw32\x.x.x\include\float.h
+ extern "C" unsigned int __cdecl _controlfp (unsigned int unNew, unsigned int unMask);
+ extern "C" void __cdecl _fpreset (void);
+
+#else
+
+ #define _TX_CHECK_FORMAT( at )
+
+ #define _txNOP( value ) ( value )
+
+#endif
+
+#if defined (_MSC_VER)
+
+ #pragma warning (push, 4) // Set maximum warning level
+
+ #pragma warning (disable: 4127) // conditional expression is constant
+ #pragma warning (disable: 4351) // new behavior: elements of array will be default initialized
+ #pragma warning (disable: 4702) // unreachable code
+
+ #define _TX_THREAD __declspec (thread)
+
+#endif
+
+#if defined (_MSC_VER) && (_MSC_VER == 1200) // MSVC 6 (1998)
+
+ #define _MSC_VER_6 // Flag the bad dog
+
+ #pragma warning (disable: 4511) // copy constructor could not be generated
+ #pragma warning (disable: 4512) // assignment operator could not be generated
+ #pragma warning (disable: 4514) // unreferenced inline function has been removed
+ #pragma warning (disable: 4663) // C++ language change: to explicitly specialize class template
+ #pragma warning (disable: 4710) // function not inlined
+ #pragma warning (disable: 4786) // identifier was truncated to '255' characters in the debug information
+
+ #if !defined (WINVER)
+ #define WINVER 0x0400 // MSVC 6: Defaults to Windows 95
+ #endif
+
+ #if !defined (NDEBUG)
+ #define _CRTDBG_MAP_ALLOC 1 // Set debug mode heap allocation
+ #endif
+
+#endif
+
+#if defined (_MSC_VER) && (_MSC_VER >= 1400) // MSVC 8 (2005) or greater
+
+ #pragma warning (disable: 26135) // missing locking annotation
+ #pragma warning (disable: 28125) // the function must be called from within a try/except block
+ #pragma warning (disable: 28159) // consider using another function instead
+
+ #pragma setlocale ("russian") // Set source file encoding, see also _TX_CP
+
+ #if !defined (NDEBUG)
+ #pragma check_stack (on) // Turn on stack probes at runtime
+ #pragma strict_gs_check (push, on) // Detects stack buffer overruns
+ #endif
+
+ #define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
+ #define _TX_TRUNCATE , _TRUNCATE
+
+#else
+
+ #define strcpy_s strcpy // MSVC prior to 8 (2005) versions and GCC
+ #define strncpy_s strncpy // do NOT have secure variants of these
+ #define strncat_s strncat // functions, so use insecure ones.
+ #define wcsncpy_s wcsncpy // ...
+ #define _snprintf_s _snprintf //
+ #define _vsnprintf_s _vsnprintf //
+
+ #define strerror_s( buf, code ) ( strncpy ((buf), strerror (code), sizeof(buf)-1) )
+ #define ctime_s( buf, sizeof_buf, time ) ( strncpy ((buf), ctime (time), (sizeof_buf)-1) )
+ #define getenv_s( sz, buf, sizeof_buf, name ) ( (void)(sz), strncpy ((buf), getenv (name), (sizeof_buf)-1) )
+ #define strtok_s( buf, delim, ctx ) ( (void)(ctx), strtok ((buf), (delim)) )
+
+ #if !( defined (_GCC_VER) && (_GCC_VER == 471) && defined (__x86_64__) ) // GCC 4.7.1 x64 already has it
+ #define _controlfp_s( oldCtl, newCtl, mask ) ( *(oldCtl) = _controlfp (newCtl, mask), 0 )
+ #endif
+
+ #define _TX_TRUNCATE
+
+#endif
+
+#if defined (__INTEL_COMPILER)
+
+ #pragma warning (disable: 174) // remark: expression has no effect
+ #pragma warning (disable: 304) // remark: access control not specified ("public" by default)
+ #pragma warning (disable: 522) // remark: function "..." redeclared "inline" after being called
+ #pragma warning (disable: 981) // remark: operands are evaluated in unspecified order
+ #pragma warning (disable: 1684) // conversion from pointer to same-sized integral type (potential portability problem)
+
+#endif
+
+#if !defined (WINVER)
+ #define WINVER 0x0500 // Defaults to Windows 2000
+ #define WINDOWS_ENABLE_CPLUSPLUS // Allow use of type-limit macros in ,
+#endif // they allowed by default if WINVER >= 0x0600.
+
+#if !defined (_WIN32_WINNT)
+ #define _WIN32_WINNT WINVER // Defaults to the same as WINVER
+#endif
+
+#if !defined (_WIN32_IE)
+ #define _WIN32_IE WINVER // Defaults to the same as WINVER
+#endif
+
+#define _USE_MATH_DEFINES // math.h's M_PI etc.
+
+//! @} @endcond
+//}
+//-----------------------------------------------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------------------------------------------
+//{ The Includes
+//-----------------------------------------------------------------------------------------------------------------
+
+#ifdef _MSC_VER_6
+ #pragma warning (push, 3) // MSVC 6: At level 4, some std headers emit warnings O_o
+#endif
+
+//-----------------------------------------------------------------------------------------------------------------
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include