Jak zrobić trainer (z ewentualną iniekcją dll) w Delphi?

Jak zrobić trainer (z ewentualną iniekcją dll) w Delphi?
0

witam :P od dawno się zastanawiałem nad napisaniem małego toola do gry ;p lecz nie wiem jak się do tego zabrać i tutaj mam kilka pytań ;P

  1. znam adresy z gry np. adres poziomu i teraz w jaki sposób mogę wysłać jakieś dane do tego adresu tak aby z 10 poziomu zrobił się 40, czyli wysłać do adresu dany tekst lub numer...?
  2. podobnie do up tylko że z przyciskami ;p one zapewne też mają swoje adresy czy dam rade z poziomu delphi klikać sobie te przyciski ?:D proszę o odpowiedzi i prosiłbym jak by ktoś miał jakiś tutotrial do tego co napisałem czyli wysyłanie danych do adresów z góry dziękuję.
edytowany 1x, ostatnio: olesio
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 5 godzin
  • Postów:2512
0

ad 1: Po kilku sekundach szukania w google:
Wstęp do programowania z użyciem gniazd
Rozdział 11

Daleko nie trzeba szukać...

0

to wszystko to o aplikacjach sieciowych a mi chodzi o zwykłą grę która nie łączy się z netem :D

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12166
0
  1. znam adresy z gry np. adres poziomu i teraz w jaki sposób mogę wysłać jakieś dane do tego adresu tak aby z 10 poziomu zrobił się 40, czyli wysłać do adresu dany tekst lub numer...?

Co to znaczy wysłać do adresu? W ogóle to o jaki adres Ci chodzi? Adres w pamięci masz? Poza tym jeżeli chcesz zrobić narzędzie do tibii albo podobnej to Ci się nie uda, bo informacje takie jak Level i podobne są nie u Ciebie na dyksu, a na sarwerze do którego raczej dostępu nie będziesz miał nigdy; Jeżeli zaś te informacje są w pamięci na Twoim komputerze, wystarczy znać podstawowe funkcje do czytania i zapisywania danych w pamięci;

  1. podobnie do up tylko że z przyciskami ;p one zapewne też mają swoje adresy czy dam rade z poziomu delphi klikać sobie te przyciski ?

Tobie widzę wszystko się już kojarzy z poziomami... Wszystko ma swój adres w pamięci, ale do klikania na jakieś buttony raczej przydało by się zrobić symulacje poruszania mychą; Jeżeli przyciski są ciągle w tym samym miejscu łatwo odczytać współrzędne takiego przycisku; Później to tylko kwestia oprogramowania myszki tak, by klikała w daną współrzędną o określonej częstotliwości;

Poza tym: Korzystanie w grach z botów, modów, cheatów i innego gówna jest nieuczciwe względem innych graczy i łamie podstawowe zasady regulaminu gry; Zastanów się nad tym;


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
0

no nie chce pisać żadnego bota do Tibii !... gra jest na kompie i nie wczytuje danych z bazy danych... znam adres np. Nazwy Gracza i chcę tam wstrzyknąć swoje dane za pomocą delphi... :D

H4
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 lata
  • Postów:107
0

Nie znam się na delphi, ale jestem pewien, że chodzi Ci o funkcje w stylu MemoryWrite / MemoryRead

Odnośnie klikania na przyciski - nie, nie da rady zrobić tego tym co napisałem tobie wyżej

Da się przywołać funkcje z gry, ale jest to bardzo wysoka szkoła jazdy (przede wszystkim debugging, OllyDbg jest do tego najbardziej zaawansowanym programem. Dla laików został stworzony Cheatengine, ale nie wiem, czy tego na nim dokonasz. Musiał byś znać adres funkcji, jej parametry, ich typ... jeżeli nie masz pojęcia o "inżynierii wstecznej" aka Reverse Engineering, to się za to nie bierz i ogranicz do manipulacji pamięcią).

Przykład zaawansowanego bota korzystającego w owy sposób
http://www.assembla.com/code/d2bs/subversion/nodes

