]> gitweb.ps.run Git - npengine/commitdiff
int working
authorPatrick Schönberger <patrick.schoenberger@posteo.de>
Sat, 26 Sep 2020 10:15:27 +0000 (12:15 +0200)
committerPatrick Schönberger <patrick.schoenberger@posteo.de>
Sat, 26 Sep 2020 10:15:27 +0000 (12:15 +0200)
Idee.txt
lvl/1.txt [new file with mode: 0644]
src/main.cpp [new file with mode: 0644]

index 5e45300693fa82d7c101f570d0d3c7b65c72b09b..e2c8aa618e5a754282b74a3cc687d3dcacd4eb26 100644 (file)
--- a/Idee.txt
+++ b/Idee.txt
@@ -1,28 +1,67 @@
-spiel, wo die gemeplay mechanics in der Nutzung von "Editor" bestehen.\r
-Eine 2D Karte (bsp. siehe unten), bei der manche Teile sichtbar und andere verborgen sind.\r
+spiel, wo die gemeplay mechanics in der Nutzung von "Editor"\r
+bestehen.\r
+Eine 2D Karte (bsp. siehe unten), bei der manche Teile sichtbar\r
+und\r
+andere verborgen sind.\r
 Das Level muss überwunden werden, ohne in den Abgrund zu stürzen.\r
 Das Level muss überwunden werden, ohne in den Abgrund zu stürzen.\r
-Bei der Durchquerung des Levels, bleibt dem Spieler nur ein 3x3 Sichtfeld, in jede Richtung 1\r
+Bei der Durchquerung des Levels, bleibt dem Spieler nur ein 3x3\r
+Sichtfeld, in jede Richtung 1\r
 und der Aufbau des Levels wird aufgedeckt.\r
 Auf Zeit.\r
 (Systemsteuerung -> Tastatur, Verzögerung auf kurz.)\r
 \r
 und der Aufbau des Levels wird aufgedeckt.\r
 Auf Zeit.\r
 (Systemsteuerung -> Tastatur, Verzögerung auf kurz.)\r
 \r
-----------------------------\r
-                            \r
-    Move with left/right    \r
-    Jump with up.           \r
-                            \r
-    Go, try it now.         \r
-                            \r
-    Stand on x.             \r
-    Jump over the hole.     \r
-                            \r
-    Jump into ? for ???.    \r
-                            \r
-    Finish lvl by reching O......................\r
-                            \r
-                            \r
-               ?   ?        \r
-                           O\r
-      xxxxx xxxxxxxxxx xxxxx\r
-     xxxxxx xxxxxxxxxx xxxxx\r
-----------------------------
\ No newline at end of file
+┌-------------------------------------------┐\r
+|                                           |\r
+|    Move with left/right.                  |\r
+|    Jump with up.                          |\r
+|                                           |\r
+|    Go, try it now.                        |\r
+|                                           |\r
+|    Stand on x.                            |\r
+|    Jump over the hole.                    |\r
+|                                           |\r
+|    Jump into ?? for ???.                  |\r
+|                                           |\r
+|    Finish lvl by reaching O               |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|               ?    ?                      |\r
+|                                           |\r
+|                                           |\r
+|            xxxxxxxxxxx    xxxxxxxxxxxxxxxx|\r
+|            xxxxxxxxxxx    xxxxxxxxxxxxxxxx|\r
+|      xxxxxxxxxxxxxxxxx    xxxxxxxxxxxxxxxx|\r
+|      xxxxxxxxxxxxxxxxx/\/\xxxxxxxxxxxxxxxx|\r
+└-------------------------------------------┘\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Editor Prozess starten.\r
+Tastatureingabe async.\r
+Rechts into Hoch (Sprung), danach muss Rechts bei Halten\r
+  wieder als Ausgabe gelten.\r
+durch präzises Timing Position im Lvl tracken.\r
+Interne Repräsentation, in Grafik darstellen.\r
+Bei Sprung, mit PfeilHoch, wird -> und Runter eingegeben, und\r
+  andere Bewegungen ausgeglichen.\r
+(Animation)\r
+Bei Loch Runter automatisch, andere Bewegungen ausgeglichen.\r
+-> Zurück zum Anfang.\r
+\r
+Bei ? ...\r
+\r
+Bei O ...\r
+\r
+Start:\r
+\r
+13 runter -> 0 0\r
+17 runter
\ No newline at end of file
diff --git a/lvl/1.txt b/lvl/1.txt
new file mode 100644 (file)
index 0000000..dfc622d
--- /dev/null
+++ b/lvl/1.txt
@@ -0,0 +1,27 @@
+┌-------------------------------------------┐\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|                                           |\r
+|            ?      ?                       |\r
+|                                           |\r
+|                                           |\r
+|           xxx    xxx                    O |\r
+|                                      xxxxx|\r
+|                                xxxxxxxxxxx|\r
+|      xxxxx   xxxxxxxxx    xxxxxxxxxxxxxxxx|\r
+|      xxxxx   xxxxxxxxx/\/\xxxxxxxxxxxxxxxx|\r
+└-------------------------------------------┘
\ No newline at end of file
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644 (file)
index 0000000..13778d5
--- /dev/null
@@ -0,0 +1,384 @@
+#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