diff options
| author | Patrick Schönberger | 2020-09-30 20:04:26 +0200 |
|---|---|---|
| committer | Patrick Schönberger | 2020-09-30 20:04:26 +0200 |
| commit | c45ece9d6706faaff3ac7eac12c605c200bf3ac0 (patch) | |
| tree | f88ab6399cff2863eee7c08162154bafb1fecfad | |
| parent | ba846472fc8a7957b82d645f6cdc9889038e722d (diff) | |
| download | npengine-c45ece9d6706faaff3ac7eac12c605c200bf3ac0.tar.gz npengine-c45ece9d6706faaff3ac7eac12c605c200bf3ac0.zip | |
pre double
| -rw-r--r-- | src/main.cpp | 602 |
1 files changed, 162 insertions, 440 deletions
diff --git a/src/main.cpp b/src/main.cpp index 6c48dd9..18294f4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,14 +1,11 @@ -#define DIRECTINPUT_VERSION 0x0800
-#include <dinput.h>
#include <fstream>
#include <stdio.h>
#include <string>
#include <time.h>
#include <windows.h>
+#include <Richedit.h>
#pragma comment(lib, "user32.lib")
-#pragma comment(lib, "dinput8.lib")
-#pragma comment(lib, "dxguid.lib")
#define CONSOLE
@@ -18,119 +15,95 @@ #pragma comment(linker, "/subsystem:windows")
#endif
-HWND hwnd = NULL;
+using namespace std;
-STARTUPINFOA si;
-PROCESS_INFORMATION pi;
const int WIDTH = 56, HEIGHT = 29;
-int x = 0, y = 0;
-int spawn_x, spawn_y;
-bool right = true;
-
-clock_t update_clock = clock();
-double update_time = 40;
-
-BYTE dikeys[256];
-bool keys[4] = {false, false, false, false};
-bool keys_old[4] = {false, false, false, false};
-
-int jumping = 0;
-
-clock_t jump_clock = clock();
-double jump_time1 = 50;
-double jump_time2 = 100;
-int jump_height = 3;
-
-DWORD wait_time = 10;
-
-int text_speed = 2;
std::string map;
-void press_down(WORD vk) {
- INPUT ip;
+clock_t game_clock;
+double dt;
- ip.type = INPUT_KEYBOARD;
- ip.ki.wScan = 0;
- ip.ki.time = 0;
- ip.ki.dwExtraInfo = 0;
+// Edit
- ip.ki.wVk = vk;
- ip.ki.dwFlags = 0;
- SendInput(1, &ip, sizeof(INPUT));
-}
-
-void press_up(WORD vk) {
- INPUT ip;
- ip.type = INPUT_KEYBOARD;
- ip.ki.wScan = 0;
- ip.ki.time = 0;
- ip.ki.dwExtraInfo = 0;
+HWND hwnd_notepad = NULL;
+HWND hwnd_edit = NULL;
- ip.ki.wVk = vk;
- ip.ki.dwFlags = KEYEVENTF_KEYUP;
- SendInput(1, &ip, sizeof(INPUT));
+string get_text() {
+ int len = SendMessageA(hwnd_edit, WM_GETTEXTLENGTH, 0, 0);
+ char *buffer = new char[len + 1];
+ int read = SendMessageA(hwnd_edit, WM_GETTEXT, len + 1, (LPARAM)buffer);
+ if (read != len)
+ puts("???");
+ buffer[read] = 0;
+ string result(buffer);
+ delete[] buffer;
+ return result;
}
-void press(WORD vk) {
- press_down(vk);
- press_up(vk);
+void select_all() {
+ SendMessage(hwnd_edit, EM_SETSEL, 0, get_text().size());
}
-void key_down(char c) {
- INPUT ip;
- ip.type = INPUT_KEYBOARD;
- ip.ki.time = 0;
- ip.ki.dwExtraInfo = 0;
+void select_length(int from, int length) {
+ SendMessage(hwnd_edit, EM_SETSEL, from, from + length);
+}
- ip.ki.dwFlags = KEYEVENTF_UNICODE;
- ip.ki.wVk = 0;
- ip.ki.wScan = c;
- SendInput(1, &ip, sizeof(INPUT));
+void select_from_to(int from, int to) {
+ SendMessage(hwnd_edit, EM_SETSEL, from, to);
}
-void key_up(char c) {
- INPUT ip;
- ip.type = INPUT_KEYBOARD;
- ip.ki.time = 0;
- ip.ki.dwExtraInfo = 0;
+void replace(string str) {
+ SendMessage(hwnd_edit, EM_REPLACESEL, FALSE, (LPARAM)str.c_str());
+}
- ip.ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
- SendInput(1, &ip, sizeof(INPUT));
+int get_pos(int x, int y) {
+ return (y + 1) * (WIDTH + 4) + x + 1;
}
-void key(char c) {
- key_down(c);
- key_up(c);
+char get_block(int x, int y) {
+ return map[get_pos(x, y)];
}
-LPDIRECTINPUT8 di;
-LPDIRECTINPUTDEVICE8 keyboard;
+// Player
+struct Player {
+ int x, y;
-HRESULT initializedirectinput8() {
- HRESULT hr;
- // Create a DirectInput device
- if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,
- IID_IDirectInput8, (VOID **)&di, NULL))) {
- return hr;
+ void clear() {
+ int pos = get_pos(x, y);
+ select_length(pos, 1);
+ replace({ map[pos], 0 });
+ }
+
+ void draw() {
+ int pos = get_pos(x, y);
+ select_length(pos, 1);
+ replace({ 'Q', 0 });
}
- return 0;
-}
-void createdikeyboard() {
- di->CreateDevice(GUID_SysKeyboard, &keyboard, NULL);
- keyboard->SetDataFormat(&c_dfDIKeyboard);
- keyboard->SetCooperativeLevel(NULL, DISCL_FOREGROUND | DISCL_EXCLUSIVE);
- keyboard->Acquire();
-}
+ void move_to(int x, int y) {
+ clear();
+ this->x = x;
+ this->y = y;
+ draw();
+ }
-void destroydikeyboard() {
- keyboard->Unacquire();
- keyboard->Release();
-}
+ void move(int dx, int dy) {
+ move_to(x + dx, y + dy);
+ }
+
+ bool collision(int xdir, int ydir) {
+ int newx = x + xdir;
+ int newy = y + ydir;
+ if (newx < 0 || newx >= WIDTH || newy < 0 || newy >= HEIGHT)
+ return true;
+ return get_block(newx, newy) == 'X';
+ }
+};
+Player player { 0, 0 };
-#define keydown(name, key) (name[key] & 0x80)
+// Lvl
std::string read_map(int lvl) {
std::ifstream ifs("lvl/" + std::to_string(lvl) + ".txt",
@@ -149,179 +122,54 @@ std::string read_map(int lvl) { return result;
}
-char get_block(int x, int y) {
- char result = map[(y + 1) * (WIDTH + 4) + x + 1];
- return result;
-}
-
-double get_dur(clock_t then) {
- double result = (double)(clock() - then) / CLOCKS_PER_SEC;
- return result * 1000;
-}
-
-void draw() {
- press(VK_BACK);
- key(right ? '>' : '<');
-}
-
-void erase() {
- press(VK_BACK);
- key(get_block(x, y));
-}
-
-void move(int dx, int dy) {
- erase();
-
- for (int i = 0; i < dx; i++) {
- right = true;
- press(VK_RIGHT);
- }
- for (int i = 0; i > dx; i--) {
- right = false;
- press(VK_LEFT);
- }
- for (int i = 0; i < dy; i++) {
- press(VK_DOWN);
- }
- for (int i = 0; i > dy; i--) {
- press(VK_UP);
- }
-
- draw();
-
- x += dx;
- y += dy;
-
- printf("%d %d\n", x, y);
+void redraw() {
+ select_all();
+ replace(map);
}
-void move_to(int _x, int _y) { move(_x - x, _y - y); }
-
-void print_text(int text_x, int text_y, const char *text, int delay,
- bool move = true) {
- if (move) {
- for (int i = x; i < text_x; i++)
- press(VK_RIGHT);
- for (int i = x; i > text_x; i--)
- press(VK_LEFT);
- for (int i = y; i < text_y; i++)
- press(VK_DOWN);
- for (int i = y; i > text_y; i--)
- press(VK_UP);
- }
-
- int len = strlen(text);
- for (int i = 0; i < len; i++) {
- if (text[i] == '\r')
- continue;
- press(VK_DELETE);
- key(text[i]);
- if (move) {
- map[(text_y + 1) * (WIDTH + 4) + text_x + 1 + i] = text[i];
+void load_level(int lvl) {
+ map = read_map(lvl);
+ redraw();
+ for (int x = 0; x < WIDTH; x++) {
+ for (int y = 0; y < HEIGHT; y++) {
+ if (map[get_pos(x, y)] == 'S')
+ player.move_to(x, y);
}
- Sleep(delay);
}
- if (move) {
- for (int i = text_x + len; i < x; i++)
- press(VK_RIGHT);
- for (int i = text_x + len; i > x; i--)
- press(VK_LEFT);
- for (int i = text_y; i < y; i++)
- press(VK_DOWN);
- for (int i = text_y; i > y; i--)
- press(VK_UP);
- }
-
- draw();
-
- Sleep(100);
}
-void update_play(bool can_jump = true, int x_min = 0, int x_max = WIDTH - 1) {
- if (get_dur(update_clock) >= update_time) {
- update_clock = clock();
+// Notepad
- if (keys[0] && x > x_min && get_block(x - 1, y) != 'X')
- move(-1, 0);
- if (keys[1] && x < x_max && get_block(x + 1, y) != 'X')
- move(+1, 0);
- }
+STARTUPINFOA si;
+PROCESS_INFORMATION pi;
- if (keys[2] && !keys_old[2] && jumping == 0 && can_jump) {
- jumping = 1;
- move(0, -1);
- jump_clock = clock();
- }
- if (jumping != 0) {
- if (jumping < jump_height && get_dur(jump_clock) > jump_time1) {
- if (get_block(x, y - 1) != 'X') {
- move(0, -1);
- jumping++;
- jump_clock = clock();
- } else {
- jumping = jump_height;
- }
- } else if (jumping == jump_height && get_dur(jump_clock) > jump_time2) {
- jumping = 0;
- }
+BOOL CALLBACK ew_cb(HWND hwnd, LPARAM lp) {
+ DWORD pid;
+ DWORD tid = GetWindowThreadProcessId(hwnd, &pid);
+ if (pi.dwProcessId == pid && pi.dwThreadId == tid) {
+ hwnd_notepad = hwnd;
+ return false;
}
- if (!jumping && get_block(x, y + 1) != 'X' && y < HEIGHT - 1)
- move(0, +1);
-
- char b = get_block(x, y);
- if (b == '/' || b == '\\' || b == '<' || b == '>')
- move_to(spawn_x, spawn_y);
+ return true;
}
-
-void redraw() {
- press_down(VK_CONTROL);
- press('A');
- press_up(VK_CONTROL);
- Sleep(100);
- press(VK_DELETE);
- Sleep(100);
- int _x = x, _y = y;
- print_text(0, 0, map.c_str(), 1, false);
- for (int i = 0; i < 100; i++)
- press(VK_UP);
- for (int i = 0; i < 100; i++)
- press(VK_LEFT);
- x = y = 0;
- press(VK_DOWN);
- press(VK_RIGHT);
- press(VK_RIGHT);
- move_to(_x, _y);
-}
-
-int lvl = 0;
-
-void setup() {
- x = y = 0;
- press(VK_DOWN);
- press(VK_RIGHT);
- press(VK_RIGHT);
-
- for (int i = 0; i < WIDTH; i++)
- for (int j = 0; j < HEIGHT; j++)
- if (get_block(i, j) == 'S') {
- spawn_x = i;
- spawn_y = j;
- }
-
- move_to(spawn_x, spawn_y);
+BOOL CALLBACK ecw_cb(HWND child, LPARAM in) {
+ char buffer[1024 + 1];
+ int len = GetClassNameA(child, buffer, 1024);
+ buffer[len] = 0;
+ if (strcmp(buffer, "Edit") == 0) {
+ hwnd_edit = child;
+ return false;
+ }
+ return true;
}
-void load_level(int l, bool terminate = true) {
- lvl = l;
- map = read_map(lvl);
- if (terminate)
- TerminateProcess(pi.hProcess, 0);
-
- char cmd[100];
- sprintf(cmd, "notepad.exe lvl/%d.txt", lvl);
+void start_notepad() {
+ ZeroMemory(&si, sizeof(si));
+ si.cb = sizeof(si);
+ ZeroMemory(&pi, sizeof(pi));
if (!CreateProcessA(NULL, // No module name (use command line)
- cmd, // Command line
+ "notepad.exe", // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
@@ -332,223 +180,97 @@ void load_level(int l, bool terminate = true) { &pi) // Pointer to PROCESS_INFORMATION structure
) {
printf("CreateProcess failed (%d).\n", GetLastError());
- return;
}
-
Sleep(100);
-
- char title[100];
- sprintf(title, "%d.txt - Editor", lvl);
- hwnd = FindWindowA(NULL, title);
-
- SetWindowPos(hwnd, HWND_TOP, 100, 100, 965, 905, SWP_SHOWWINDOW);
- SetFocus(hwnd);
-
- for (int i = 0; i < 10; i++) {
- press_down(VK_CONTROL);
- press(VK_OEM_PLUS);
- press_up(VK_CONTROL);
- }
-
- setup();
+ EnumWindows(ew_cb, 0);
+ EnumChildWindows(hwnd_notepad, ecw_cb, 0);
+ SendMessage(hwnd_edit, EM_SETREADONLY, TRUE, NULL);
}
-
-void intro() {
- static int progress = 0;
- switch (progress) {
- case 0:
- print_text(4, 2, "Move with left/right.", text_speed);
-
- progress++;
- break;
- case 1:
- update_play(false);
- if (x == 17) {
- print_text(4, 4, "Jump with up.", text_speed);
- print_text(4, 6, "Stand on x.", text_speed);
- progress++;
- }
- break;
- case 2:
- update_play();
- if (x == 22) {
- print_text(4, 8, "Collect ? for ???.", text_speed);
- progress++;
- }
- break;
- case 3:
- update_play(true, 0, 33);
- if (get_block(x, y) == '?') {
- print_text(4, 10, "Avoid /\\.", text_speed);
- progress++;
- }
- break;
- case 4:
- update_play();
- if (x == 39) {
- print_text(4, 14, "Finish lvl by reaching O.", text_speed);
- progress++;
- }
- break;
- case 5:
- update_play();
- if (get_block(x, y) == 'O') {
- load_level(1);
- }
- break;
- }
+void close_notepad() {
+ TerminateProcess(pi.hProcess, 0);
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
}
-void lvl1() {
- static int progress = 0;
- switch (progress) {
- case 0:
- print_text(4, 2, "Also avoid > and <.", text_speed);
- progress++;
- break;
- case 1:
- update_play();
- break;
+// Keys
+
+enum class Key {
+ Left,
+ Right,
+ Jump,
+ Exit,
+ Redraw,
+ COUNT
+};
+
+bool key_state[(uint64_t)Key::COUNT];
+bool key_state_old[(uint64_t)Key::COUNT];
+
+int key_get_vk(Key key) {
+ switch (key) {
+ case Key::Left: return 'A';
+ case Key::Right: return 'D';
+ case Key::Jump: return VK_SPACE;
+ case Key::Exit: return VK_ESCAPE;
+ case Key::Redraw: return 'R';
+ default: return 0;
}
}
-void update_game() {
- switch (lvl) {
- case 0:
- intro();
- break;
- case 1:
- lvl1();
- break;
+void update_key_state() {
+ for (int i = 0; i < (int)Key::COUNT; i++) {
+ key_state[i] = GetAsyncKeyState(key_get_vk((Key)i));
}
}
-void enter_keys(std::string input, int delay) {
- for (int i = 0; i < input.size(); i++) {
- if (input[i] == 't') {
- press(VK_TAB);
- Sleep(delay);
- }
- else if (input[i] == 's') {
- press(VK_SPACE);
- Sleep(delay);
- }
- else if (input[i] == '~') {
- press_down(VK_LSHIFT);
- enter_keys(input.substr(i+1, 1), delay);
- press_up(VK_LSHIFT);
- i++;
- }
- else {
- int n = 0;
- int len = 0;
- while (input[i+len] >= '0' && input[i+len] <= '9') {
- n *= 10;
- n += input[i+len] - '0';
- len++;
- }
- for (int j = 0; j < n; j++) {
- if (input[i+len] == '~') {
- enter_keys(input.substr(i+len, 2), delay);
- }
- else {
- enter_keys(input.substr(i+len, 1), delay);
- }
- }
- if (input[i+len] == '~')
- i++;
- i += len;
- }
+void update_key_state_old() {
+ for (int i = 0; i < (int)Key::COUNT; i++) {
+ key_state_old[i] = key_state[i];
}
}
-void toggle_key_repeat() {
- WinExec("c:\\windows\\system32\\control.exe /name Microsoft.EaseOfAccessCenter /page pageKeyboardEasierToUse", SW_NORMAL);
- Sleep(500);
-
- enter_keys("6ts9ts7~ts13ts5~tss6ts", 10);
-
- Sleep(100);
+bool key_pressed(Key key) {
+ return key_state[(int)key] && !key_state_old[(int)key];
+}
- press_down(VK_CONTROL);
- press('W');
- press_up(VK_CONTROL);
+bool key_down(Key key) {
+ return key_state[(int)key];
+}
- Sleep(1000);
+bool key_up(Key key) {
+ return !key_state[(int)key];
}
-/*
- Todo:
- - Msg Box Intro
- - Multi Jump
- - more blocks/lvls
- - Set Accessibility
- - Lua?
- - Scrolling?
-*/
#ifdef CONSOLE
int main(int argc, char **argv) {
#else
int WinMain(HINSTANCE a0, HINSTANCE a1, LPSTR a2, int a3) {
#endif
- toggle_key_repeat();
- // Dies zu programmieren mit der reduzierten Inputrate.
- // Ist nicht angenehm. Ich werde es ändern.......
-
- // printf("%c", get_block(6, 23));
- // printf("%c", get_block(6, 24));
-
- ZeroMemory(&si, sizeof(si));
- si.cb = sizeof(si);
- ZeroMemory(&pi, sizeof(pi));
-
- // MessageBoxA(NULL, "Guten Tag.", "Spiel Name???", MB_OK);
-
- HRESULT hr;
- initializedirectinput8();
- createdikeyboard();
-
- load_level(0, false);
-
- MSG Msg;
+ start_notepad();
+ if (hwnd_notepad == NULL || hwnd_edit == NULL) {
+ puts("error");
+ return 1;
+ }
+ load_level(0);
while (true) {
- hr = keyboard->GetDeviceState(256, dikeys);
- if (keydown(dikeys, DIK_ESCAPE)) {
- TerminateProcess(pi.hProcess, 0);
- // MessageBoxA(NULL, "beendet...", "Schönes Wochenende.", MB_OK);
+ dt = ((double)clock() - game_clock) / CLOCKS_PER_SEC * 1000;
+ game_clock = clock();
+ update_key_state();
+
+ if (key_pressed(Key::Exit))
break;
- }
- if (keydown(dikeys, DIK_R)) {
+ if (key_pressed(Key::Redraw))
redraw();
- }
- keys[0] = keydown(dikeys, DIK_LEFTARROW);
- keys[1] = keydown(dikeys, DIK_RIGHTARROW);
- keys[2] = keydown(dikeys, DIK_UPARROW);
-
- if (keys[0] && !keys_old[0])
- press(VK_RIGHT);
- if (keys[1] && !keys_old[1])
- press(VK_LEFT);
- if (keys[2] && !keys_old[2])
- press(VK_DOWN);
-
- update_game();
-
- keys_old[0] = keys[0];
- keys_old[1] = keys[1];
- keys_old[2] = keys[2];
- keys_old[3] = keys[3];
-
- WaitForSingleObject(pi.hProcess, wait_time);
+ if (key_down(Key::Left) && !player.collision(-1, 0))
+ player.move(-1, 0);
+ if (key_down(Key::Right) && !player.collision(1, 0))
+ player.move(+1, 0);
+ if (key_pressed(Key::Jump) && player.collision(0, 1))
+ player.move(0, -1);
+
+ update_key_state_old();
}
-
- toggle_key_repeat();
-
- destroydikeyboard();
-
- // Close process and thread handles.
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
+ close_notepad();
return 0;
}
\ No newline at end of file |