Edit: (tu mowa o C++) Za pomocą SendMessage nie zedytujesz pamięci, nawet wysyłanie klawiszy, np. by otworzyć ekwipunek nie zadziała bo nie jest to traktowane jako fizyczne wciśnięcie klawisza (co niektóre gry weryfikują), do tego trzeba użyć SendInput

Edit2: Bawiłem się tym kiedyś trochę, i nie czuję się przez to bardziej doświadczonym programistą. Napisanie prostego bota to wbrew pozorom nie jest coś wybitnego

edytowany 3x, ostatnio: Hell4Ge
0

nie wiem nie rozumiem tego... wiem jak wyswietlic dane z adresu na labelu, ale jak tam coś wstrzyknąć to nie wiem ...

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Oczywiście, że da się zrobić to co chcesz w Delphi. Nazywa się to Trainer. I w googlach jest mnóstwo przykładów, rownież w Delphi, które można bardzo łatwo znaleźć, a które pokazują jak napisać trainer - jeżeli znamy konkretny adres. Można posłużyć się rownież programem "Cheat Engine" i dodatkowo metodą wyszukiwania Pointerów (wskaźników na adresy danych złota, energii, żyć czy czego tam chcesz w pamięci), która jest pokazana również na kilku filmikach do znalezienia na YT (polecam te zagraniczne, bo Polacy jak robią jakiś video tutorial to często na poziomie gówniarzerii ze jakiś tam spryciarzy.pl). Także minus ode mnie za totalne lenistwo i brak chęci poszukania tego w googlach samodzielnie. Na pocieszenie dorzucam exek (uwaga do użytkownika o inicjałach t.r - w rarze jest exek, mały, ale wiem że ci mama nie pozwala pobierać takich, więc nie rób tego) wraz ze źródlem w Delphi - wszystko pisane w WinAPI. Później jak napiszę, bo wcześniej nie miałem pojęcia o tym, że można tak wyszukiwać i zmieniać pointery robiąc trainer na zasadzie injekcji dllki do procesu z grą to też tutaj wrzucę. Wracając do mojego trainera. Jest on do starej dosowej gry Horde, ktorą można pobrać z: http://staregry.pl/?c=_gv&i=751 i należy ją uruchamiać pod emulatorem DosBox najpewniej na standardowej konfiguracji aby się nie ciął dźwięk i animacja. Sam DosBox do pobrania oczywiście z: http://www.dosbox.com a cały trainer działa banalnie, wyszukuje w pamięci procesu unikalnego ciągu bajtów, który można ustalić przez baczne przyglądanie się zawartości zdumpowanej do pliku pamięci i wyszukiwaniu charakterystycznych ciągów hexów w pobliżu adresów gdzie znajdują się wartości złota oraz energii dla konkretnej gry, a co pomaga ustalic właśnie Cheat Engine. Później do tego znalezionego adresu dodaje określoną stałymi ilość bajtów do przesunięcia, dzięki czemu zawsze trafi w przypadku gry Horde na właściwe dane. I jakby był problem z samą grą, to znaczy "cieła się" pod DosBoxem, to dołaczam też swój config. Należy sobie utworzyć katalog Horde, w nim katalog GAME i tam rozpakować grę, następnie w katalogu Horde utworzyć katalog DosBox, wrzucić tam najnowszego DosBoxa, bez pliku dosbox.conf jeżeli mamy go w katalogu, następnie wrzucić ten mój plik a.conf, do tego w Horde jakiś plik *.bat na przykład run.bat, do którego możesz zrobić skrót (jak coś ikonkę do skrótu możesz wziąć sobie z mojego trainera w pliku app_icon.ico). Wygląd przykładowego run.bat:

Kopiuj
@echo off
cd DOSBOX
start dosbox.exe -conf a.conf
cd ..

