+#define DIRECTINPUT_VERSION 0x0800\r
+#include <windows.h>\r
+#include <dinput.h>\r
+#include <stdio.h>\r
+#include <time.h>\r
+#include <string>\r
+#include <fstream>\r
+\r
+#pragma comment(lib, "user32.lib")\r
+#pragma comment(lib, "dinput8.lib")\r
+#pragma comment(lib, "dxguid.lib")\r
+\r
+HWND hwnd = NULL;\r
+\r
+const int WIDTH = 43, HEIGHT = 25;\r
+int x = 0, y = 0;\r
+bool right = true;\r
+\r
+bool keys[4] = { false, false, false, false };\r
+bool keys_old[4] = { false, false, false, false };\r
+\r
+int jumping = 0;\r
+\r
+clock_t jump_clock = clock();\r
+double jump_time1 = 0.01;\r
+double jump_time2 = 0.05;\r
+int jump_height = 3;\r
+\r
+DWORD wait_time = 50;\r
+\r
+\r
+\r
+void press_down(WORD vk) {\r
+ INPUT ip;\r
+\r
+ ip.type = INPUT_KEYBOARD;\r
+ ip.ki.wScan = 0;\r
+ ip.ki.time = 0;\r
+ ip.ki.dwExtraInfo = 0;\r
+\r
+ ip.ki.wVk = vk;\r
+ ip.ki.dwFlags = 0;\r
+ SendInput(1, &ip, sizeof(INPUT));\r
+}\r
+\r
+void press_up(WORD vk) {\r
+ INPUT ip;\r
+ ip.type = INPUT_KEYBOARD;\r
+ ip.ki.wScan = 0;\r
+ ip.ki.time = 0;\r
+ ip.ki.dwExtraInfo = 0;\r
+\r
+ ip.ki.dwFlags = KEYEVENTF_KEYUP;\r
+ SendInput(1, &ip, sizeof(INPUT));\r
+}\r
+\r
+void press(WORD vk) {\r
+ press_down(vk);\r
+ press_up(vk);\r
+ GetAsyncKeyState(vk);\r
+}\r
+\r
+void key_down(char c) {\r
+ if (hwnd == NULL)\r
+ puts("oh no");\r
+ INPUT ip;\r
+ ip.type = INPUT_KEYBOARD;\r
+ ip.ki.time = 0;\r
+ ip.ki.dwExtraInfo = 0;\r
+\r
+ ip.ki.dwFlags = KEYEVENTF_UNICODE;\r
+ ip.ki.wVk = 0;\r
+ ip.ki.wScan = c;\r
+ SendInput(1, &ip, sizeof(INPUT));\r
+}\r
+\r
+void key_up(char c) {\r
+ if (hwnd == NULL)\r
+ puts("oh no");\r
+ INPUT ip;\r
+ ip.type = INPUT_KEYBOARD;\r
+ ip.ki.time = 0;\r
+ ip.ki.dwExtraInfo = 0;\r
+\r
+ // Release key\r
+ ip.ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;\r
+ SendInput(1, &ip, sizeof(INPUT));\r
+}\r
+\r
+void key(char c) {\r
+ key_down(c);\r
+ key_up(c);\r
+}\r
+\r
+LPDIRECTINPUT8 di;\r
+LPDIRECTINPUTDEVICE8 keyboard;\r
+\r
+HRESULT initializedirectinput8() {\r
+ HRESULT hr;\r
+ // Create a DirectInput device\r
+ if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,\r
+ IID_IDirectInput8, (VOID **)&di, NULL))) {\r
+ return hr;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void createdikeyboard() {\r
+ di->CreateDevice(GUID_SysKeyboard, &keyboard, NULL);\r
+ keyboard->SetDataFormat(&c_dfDIKeyboard);\r
+ keyboard->SetCooperativeLevel(NULL, DISCL_FOREGROUND | DISCL_EXCLUSIVE);\r
+ keyboard->Acquire();\r
+}\r
+\r
+void destroydikeyboard() {\r
+ keyboard->Unacquire();\r
+ keyboard->Release();\r
+}\r
+\r
+#define keydown(name, key) (name[key] & 0x80)\r
+\r
+std::string read_map() {\r
+ std::ifstream ifs("lvl/1.txt", std::ios::in | std::ios::binary);\r
+ if (!ifs.good())\r
+ puts("mist");\r
+ ifs.seekg(0, std::ios::end);\r
+ int length = ifs.tellg();\r
+ ifs.seekg(0, std::ios::beg);\r
+ char *buffer = new char[length + 1];\r
+ ifs.read(buffer, length);\r
+ ifs.close();\r
+ buffer[length] = 0;\r
+ std::string result(buffer);\r
+ delete buffer;\r
+ return result;\r
+}\r
+std::string map = read_map();\r
+\r
+char get_block(int x, int y) {\r
+ char result = map[WIDTH + 8 + y * (WIDTH + 4) + x + 1];\r
+ return result;\r
+}\r
+\r
+double get_dur(clock_t then) {\r
+ double result = (double)(clock() - then) / CLOCKS_PER_SEC;\r
+ return result * 1000;\r
+}\r
+\r
+void draw() {\r
+ press(VK_BACK);\r
+ key(right ? '>' : '<');\r
+}\r
+\r
+void erase() {\r
+ press(VK_BACK);\r
+ key(get_block(x, y));\r
+}\r
+\r
+void move(int dx, int dy) {\r
+ erase();\r
+\r
+ for (int i = 0; i < dx; i++) {\r
+ right = true;\r
+ press(VK_RIGHT);\r
+ }\r
+ for (int i = 0; i > dx; i--) {\r
+ right = false;\r
+ press(VK_LEFT);\r
+ }\r
+ for (int i = 0; i < dy; i++) {\r
+ press(VK_DOWN);\r
+ }\r
+ for (int i = 0; i > dy; i--) {\r
+ press(VK_UP);\r
+ }\r
+\r
+ draw();\r
+ \r
+ x += dx;\r
+ y += dy;\r
+ \r
+ printf("%d %d\n", x, y);\r
+}\r
+\r
+void move_to(int _x, int _y) {\r
+ move(_x - x, _y - y);\r
+}\r
+\r
+void print_text(int text_x, int text_y, const char *text, int delay) {\r
+ for (int i = x; i < text_x; i++) press(VK_RIGHT);\r
+ for (int i = x; i > text_x; i--) press(VK_LEFT);\r
+ for (int i = y; i < text_y; i++) press(VK_DOWN);\r
+ for (int i = y; i > text_y; i--) press(VK_UP);\r
+\r
+ int len = strlen(text);\r
+ for (int i = 0; i < len; i++) {\r
+ press(VK_DELETE);\r
+ key(text[i]);\r
+ Sleep(delay);\r
+ }\r
+ for (int i = text_x + len; i < x; i++) press(VK_RIGHT);\r
+ for (int i = text_x + len; i > x; i--) press(VK_LEFT);\r
+ for (int i = text_y; i < y; i++) press(VK_DOWN);\r
+ for (int i = text_y; i > y; i--) press(VK_UP);\r
+\r
+ draw();\r
+\r
+ Sleep(100);\r
+}\r
+\r
+enum GameState {\r
+ GS_START, GS_INTRO1, GS_INTRO2\r
+};\r
+\r
+clock_t update_clock = clock();\r
+double update_time = 30;\r
+\r
+void update_play(bool can_jump = true) {\r
+ if (get_dur(update_clock) >= update_time)\r
+ update_clock = clock();\r
+ else\r
+ return;\r
+\r
+ // bool left = false;\r
+ // bool right = false;\r
+ // bool up = false;\r
+ // bool down = false;\r
+\r
+ if (keys[0] &&\r
+ x > 0 &&\r
+ get_block(x - 1, y) != 'x')\r
+ move(-1, 0);\r
+ if (keys[1] &&\r
+ x < WIDTH - 1 &&\r
+ get_block(x + 1, y) != 'x')\r
+ move(+1, 0);\r
+ // else \r
+ if (keys[2] && !keys_old[2] && jumping == 0 && can_jump) {\r
+ jumping = 1;\r
+ move(0, -1);\r
+ jump_clock = clock();\r
+ }\r
+ if (jumping != 0) {\r
+ if (jumping < jump_height && get_dur(jump_clock) > jump_time1) {\r
+ if (get_block(x, y - 1) != 'x') {\r
+ move(0, -1);\r
+ jumping++;\r
+ jump_clock = clock();\r
+ } else {\r
+ jumping = jump_height;\r
+ }\r
+ }\r
+ else if (jumping == jump_height && get_dur(jump_clock) > jump_time2) {\r
+ jumping = 0;\r
+ }\r
+ }\r
+ if (!jumping && get_block(x, y + 1) != 'x' && y < HEIGHT - 1)\r
+ move(0, +1);\r
+\r
+ char block = get_block(x, y);\r
+ switch (block) {\r
+ case '/':\r
+ case '\\':\r
+ move_to(0, 24);\r
+ break;\r
+ case '?':\r
+ puts("?");\r
+ break;\r
+ case 'O':\r
+ puts("O");\r
+ break;\r
+ }\r
+}\r
+\r
+enum GameState game_state = GS_START;\r
+void update_game() {\r
+ switch (game_state) {\r
+ case GS_START:\r
+ press(VK_DOWN);\r
+ press(VK_RIGHT);\r
+ press(VK_RIGHT);\r
+\r
+ move_to(1, 24);\r
+\r
+ print_text(4, 2, "Move with left/right.", 30);\r
+\r
+ game_state = GS_INTRO1;\r
+ break;\r
+ case GS_INTRO1:\r
+ update_play(false);\r
+ if (x == 5) {\r
+ print_text(4, 4, "Jump with up.", 30);\r
+ game_state = GS_INTRO2;\r
+ }\r
+ break;\r
+ case GS_INTRO2:\r
+ update_play();\r
+ break;\r
+ }\r
+}\r
+\r
+/*\r
+ Todo:\r
+ - Restart\r
+ - Next Level\r
+*/\r
+int main(int argc, char **argv) {\r
+ // Dies zu programmieren mit der reduzierten Inputrate.\r
+ // Ist nicht angenehm. Ich werde es ändern.......\r
+\r
+ // printf("%c", get_block(6, 23));\r
+ // printf("%c", get_block(6, 24));\r
+\r
+ STARTUPINFOA si;\r
+ PROCESS_INFORMATION pi;\r
+\r
+ ZeroMemory( &si, sizeof(si) );\r
+ si.cb = sizeof(si);\r
+ ZeroMemory( &pi, sizeof(pi) );\r
+ \r
+ //MessageBoxA(NULL, "Guten Tag.", "Spiel Name???", MB_OK);\r
+\r
+ // Start the child process. \r
+ if( !CreateProcessA( NULL, // No module name (use command line)\r
+ "notepad.exe lvl/1.txt", // Command line\r
+ NULL, // Process handle not inheritable\r
+ NULL, // Thread handle not inheritable\r
+ FALSE, // Set handle inheritance to FALSE\r
+ 0, // No creation flags\r
+ NULL, // Use parent's environment block\r
+ NULL, // Use parent's starting directory \r
+ &si, // Pointer to STARTUPINFO structure\r
+ &pi ) // Pointer to PROCESS_INFORMATION structure\r
+ ) \r
+ {\r
+ printf( "CreateProcess failed (%d).\n", GetLastError() );\r
+ return 0;\r
+ }\r
+ \r
+ Sleep(100);\r
+\r
+ hwnd = FindWindowA(NULL, "1.txt - Editor");\r
+\r
+ HRESULT hr;\r
+ BYTE dikeys[256];\r
+ initializedirectinput8();\r
+ createdikeyboard();\r
+\r
+ MSG Msg;\r
+ while (true) {\r
+ hr = keyboard->GetDeviceState(256, dikeys);\r
+ if (keydown(dikeys, DIK_ESCAPE)) {\r
+ TerminateProcess(pi.hProcess, 0);\r
+ //MessageBoxA(NULL, "beendet...", "Schönes Wochenende.", MB_OK);\r
+ break;\r
+ }\r
+ keys[0] = keydown(dikeys, DIK_LEFTARROW);\r
+ keys[1] = keydown(dikeys, DIK_RIGHTARROW);\r
+ keys[2] = keydown(dikeys, DIK_UPARROW);\r
+\r
+ if (keys[0] && !keys_old[0]) press(VK_RIGHT);\r
+ if (keys[1] && !keys_old[1]) press(VK_LEFT);\r
+ if (keys[2] && !keys_old[2]) press(VK_DOWN);\r
+\r
+ update_game();\r
+\r
+ keys_old[0] = keys[0];\r
+ keys_old[1] = keys[1];\r
+ keys_old[2] = keys[2];\r
+ keys_old[3] = keys[3];\r
+\r
+ WaitForSingleObject( pi.hProcess, 10);\r
+\r
+ SetWindowPos(hwnd, HWND_TOPMOST, 100, 100, 750, 750, SWP_SHOWWINDOW);\r
+ }\r
+\r
+ destroydikeyboard();\r
+\r
+ // Close process and thread handles. \r
+ CloseHandle( pi.hProcess );\r
+ CloseHandle( pi.hThread );\r
+\r
+ return 0;\r
+}
\ No newline at end of file