1 #define DIRECTINPUT_VERSION 0x0800
\r
9 #pragma comment(lib, "user32.lib")
\r
10 #pragma comment(lib, "dinput8.lib")
\r
11 #pragma comment(lib, "dxguid.lib")
\r
15 const int WIDTH = 43, HEIGHT = 25;
\r
19 bool keys[4] = { false, false, false, false };
\r
20 bool keys_old[4] = { false, false, false, false };
\r
24 clock_t jump_clock = clock();
\r
25 double jump_time1 = 0.01;
\r
26 double jump_time2 = 0.05;
\r
27 int jump_height = 3;
\r
29 DWORD wait_time = 50;
\r
33 void press_down(WORD vk) {
\r
36 ip.type = INPUT_KEYBOARD;
\r
39 ip.ki.dwExtraInfo = 0;
\r
43 SendInput(1, &ip, sizeof(INPUT));
\r
46 void press_up(WORD vk) {
\r
48 ip.type = INPUT_KEYBOARD;
\r
51 ip.ki.dwExtraInfo = 0;
\r
53 ip.ki.dwFlags = KEYEVENTF_KEYUP;
\r
54 SendInput(1, &ip, sizeof(INPUT));
\r
57 void press(WORD vk) {
\r
60 GetAsyncKeyState(vk);
\r
63 void key_down(char c) {
\r
67 ip.type = INPUT_KEYBOARD;
\r
69 ip.ki.dwExtraInfo = 0;
\r
71 ip.ki.dwFlags = KEYEVENTF_UNICODE;
\r
74 SendInput(1, &ip, sizeof(INPUT));
\r
77 void key_up(char c) {
\r
81 ip.type = INPUT_KEYBOARD;
\r
83 ip.ki.dwExtraInfo = 0;
\r
86 ip.ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
\r
87 SendInput(1, &ip, sizeof(INPUT));
\r
96 LPDIRECTINPUTDEVICE8 keyboard;
\r
98 HRESULT initializedirectinput8() {
\r
100 // Create a DirectInput device
\r
101 if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,
\r
102 IID_IDirectInput8, (VOID **)&di, NULL))) {
\r
108 void createdikeyboard() {
\r
109 di->CreateDevice(GUID_SysKeyboard, &keyboard, NULL);
\r
110 keyboard->SetDataFormat(&c_dfDIKeyboard);
\r
111 keyboard->SetCooperativeLevel(NULL, DISCL_FOREGROUND | DISCL_EXCLUSIVE);
\r
112 keyboard->Acquire();
\r
115 void destroydikeyboard() {
\r
116 keyboard->Unacquire();
\r
117 keyboard->Release();
\r
120 #define keydown(name, key) (name[key] & 0x80)
\r
122 std::string read_map() {
\r
123 std::ifstream ifs("lvl/1.txt", std::ios::in | std::ios::binary);
\r
126 ifs.seekg(0, std::ios::end);
\r
127 int length = ifs.tellg();
\r
128 ifs.seekg(0, std::ios::beg);
\r
129 char *buffer = new char[length + 1];
\r
130 ifs.read(buffer, length);
\r
132 buffer[length] = 0;
\r
133 std::string result(buffer);
\r
137 std::string map = read_map();
\r
139 char get_block(int x, int y) {
\r
140 char result = map[WIDTH + 8 + y * (WIDTH + 4) + x + 1];
\r
144 double get_dur(clock_t then) {
\r
145 double result = (double)(clock() - then) / CLOCKS_PER_SEC;
\r
146 return result * 1000;
\r
151 key(right ? '>' : '<');
\r
156 key(get_block(x, y));
\r
159 void move(int dx, int dy) {
\r
162 for (int i = 0; i < dx; i++) {
\r
166 for (int i = 0; i > dx; i--) {
\r
170 for (int i = 0; i < dy; i++) {
\r
173 for (int i = 0; i > dy; i--) {
\r
182 printf("%d %d\n", x, y);
\r
185 void move_to(int _x, int _y) {
\r
186 move(_x - x, _y - y);
\r
189 void print_text(int text_x, int text_y, const char *text, int delay) {
\r
190 for (int i = x; i < text_x; i++) press(VK_RIGHT);
\r
191 for (int i = x; i > text_x; i--) press(VK_LEFT);
\r
192 for (int i = y; i < text_y; i++) press(VK_DOWN);
\r
193 for (int i = y; i > text_y; i--) press(VK_UP);
\r
195 int len = strlen(text);
\r
196 for (int i = 0; i < len; i++) {
\r
201 for (int i = text_x + len; i < x; i++) press(VK_RIGHT);
\r
202 for (int i = text_x + len; i > x; i--) press(VK_LEFT);
\r
203 for (int i = text_y; i < y; i++) press(VK_DOWN);
\r
204 for (int i = text_y; i > y; i--) press(VK_UP);
\r
212 GS_START, GS_INTRO1, GS_INTRO2
\r
215 clock_t update_clock = clock();
\r
216 double update_time = 30;
\r
218 void update_play(bool can_jump = true) {
\r
219 if (get_dur(update_clock) >= update_time)
\r
220 update_clock = clock();
\r
224 // bool left = false;
\r
225 // bool right = false;
\r
226 // bool up = false;
\r
227 // bool down = false;
\r
231 get_block(x - 1, y) != 'x')
\r
235 get_block(x + 1, y) != 'x')
\r
238 if (keys[2] && !keys_old[2] && jumping == 0 && can_jump) {
\r
241 jump_clock = clock();
\r
243 if (jumping != 0) {
\r
244 if (jumping < jump_height && get_dur(jump_clock) > jump_time1) {
\r
245 if (get_block(x, y - 1) != 'x') {
\r
248 jump_clock = clock();
\r
250 jumping = jump_height;
\r
253 else if (jumping == jump_height && get_dur(jump_clock) > jump_time2) {
\r
257 if (!jumping && get_block(x, y + 1) != 'x' && y < HEIGHT - 1)
\r
260 char block = get_block(x, y);
\r
275 enum GameState game_state = GS_START;
\r
276 void update_game() {
\r
277 switch (game_state) {
\r
285 print_text(4, 2, "Move with left/right.", 30);
\r
287 game_state = GS_INTRO1;
\r
290 update_play(false);
\r
292 print_text(4, 4, "Jump with up.", 30);
\r
293 game_state = GS_INTRO2;
\r
307 int main(int argc, char **argv) {
\r
308 // Dies zu programmieren mit der reduzierten Inputrate.
\r
309 // Ist nicht angenehm. Ich werde es ändern.......
\r
311 // printf("%c", get_block(6, 23));
\r
312 // printf("%c", get_block(6, 24));
\r
315 PROCESS_INFORMATION pi;
\r
317 ZeroMemory( &si, sizeof(si) );
\r
318 si.cb = sizeof(si);
\r
319 ZeroMemory( &pi, sizeof(pi) );
\r
321 //MessageBoxA(NULL, "Guten Tag.", "Spiel Name???", MB_OK);
\r
323 // Start the child process.
\r
324 if( !CreateProcessA( NULL, // No module name (use command line)
\r
325 "notepad.exe lvl/1.txt", // Command line
\r
326 NULL, // Process handle not inheritable
\r
327 NULL, // Thread handle not inheritable
\r
328 FALSE, // Set handle inheritance to FALSE
\r
329 0, // No creation flags
\r
330 NULL, // Use parent's environment block
\r
331 NULL, // Use parent's starting directory
\r
332 &si, // Pointer to STARTUPINFO structure
\r
333 &pi ) // Pointer to PROCESS_INFORMATION structure
\r
336 printf( "CreateProcess failed (%d).\n", GetLastError() );
\r
342 hwnd = FindWindowA(NULL, "1.txt - Editor");
\r
346 initializedirectinput8();
\r
347 createdikeyboard();
\r
351 hr = keyboard->GetDeviceState(256, dikeys);
\r
352 if (keydown(dikeys, DIK_ESCAPE)) {
\r
353 TerminateProcess(pi.hProcess, 0);
\r
354 //MessageBoxA(NULL, "beendet...", "Schönes Wochenende.", MB_OK);
\r
357 keys[0] = keydown(dikeys, DIK_LEFTARROW);
\r
358 keys[1] = keydown(dikeys, DIK_RIGHTARROW);
\r
359 keys[2] = keydown(dikeys, DIK_UPARROW);
\r
361 if (keys[0] && !keys_old[0]) press(VK_RIGHT);
\r
362 if (keys[1] && !keys_old[1]) press(VK_LEFT);
\r
363 if (keys[2] && !keys_old[2]) press(VK_DOWN);
\r
367 keys_old[0] = keys[0];
\r
368 keys_old[1] = keys[1];
\r
369 keys_old[2] = keys[2];
\r
370 keys_old[3] = keys[3];
\r
372 WaitForSingleObject( pi.hProcess, 10);
\r
374 SetWindowPos(hwnd, HWND_TOPMOST, 100, 100, 750, 750, SWP_SHOWWINDOW);
\r
377 destroydikeyboard();
\r
379 // Close process and thread handles.
\r
380 CloseHandle( pi.hProcess );
\r
381 CloseHandle( pi.hThread );
\r