Jeszcze słowo o trainerze, jak widać jest to zwykłe Read i Write ProcessMemory tylko, że trainej zrobiony w WinAPI aby exek do tak prostego zadania nie zajmował setki kb. Exek jest upxnięty, a okno dialogowe do zasobów przygotowałem w: http://www.oby.ro/rad_asm/resed/index.html i kod korzysta ze zoptymalizowanych modułów System oraz Windows do pobrania z http://kolmck.net/sys/SysDcu7.zip (tylko dla Delphi 7). A i poza tym jeżeli zadajesz takie bzdurne pytania jak "wysyłanie message do adresu w pamięci" to podejrzewam, że nie będziesz chciał się z ów kodu nic nauczyć, dlatego polecam Tobie raczej dowiedzieć się, że komunikaty śle się do okien, a nie do adresów pamięci, a dla Ciebie najprościej będzie zobaczyć w filmikach na YouTube jak używać Cheat Engine i najlepiej metodą z Pointerami i pod nim oszukiwać. Sorry za rozpiskę, a trainera miałem nie publikować, ale może komuś się przyda. Procka do wyszukiwania w pamięci działa w miarę szybko, bo operuje na pamięci, a konkretnie na jej fragmencie, nie zaś na jakimś dużym pliku na dysku. Oczywiśćie jej kod po przeróbkach znalazłem kiedyś na google i zaadoptowałem. Może komuś jeszcze poza pytającym się przyda ten kod trainera oraz konfiguracja DosBoxa dla tej konkretnie gry.

EDIT: a teraz widzę, że dopisałeś coś o wstrzykiwaniu, to zastanów się, czy chcesz robić Trainer z użyciem Read/Write ProcessMemory praz ewentualnym wyszukiwanem podobnych bajtów w celu ustalenia zmiennego adresu dla danych, czy chcesz wstrzykiwać dllkę, bo i to da się zrobić, a trzeba to robić w przypadku korzystania z Pointerów jako adresów ilości rzeczy w grze (jak życia czy złoto w przypadku Horde). Kod na wstrzyknięcie później moge napisać i wrzucić tutaj. Dodam tylko, że przydaje się tutaj moduł o nazwie afxcodehook.pas do wstrzykiwania dllki w proces. Samo ustawianie Pointerów również do znalezienia w google albo na video tutorialu na Youtube, w którym gościu w dużym przyśpieszeniu pokazuje jak pisze taką dllkę dla jednej gry, tylko że do wstrzykiwania używa jakiegoś badziewia, które w google można znaleźć na wielu stronach, ale ponoć zawirusowane, także temu narzędziu nie za bardzo ufam, wolę napisać swój kod z użyciem wspomnianego modułu, o którym też się dowiedziałem z google. Wystarczy tylko chcieć i wszystko można znaleźć, ale Tobie się pewnie nie chciało, bo po co - lepiej od razu smarować posta tutaj ;/


Pozdrawiam.
edytowany 3x, ostatnio: olesio
Riddle
A już chciałem pobrać :(
0

poke, peek ... to były czasy, ech :)

olesio
Nadal można je powspominać, na przykład dla ZX Spectrum są emulatory które używają gotowych plików poke'ow dla gier i są strony - bazy danych z takimi poke'ami do pobrania.
0

no dzięki olesio własnie szukam jakiegoś tuta tu znalazłem coś: http://www.gamerzplanet.net/forums/rumble-fighter-hacks-trainers-downloads/464415-how-to-create-dll-trainers-in-delphi-7-a.html może mi to pomoże ;p dzięki za pomoc może uda mi się coś znaleźć.

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

