From b2052d191f64a39b8b5134db61fe2d5fb287542c Mon Sep 17 00:00:00 2001 From: sandyx Date: Mon, 2 Sep 2024 07:23:23 -0500 Subject: [PATCH] autosplitting --- build/controller.o | Bin 0 -> 1920 bytes build/gsl_reader.o | Bin 0 -> 1608 bytes build/main.o | Bin 0 -> 3424 bytes build/parser.o | Bin 0 -> 3600 bytes build/scanner.o | Bin 0 -> 2000 bytes build/timer.o | Bin 0 -> 3704 bytes src/controller.c | 29 +++++++++++++++ src/controller.h | 11 ++++++ src/gsl_reader.c | 11 ++++++ src/gsl_reader.h | 1 + src/main.c | 28 +++++++++++++-- src/parser.c | 86 +++++++++++++++++++++++++++++++++++++++++++++ src/parser.h | 14 ++++++++ src/scanner.c | 54 ++++++++++++++++++++++++++++ src/scanner.h | 11 ++++++ src/splits.h | 14 ++++++++ test/auto.gsl | 7 ++++ test/test | Bin 0 -> 15920 bytes test/test.c | 39 ++++++++++++++++++++ 19 files changed, 302 insertions(+), 3 deletions(-) create mode 100644 build/controller.o create mode 100644 build/gsl_reader.o create mode 100644 build/main.o create mode 100644 build/parser.o create mode 100644 build/scanner.o create mode 100644 build/timer.o create mode 100644 src/controller.c create mode 100644 src/controller.h create mode 100644 src/gsl_reader.c create mode 100644 src/gsl_reader.h create mode 100644 src/parser.c create mode 100644 src/parser.h create mode 100644 src/scanner.c create mode 100644 src/scanner.h create mode 100644 src/splits.h create mode 100644 test/auto.gsl create mode 100755 test/test create mode 100644 test/test.c diff --git a/build/controller.o b/build/controller.o new file mode 100644 index 0000000000000000000000000000000000000000..3b87275e001917f9845a4907b921664c44e06544 GIT binary patch literal 1920 zcmb_bPiqrV5TETI8{3$+Vj&XIJ&07$N79B01tn57K}3V72cd**+&0A|yX?L|D}smE zgY?pm(4!xtPz8^E3XV%VJ^q#8=x2RhO<#H&vEqCk^K-TS%?Q$k!(ra!*ZSY` zwRf*CXTA_uN_zR)E@HL*hkRTx=uglgQL8H}%l3TL?P|}nON(kzl^Xs+aiLsXDwS=& zbmJfpTY>h0b!%4B;?zu!@L#c5sJiuIF>s*C-|$!U~SDl8UbPF;m;;;dOL#CJ&_QX?nv-}Kor80e49WNnoBBDW=C*a5-Qy8XlD&nsDs$H#0%WE zqqMuFLA`La18OY{K{dTj2frFnT~E6Tzk%y`XU&%!Z*+Ug4?N!u^fsudgWGDX2M+Gw ze+Zr1LOo?Pt8lzy;O1K@V4m)*V(@RA*5Td9{lOIqfOUB-m?!XbN<3=+P{y^lG1|H-!%(V19J)RJqS ze+@CBn)UU6tY5|2wEgY#h049q{%E$$m;I&9MjGt%{O=T?OrcUsv!1?jb9V^A9{-^x X1qtD{1BAZwwEE8swg=4EG3);VBU{k* literal 0 HcmV?d00001 diff --git a/build/gsl_reader.o b/build/gsl_reader.o new file mode 100644 index 0000000000000000000000000000000000000000..bf080f483331a5646546a249880f9659bca03e20 GIT binary patch literal 1608 zcmbtT&1(};5T8w}jap;;I0#W$FMgmtvTfAbg9J)V5D`&4iL9ICHC^27F1s(#cu^1! zx%KFu;6?CHDD==jLyvkCp$8G_%@M^YVK2!M&1Y0gDB9Vd60h zP@b9KW(J#Z9OmK2i3>lUd?mu!ZI5@_)}%<0c;V+*CTABPR_0D z9H~q!$bJ6CGt9qw4Aw@~s?E=pH}UWs@}wkp=x4Q3eOpQ^Wx{_Esyhqc_oju+Oqpy2 z15X)z)(g4wsPvshxs1d#{^lQe=%<03NUtXo(FH&BmFo>vl*WOtAc(x4yXFTH`ck=} z+)!@dhZ5qUN_FGI+R|J}f9>UR+Tdx{%wIHk%4PnV!JF~6=5dd-%ZZ3|G*Dg#M5>b9 zt}{wx;0cAd1<~`A2cnavAiB|DfR7187%3_6ZQMwe*L|t|emE3y62&r6BM?~yx$dqd z-at-z{s*!#mv+zd;!;fwc(2SCcUZ#%ns1W>w6*n6UTFU)TI$2^@T}%9X`cTFnuZaB zf~6X!Tt|m${%gL2xm2@`Y6|ynm?UEE&vx11%+QafV_?o>>OO)w)B|q_{ZBgJk+y7j ze(ZM;P|adKUv!BBwJqj9M}FG=-spn7C)yw7az67@dt=;^{?HGINsgh?j*9t5G>_(h de9`$dUsE)_Pn|?m+&vw>*Y^+hBXdy9{|&3ymd^kH literal 0 HcmV?d00001 diff --git a/build/main.o b/build/main.o new file mode 100644 index 0000000000000000000000000000000000000000..d5c0ddd61f0890e3a47ea661565518b50f7ceef0 GIT binary patch literal 3424 zcmbuB?`s@I7{}+5)JCnBYy1_h+C@Pt*fp2N`U91_T$5aBkl3UsnsV9RZSKzA?Ou2H zNTM$qNf3`3(HEj`l;A5t5CvaYElnVOCu0AD)>joO718)Y3i0{Q&XbJW+rIIE*=Oc6 z&pglU?94NJdU$N4Basj+3Gt%XZZQ>N`qu4wMpiQ-C3?i4JrDhJW(UBt^4Uzbq+ajY zy8xPB{H;5``~s@K;t|@0Hu=R1-RpoiklYBv4%SnG3_$k?!OQwd%^rnLNUE+_;c1E3TcPQQwZ}(q8 zm;`ZrH;8W0DQ*d&_LTcdu8sz&dOww3Ev|fLVh>Zf z(5uZyt{t&qD)4WRh75#C93|b(&+!=kMhu^e;jI|{VGRE)hJP8ue~951V))N7{FfMh zErui2wOcn)x2ld=6gA5a3VvV(w%IStv0T3>x=!G^HR0KHH?YG#5mf88CyIerD>SU8 zZ_D8!B@3_Wl*M7E8oW|U^vfZ)6!hcf5=9gX`8j7g&Y`C0l#N+<+wQC5WKIx9}GYe zye|riz8~Zd2X~nMd_AyE2$S}8s4HCa?3!f;I4Ney3M^rs@O@!=E*daTn`vsY5fM6| z&4w_GZoN(yu`nG<04Ck4`>BggQP?g!O|#*-4ciOm)o{B~nDMN-&2#!6+MuzNvbN46 zyUM6amVwgI+_r}})-NOZkTQqncxIa;k+IVhC14<-}+Qz zk|<~~vAED+9xTKcA5?tsseSOJAS|TPHz|G6rxp|pej=41R*C0-=bqik%?5q&z@2;U z@1A?kxpO~e-WnJ>luo4tOG>;Tnk}Y6EbVOSIjQD^A$E&f9S{9Ea?GjyeK}3kng1zc zudSlrsr|~eecfJjYAbPb{z|6y^@&p}9bIQ(hVl7VoW&>67&#W(yi<>k(*WrbL$4}N zH)I{VyW!Nnl+D`D%~0Q5M($4S7aDW8c4fn`6GOF|r}8IPoWg10yL(uknlRR?RM0)cK)Y4)dNKOre85x03S-^2X%mqlteo7%f;duE9` zA0hsL>U#$DfRR0y&KsTcZ9|4RYIGKiY~IL-C#b7m+0COqWMt2$9i#JHTi!6|+tVj^ z8lC+{_Mnl;-$~u@8NrU^BRpO-vXPMqjO-cm7WcmoPVzP$Lq>Mm$V?bnSM~$763nMv z{I=ezudU_D#XG~>+9){ADdL?9BPR&n6FA;Ig!x|5!MV-#ql&{8!hFAMHTJ%2;nAZw zZi}QGkd1BPz9c05IVyV+^O9>s>@XG1k<^A9C9M@7Ar3z|WhvK?^dgm3_TCoU--3r* z@VPDco5YdNHL4+Uk5GM{N~?S>5QqI)wV~ynAtowrSoK0{OjO<1yh;>Wy~00T_N<-; zutgM1d1b3xSVIN*u%Y#c2`?(*m==AnEJ{_+n-ZnS^L^n5?zrp`C7fk3?fQN&CQ6~_ zj*HTmA5=Y2nTe{>L)n{+iU=vHQAm-BVH3;1$Wq8llWOe5T~z*BkL5wqA>g~IFvod= z==NB52=)*58ru&8lEA)$3iAm-65US_<4tj~E)d=R-55)b^b+IQk$TX#BR?Zy#$MaUh>5 zuE)Kk+4K8Z(Rl1dh_5vMhl=~H#yRe);(FX$nmzkBm4bCaVR4kgJg3^T8o#F6%Npl< zMOf9j>Bt?WnohH(BUf0X)vB<<01cSi7F{f3!SpnJ>xD&s0-i;m z?)}xs9h*|^iSmq93F%S^qd6K1hu&nd6uQ&6aQ_D}$p>ED9h$G4YNwMgjTrAEHph1k zYmsB1>Ph9$Q5y{B4RLs%^LO+y#d#m9;o_hcm$_PIZp!}*_|(TcYP{L7j1`X0*d_%& z+|R5hO)vb%`5&i2+o|a0%L)u9 zoszE4{|qt2*T=6aaPeQp`_$iR{V(FOCV5ppRqON|WK0zZP`n$$AsMYu^E?JT{;;Qk~$NvMru=wx* literal 0 HcmV?d00001 diff --git a/build/scanner.o b/build/scanner.o new file mode 100644 index 0000000000000000000000000000000000000000..0994e1abf24de62f67dfc649f0941f6a3f812f5e GIT binary patch literal 2000 zcmbtUL2DCH5PnH(8{3#hsZgls3aeDqC25P+g0iKlU8HEy3PP1-v)P)`BpY`(wH3ib zFNRp?&1+9y`~%{tP(l0$J$fwYLFr9|I`cBquFI+i2VQ38d*95wH*YpCretlaW_>s}Jes?bA64r4 zs}~4W7?fdnqAaWZwe2EqNz1n|#uf$xdWa6TR{rI&spZG2a~7y`=x9@Eo1u`+gj!BX$Dt zu6WDe1J8gs3-9AOPlWQzI|6nV7WOwP!vMtLlYnEM4GQ2sU=I-AB>bQk zzHQZNj;GnewknmPWiN@RR$!OSs#A5nRZ;g`+wpyKxoUcjRazFN=?B0v?edbjU@caJ z?*yjp)&kG1me>1i-a?u@s}Y!_Kfk@f8f7~ z;9OS;;aG#EKn7yCxPSPLD2#7P4}LU%wHjDO(1F+1Wwt!0VrhZ15(uqi1(wi?zArS} ztybad5?aj-91Xse%d(H;Kdv=2Xm#E3f>oi(3{Kfx@T{uC75_^s5RJ3l70IHL|2Be0 zXKN7lv4?tuXV8bv{px{ztiy9XK>YKB^Zx?D;tLxQjXA<{2^`EBjsHd@o^y`j`t0Yy zz??Y-NOSyX1n2s!$6=rCFjb8MW4N~f!#T$}3d<11&xS#;qvtOIhSX^M3dNWI5&sDG zr4PU2wD>SU*&Rv&blEzS^DZDgS}Aj@`lwr#rYZgywG zM}#&h7$=1UUwkr=2mb&}eCUHA)iPF%L^M3`q&4_a6B0^zp_EY1xpU6$X4oo;Cz*TB z`JJzO&%JkMcYJr^jiyjYFoncxqNXt_#Pr&lY)H`%5z!{@M4q~5x$mpjE!R=!y`@3| z#iY7mxe0aAyS?0_E_h4hJ%CQhA*s&K=5ku3{j|*TU-8!-A>Lc;`|k2@cb@ykTR!|4 zW<}*kZ@K@g+4GoxzqfR2#&ZAYPVTeZWoz>05q%|VO@+7b0AI`PQTz3o%QsHG(xb*g zK97cA&SBL$=ctO0D4{*>@4nbYPFBdfdvpQo=_?8MPbtX;C@^kTAwxoqc@GL%Re>?D zb^(%9qabfny$9nNK*vYAVAzVS>Cajn{){RS$ZJhrK4Q7o4|X4VZpk zr@CE>b>?%JLkRoIm2P3iF)c0rT2VxQSqpd^0qK9T>MySXz`SnEaUcDFbf3vJ zM{(DHp7xpSk4jiSVgJU^H7stgH1cU~@aBA6I<9%hy-gy#Yc=yG5I5H4;l06iA#RW> z^gO0rk(whJ@!Vd$E`HR#exsQP53CFX9#AoRQ$moBOa0QJ( zE_5%z(Ggi{re1L^fw6SJ^Y;T3Bq|FFA;u`aNf(G0B^J|;S7)3B`qVg zL_CIrF3Obwr!3OhER1L^7wt^SDWtN6%0S*0gF`YTH9R)#h)lka8A%P=4q_seDm!V= zGeaY(TzWWP^#!=(RJCHdQm*AG+2snva@w*}C{`7)*|j)lI5Sc;$$}gtr|Fc2#|Ci@ zMG%}E&O(TfVBJXAj%Il7<9iK=KlNe2@N6=^j`k&p57puL6M+3s)#3GdK3xU>YZd(V zD){%bkH~ONT=zyDUcat)2@lSHa1}g^!9eJbcaHNbAR}QIg-U&w9Ba5ix)s1DNIw+7 zFOYsZfb+d#JJ;oV^<}`H@72`+&iCqO09SYs)Mw6b5WYEpPY}K%fb+c)TKV{>lO6!> zlzcwKQpwJzHOD^Y2rZj-(n1?3mxWd;pn~qYrdQQW+36BmrZ74RUr3>i6&zcG@7)XX zB9T5gR?&*3LeVZc#~~22+e4{bDGk@=|B?a;aEZY;vjG@VE1eHtd-xrK??F5}20IYH z-r@^g)W7whqKMx-B>avcJp&Kofil7h0_Y4x>3jvo=i$MeLH9?E$M-4b#P38saXc-f zYU29L4X~iRvFhOqy)+?SFPm9sj^7)MkFf*sev0S&#%8X|`~VnOW*_8dgAE~L&=-HI z;Tq|paused) { + ghtimer_resume(timer); + } else { + ghtimer_pause(timer); + } +} + +void ctrl_start(GHTimer *timer) { + if (timer->running) { + if (splits != NULL) { + //splits_next(); + } else { + ghtimer_stop(timer); //stop or reset, save splits + } + + //pause timer if last split + if (splits == NULL) { + ghtimer_pause(timer); + return; + } + } else { + ghtimer_start(timer); + } +} diff --git a/src/controller.h b/src/controller.h new file mode 100644 index 0000000..4d0fbd5 --- /dev/null +++ b/src/controller.h @@ -0,0 +1,11 @@ +#ifndef CTRL_H +#define CTRL_H + +#include "timer.h" +//controller binds the timer to the splits +//and to the input handler +//and to the autosplitter + +void ctrl_start(GHTimer *timer); +void ctrl_pause(GHTimer *timer); +#endif diff --git a/src/gsl_reader.c b/src/gsl_reader.c new file mode 100644 index 0000000..2c5fd97 --- /dev/null +++ b/src/gsl_reader.c @@ -0,0 +1,11 @@ +//gsl_reader.c +#include "parser.h" + +void init_autosplit(const char *path) { + char *file_buffer = load_file(path); + char *line; + + for (line = get_next_line(file_buffer, 0); line != NULL; line = get_next_line(file_buffer, 0)) { + printf("%s\n", line); + } +} diff --git a/src/gsl_reader.h b/src/gsl_reader.h new file mode 100644 index 0000000..e7fb046 --- /dev/null +++ b/src/gsl_reader.h @@ -0,0 +1 @@ +#ifndef GSL_READER diff --git a/src/main.c b/src/main.c index 071e95f..c0ba708 100644 --- a/src/main.c +++ b/src/main.c @@ -1,23 +1,45 @@ #include #include "timer.h" +#include "controller.h" +#include "scanner.h" +#include + +GHTimer timer = {0}; char timer_string[50]; +int remote_state = 0; + +void control(void) { + static int last_state; + if (last_state != remote_state) + ctrl_pause(&timer); + + //printf("%d, %d\n", last_state, remote_state); + last_state = remote_state; +} + int main(int argc, char *argv[]) { InitWindow(640, 480, "Ghost"); SetTargetFPS(60); - GHTimer timer = {0}; - ghtimer_start(&timer); + set_control_func(control); + set_pid(17329); while (!WindowShouldClose()) { ghtimer_tick(&timer); ghtimer_timestring(&timer, timer_string); + + if (IsKeyPressed(KEY_P)) { + ctrl_pause(&timer); + } + + remote_state = watch_memory((void *)0x7ffc517105f4, 0); BeginDrawing(); ClearBackground(RAYWHITE); - DrawText(timer_string , 0, 0, 20, BLACK); + DrawText(timer_string , 10, 1, 100, BLACK); EndDrawing(); } } diff --git a/src/parser.c b/src/parser.c new file mode 100644 index 0000000..dc52261 --- /dev/null +++ b/src/parser.c @@ -0,0 +1,86 @@ +#include "parser.h" + +/* + I've separated this out into its own file + so it can be used anywhere, and be compiled + with any C standard that supports strtok_r. + +*/ + +size_t get_file_len(FILE *file) { + fseek(file, 0, SEEK_END); + unsigned int len = ftell(file); + fseek(file, 0, SEEK_SET); + return len; +} + +/* + loads a files and mallocates a buffer + and returns a pointer to it. + + remember to free the buffer when you're done. +*/ +char *load_file(const char *path) { + FILE *file = fopen(path, "r"); + if (file == NULL) { + printf("%s\n", "Could not open file."); + return NULL; + } + + size_t len = get_file_len(file); + + char *buffer = malloc(len); + + #pragma GCC diagnostic ignored "-Wunused-result" + fread(buffer, len, 1, file); + fclose(file); + return buffer; +} + +char *get_next_line(char* buffer, bool clear) { + static char* saveptr; + static char *line; + + if (clear) { + saveptr = NULL; + line = NULL; + return NULL; + } + + if (saveptr == NULL) { + line = strtok_r(buffer, "\n", &saveptr); + } else { + if (line == NULL) { + saveptr = NULL; + return NULL; + } + + line = strtok_r(NULL, "\n", &saveptr); + } + + return line; +} + +char *get_next_token(char *buffer, char *delim, bool clear) { + static char *saveptr; + static char *token; + + if (clear) { + saveptr = NULL; + token = NULL; + return NULL; + } + + if (saveptr == NULL) { + token = strtok_r(buffer, delim, &saveptr); + } else { + if (token == NULL) { + saveptr = NULL; + return NULL; + } + + token = strtok_r(NULL, delim, &saveptr); + } + + return token; +} diff --git a/src/parser.h b/src/parser.h new file mode 100644 index 0000000..cb3bd9f --- /dev/null +++ b/src/parser.h @@ -0,0 +1,14 @@ +#ifndef PARSER_H +#define PARSER_H + +#include +#include +#include +#include + +size_t get_file_len(FILE *file); +char *load_file(const char *path); +char *get_next_line(char* buffer, bool clear); +char *get_next_token(char *buffer, char *delim, bool clear); + +#endif diff --git a/src/scanner.c b/src/scanner.c new file mode 100644 index 0000000..b3406ff --- /dev/null +++ b/src/scanner.c @@ -0,0 +1,54 @@ +#define _GNU_SOURCE +/* + the idea of the scanner is that + you give it a memory address to watch + and it reads from the address and if it + matches the desired value, it sends + a message to a controller + + ideally to detect a loading screen + you would want to call the control function + on a state change rather than every time + the value matches +*/ + +//if linux +#include +#include +#include +#include + +//only watch one process at a time +static pid_t pid; + +//control function +static void (*callback)(void); + +int watch_memory(void *addr, int desired) { + int values[1]; + struct iovec local[1]; + struct iovec remote[1]; + + local[0].iov_base = values; + local[0].iov_len = 1 * sizeof(int); + + remote[0].iov_base = (void *) addr; + remote[0].iov_len = 1 * sizeof(int); + + int nread = process_vm_readv(pid, local, 4, remote, 4, 0); + + if (desired == values[0]) { + //printf("%d %d\n", values[0], desired); + callback(); + } + + return values[0]; +} + +void set_control_func(void (*c)(void)) { + callback = c; +} + +void set_pid(pid_t p) { + pid = p; +} diff --git a/src/scanner.h b/src/scanner.h new file mode 100644 index 0000000..d5c8645 --- /dev/null +++ b/src/scanner.h @@ -0,0 +1,11 @@ +#ifndef SCANNER_H +#define SCANNER_H + +#include +#include +#include + +int watch_memory(void *addr, int desired); +void set_control_func(void (*c)(void)); +void set_pid(pid_t p); +#endif diff --git a/src/splits.h b/src/splits.h new file mode 100644 index 0000000..2fd9c6c --- /dev/null +++ b/src/splits.h @@ -0,0 +1,14 @@ +#ifndef SPLITS_H +#define SPLITS_H + +#include + +typedef struct segment segment; +struct segment { + struct timespec realtime; + struct timespec gametime; + struct timespec best; + char *name; +}; + +#endif diff --git a/test/auto.gsl b/test/auto.gsl new file mode 100644 index 0000000..f8cca86 --- /dev/null +++ b/test/auto.gsl @@ -0,0 +1,7 @@ +auto + name: NameOfProcess.exe + addr: 0x1234123412341234 + init: 0 + test: 1 + func: split, pause +end diff --git a/test/test b/test/test new file mode 100755 index 0000000000000000000000000000000000000000..219c0ca93771b65590a34b56954ead1e6e40f104 GIT binary patch literal 15920 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 literal 0 HcmV?d00001 diff --git a/test/test.c b/test/test.c new file mode 100644 index 0000000..a412572 --- /dev/null +++ b/test/test.c @@ -0,0 +1,39 @@ +#include +#include +#include + +static pid_t pid; + +int main(void) { + unsigned int read_value = 1; + InitWindow(640, 480, "Test Window"); + SetTargetFPS(60); + char pid_buf[20]; + char adr_buf[20]; + + Color primary = WHITE; + Color secondary = BLACK; + pid = getpid(); + sprintf(pid_buf, "%d", pid); + sprintf(adr_buf, "%p", &read_value); + + while (!WindowShouldClose()) { + if (IsKeyPressed(KEY_SPACE)) { + read_value ^= 1; + } + + BeginDrawing(); + + primary = read_value ? WHITE : BLACK; + secondary = !read_value ? WHITE : BLACK; + ClearBackground(primary); + + DrawText(pid_buf, 0, 0, 50, secondary); + DrawText(adr_buf, 0, 50 + 1, 50, secondary); + + EndDrawing(); + } + + CloseWindow(); + return 0; +}