A no to jednak chcesz wstrzykiwać kod. To ja pokaże na szybko kod, który jest taką "wprawką" w celu sprawdzenia czy się da. Również dla gry Horde. Kod exeka: Button1 -wstrzykiwanie ładując z pliku, Button2 - wstrzykiwanie, odczytując dllkę z zasobów (zasób o nazwie adll jak widać:

Kopiuj
//...
var
  Form1 : TForm1;
  APid : Cardinal;

implementation

{$R *.dfm}

function ProcessExists(ExeFileName : string; var PIDResult : Cardinal) : boolean;
var
  ContinueLoop : BOOL;
  FSnapshotHandle : THandle;
  FProcessEntry32 : TProcessEntry32;
begin
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  Result := False;
  while Integer(ContinueLoop) <> 0 do
  begin
    if ((AnsiUpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      AnsiUpperCase(ExeFileName)) or (AnsiUpperCase(FProcessEntry32.szExeFile) =
      AnsiUpperCase(ExeFileName))) then
    begin
      Result := True;
      PIDResult := FProcessEntry32.th32ProcessID;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
  if ProcessExists('dosbox.exe', APid) then
  begin
    InjectLibrary(OpenProcess(PROCESS_ALL_ACCESS, False, APid),
      ExtractFilePath(Application.ExeName) + 'Project2.dll');
  end
  else
  begin
    ShowMessage('Cannot find dosbox.exe process!');
  end;
end;

procedure TForm1.FormClose(Sender : TObject; var Action : TCloseAction);
begin
  UninjectLibrary(OpenProcess(PROCESS_ALL_ACCESS, False, APid),
    ExtractFilePath(Application.ExeName) + 'Project2.dll');
end;

procedure TForm1.Button2Click(Sender : TObject);
{$R test.res}
var
  ResPtr : Pointer;
  HGlobal, HResInfo : THandle;
begin
  if ProcessExists('dosbox.exe', APid) then
  begin
    HResInfo := FindResource(HInstance, 'adll', RT_RCDATA);
    HGlobal := LoadResource(HInstance, HResInfo);
    ResPtr := PChar(LockResource(HGlobal));
    InjectLibrary(OpenProcess(PROCESS_ALL_ACCESS, False, APid), ResPtr);
  end
  else
  begin
    ShowMessage('Cannot find dosbox.exe process!');
  end;
end;

Oczywiście wszystko z wykorzystaniem modułu: afxcodehook.pas
Sama dllka - póki co to tylko test, procedura nazwana SelectMe, bo do Cheat Engine - o ile dobrze widziałem, da się wstrzyknąć tylko dllkę, która ma jakąś funkcję exportowaną i tę funkcję należy wybrać z listy.

Kopiuj
library Project2;

uses
  Windows;

function _FormatC(const Format : string) : string; cdecl;
const
  StackSlotSize = SizeOf(Pointer);
var
  Args : VA_List;
  Buffer : array[0..1024] of Char;
begin
  Args := VA_List(PAnsiChar(@Format) + ((SizeOf(Format) + StackSlotSize - 1) and not (StackSlotSize - 1)));
  SetString(Result, Buffer, wvsprintfA(Buffer, PChar(Format), Args));
end;

var
  FormatC : function(const Format : string) : string; cdecl varargs = _FormatC;

procedure SelectMe; stdcall;
const
  Gold_Pointer = $74B6B0;
  Gold_Offset = $1B1E98;
  Energy_Pointer = $74B6B0;
  Energy_Offser = $1BA966;
var
  v : integer;
begin
  PDWORD(PDWORD(Gold_Pointer)^ + Gold_Offset)^ := 666;
  v := PDWORD(PDWORD(Gold_Pointer)^ + Gold_Offset)^;
  MessageBox(0, PChar(FormatC('%d', v)), 'Test dll', MB_ICONINFORMATION + MB_OK);
end;

begin
  SelectMe;
end.

U mnie jest dla kodu powyżej - bez exportów tylko od razu zostaje uruchomiona ta procedura. Powodzenia. I zawsze samodzielnie najpierw poszukaj zanim zapytasz na forum. I później całość przepiszę na WinAPI - korzystając z okien i części kodu trainera z WinAPI, tylko że będzie on w dllce.

EDIT: dołączyłem ten moduł do tego posta, bo jest ładnie przeformatowany i usunięte zostały z niego komentarze z dziwnymi znakami, chyba po rosyjsku albo może i po chińsku. Poza tym zmieniłem temat tego wątku na bardziej odpowiadający żeby łatwiej można było go znaleźć w przysłości, dodałem też tagi.


Pozdrawiam.
edytowany 3x, ostatnio: olesio
0

dziękuje... Za pomoc, nie spodziewałem się aż takiej pomocy ale dziękuje. teraz pytanko mam bo zapomniałem co dodać do uses... podswietla się TProcessEntry32

teraz podswietla mi się "InjectLibrary" ale z tym już sobie nie poradzę... proszę o pomoc.

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Jaja sobie ze mnie robisz? Chyba tak, bo po adresach IP widze, że to ta sama osoba. Napisze wprost: jazda do kompendium i poczytaj o podstawach plus nauka używania google. Fakt, nie wkeiłem całego kodu mojego unit1.pas ale skąd ja mogłem przypuszczać, że ktoś nawet z gotowców nie umie skorzystać. Podpowiem dla tych funkcji z wyszukaniem procesu TlHelp32, a dla InjectLibrary tak jak pisałem afxcodehook - który musisz pobrać i wrzucić do katalogu z projektem. Bez podstaw języka będziesz błądził po omacku, wroć jak je ogarniesz i będziesz miał na prawdę z czymś konkretnym problemy. Ja rozumiem każdego początki, dział Newbie i tym podobne, ale bez przesady. Widzisz, Ty się nie spodziewałeś tutaj pomocy, ja jej mogłem Tobie udzielić, bo tak wyszło że ostatnio sam się bawiłrm w Delphi w robienie trainerów i ich udoskonalanie oraz kombinacje z Pointerami pod Cheat Engine. Ale nie myślałem, że Ty otrzymując pomoc nie będziesz nawet z gotowców umiał skorzystać ;/ Chociaż siedząc ponad trzy i pół roku na tym forum oraz regularnie czytając posty dotyczące Pascala / Delphi powinienem to przewidzieć ;( A i jak już się tak produkuje. Patrz, jak nie ma w helpie informacji o jakimś elemencie, którego nie ma w uses to robisz tak, w google wpisujesz na przykład: delphi TProcessEntry32 i po znalezionym gotowym kodzie w pierwszym wyniku wiesz jakiego modułu Ci może brakować.

EDIT: no wątek się zidenxował w google, ale póki co najszybciej go można znaleźć z parametrem site:4programmers.net/Forum, ale teraz informacje o przykładowym trainerze jak i sposobie na injeckcje dllki są podane na tym forum w jednym miejscu. A ja musiałem sobie ponarzekać, coż tak miewam, bywam marudny, ale nie inreal raczej, tylko na forum, bo chciałym żeby każdy pytający czasami wykazał się odrobioną samodzielności zanim zada pytanie :) A i może w przyszłości skrobne artykuł jak zrobic Trainer w Delphi oraz WinAPI, tylko nie wiem czy będzie na taki tekst zapotrzebowanie.


Pozdrawiam.
edytowany 8x, ostatnio: olesio
0
olesio napisał(a)

tylko nie wiem czy będzie na taki tekst zapotrzebowanie.

Ja się piszę na poczytanie ;)

olesio
Ok, to pomyślę nad tym, może coś po nowym roku, bo teraz mam mało wolnego czasu. A póki co to, co dołączyłem do tego posta musi potencjalnym zainteresowanym wystarczyć.
H4
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 lata
  • Postów:107
0

Skoro jest tu osoba, która się w tym zakręciła, to zapytam, bo co prawda to napisała, ale nieco ogólnie

W przypadku dynamicznego adresu (np na 600 hp), jego statyczny adres to jest adres zawierający wskaźnik? np.

...
006FABD2 000BD384 // 006FABD2 statyczny adres
...
...
000BD384 600
...

ew.

...
006FABD2 000BD384
...
000BD384 01808978
...
01808978 600
...

Wspomniałeś też o dodawaniu do adresu procesu (to jest chyba zwracane przez handle'a) pewnej wartości w celu odczytaniu innej, czy to by było coś w stylu

Kopiuj
HANDLE hwnd = 6FAB8C; // na sucho bez użycia FindWindow czy innych temu opcji

int life = hwnd + CF4; // Taki zapis dobrze określa to co napisałem ponad kodem? Czy nie do końca? Skąd CF4?

Wiem, że to jest napisane, ale trochę enigmatycznie (troszkę)

edytowany 1x, ostatnio: Hell4Ge
olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Na C++/C nie znam się prawie wcale, ale masz źródła w przejrzystym i prostym Delphi to sobie zobacz co i jak. Kwestia Pointerów jest pokazana na YouTube na tym: i wielu innych filmikach. A i chyba Ty nie myślisz - co robisz, bo coż ma wspólnego adres na przykład żyć w pamięci z uchwytem do okna aplikacji? Uchwyt okna to jedno, z niego możemy pobrać PID na przykład przez GetWindowThreadProcessId(hHwnd, pPid);, a adres w pamięci to drugie. Nie ogarniasz takich kwestii, to korzystaj z Cheat Engine, będzie Tobie łatwiej niż pisać trainer od zera, w czym nie pomogę, bo widzę że chcesz skorzystać z innego języka niż znane mi Delphi. Poza tym jeżeli chcesz operować na Pointerach, tak jak to pokazałem w późniejszym moim postcie to jeśli się nie mylę - potrzebna Ci będzie odpowiednio napisana dllka oraz program do jej wstrzyknięcia (można to zrobić przy użyciu Cheat Engine oraz polecenia w oknie "Memory View" (odpowiednia opcja jest w menu "Tools"). Tylko ważne żeby dllka miała jakieś exporty. Albo też możesz po prostu dodać odpowiednio Pointery i ładować sobie pliki *.ct po wybraniu procesu danej gry, którą chcesz oszukać.


Pozdrawiam.
olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Odświeżam szybko wątek, bo bawiłęm się nie mogąc spać pół nocy i trochę teraz żeby "dopieścić" oba trainery. Także dołaczam je do tego posta. W pliku horde_trainer.rar kod i exek trainera wyszukująegoy po charakterystycznym ciągu bajtów w pamięci procesu. Jest on ciutke wolniejszy i inaczej odświeża energię po zamrożeniu. Natomiast w archiwum horde_trainer_v2.rar jest trainer, który w zaosbach ma dllkę a_trainer.dll i ją wstrzykuje w proces DosBOX'a. Dałem na sztywno adres $400000 ale można ModuleHandle ustalić kodem pokazanym między innymi w postach w tym wątku: http://forum.cheatengine.org/viewtopic.php?t=533598 - można ławo funkcję do pobierania Pid'a z nazwy procesu przerobić na pobieranie nazwy procesu z istniejącego Pid'a. Mam nadzieję, że kod jest jasny. Niestety trainer z iniekcją dllki zrobiłem tak jak umiałem żeby w ogóle działał, ponieważ wcześniej podawając na sztywno adresy Pointerów i Offset dla energii gracza miałem zamrożenie poruszania gracza w fazie walki (klawisze do wyjścia z rozgrywki, ładowania oraz opcji i sama pauza działąły, ale gracz nie poruszał się w ogóle, podejrzewam że to jakieś zabezpieczenie które mogło działać w samych trainerach dosowych albo coś źle robiłem, jak ktoś chce może się pobawić i ewentualnie zmienić kod jak mu zadziała to ok może się tutaj pochwalić). Faktyczny adres do Pointera energii ustaliłem wyszukując ten uniklny ciąg bajtów z kodu horde_trainer i dodałem do niego $8ADE. Taki sposób zadziałal, bo wcześniej ustawiając energię po wyszkaniu offsetów nie zawsze się ona chciałą zmienić na ustawioną pod Cheat Engine wartość. Kto ma chęć może sobie mój kod przetłumaczyć na C/C++ jeżeli mu nie pasuje Delphi, ale nie wiem czy uzyska pod kompilatotami C/C++ mniejsze pliki wykonywalne lub bardziej optymalny kod, ale nikomu nie bronię kombinowac. Ja stworzyłem ten trainer tak jak umiałem i tak by działały prawidłowo. Enjoy it :)


Pozdrawiam.
edytowany 1x, ostatnio: olesio
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)