Crearea pentru vice-oraș

Crearea de misiuni pentru GTA Vice City.

Crearea pentru vice-oraș

Structura scenariului misiunilor.
Condiționat, tot codul este împărțit în 4 blocuri
1. Blocul de memorie este doar o linie - DEFINE MEMORY și apoi există cantitatea de memorie rezervată în octeți.
2. Unitatea pentru determinarea obiectelor 3D, începând cu linia DEFINE OBJECTS 204 - 204 este numărul total de obiecte. În continuare este definirea obiectelor înseși - DEFINE OBJECT și numele obiectului.
De ce să definiți obiectele din cod. pentru a le controla, de exemplu, poarta de pe insula StarFish este închisă inițial, iar apoi în timpul jocului se deschid.
3. Blocul de definire a misiunii, DEFINIȚI MISIUNILE - numărul total al misiunilor și o listă ulterioară de misiuni și indicatori la marcă cu începutul misiunii. DEFINIȚI MISIUNEA 1 LA MISIUNEA 1 - această linie definește o misiune cu numărul 1 de pe etichetă: Mission1.
4. Blocul de cod propriu în acest bloc este deja scris codul misiunilor.

Acum despre structura echipelor.
03CB: setarea camerei $ X $ Y $ Z - această comandă va seta aparatul foto la coordonatele date.
03СБ: - opcode.
setați camera - comandă, ignorată de compilator.
$ X $ Y $ Z - parametrii, în acest caz coordonatele camerei.
Așa cum este descris mai sus comanda in sine este ignorat de compilator, care este, pentru Compilator 03CB: set camera de $ X $ Y $ Z și 03CB: $ X $ Y $ Z este același. De ce, atunci, avem nevoie de comenzi în sine, dar foarte simplu pentru comoditate, este mult mai ușor de reținut decât un opcode de comandă. Scriem camera setată, apăsați F1 și opcodul și parametrii sunt atașați ei înșiși.

Variabile.
Toate limbile de programare la nivel înalt utilizează variabile
și Mission Builder nu reprezintă o excepție. Variabilele din acesta sunt notate cu $. De ce sunt din nou necesare variabile pentru comoditatea scrierii codului. De exemplu, mai sus, vedeți următoarea linie 03CB: set camera de $ X $ Y $ Z - sunt coordonatele camerei definite în variabila $ X $ Y $ Z, puteți scrie un așa - 03CB: set camera 3.0 1.0 4.0, dar dacă continui veți utiliza aceste coordonate, este mai ușor să le includeți în variabile:
0005: $ X = 3,0. această comandă stabilește că variabila $ X va fi egală cu 3.0
0005: $ Y = 1,0. această comandă stabilește că $ Y este 1.0 și așa mai departe.
În plus, toate operațiile matematice, adăugarea, divizarea pot fi efectuate numai cu variabile. Variabilele constau nu numai din numere, ci, în general, din orice obiecte,
009A: $ ACTOR1 = create_actor 4 #COP la 1.0 1.0 1.0 - Cu această comandă am creat un polițist cu variabila $ ACTOR1.

Operații matematice.
Cu variabilele, am tratat acum operațiile matematice.

Crearea pentru vice-oraș

În constructorul de misiuni, coordonatele sunt utilizate peste tot. Creați un jucător introduceți coordonatele, trimiteți o roabă care ar merge acolo din nou, coordonatele. Instrumentul Player Pos salvează poziția actuală a jucătorului apăsând butonul F4. descărcare


În MB, se folosesc două tipuri de numere:
Integer - numere întregi. 100 este un număr întreg.
Float este un număr în virgulă mobilă, 3,0.
Opcodele pentru lucrul cu diferite tipuri de numere sunt diferite.
0004: $ X = 10, determinăm că variabila $ X este de 10.
0008: $ X + = 5, adăugați la variabila 5 total 15.
0010: $ X * = 2, înmulțit cu două pentru un total de 30.
000C: $ X - = 10, scade 10 total 20.
0014: $ X / = 4, împărțiți cu 4 în total de 5.
Acum, opcodurile pentru numerele cu virgulă mobilă.
0009: - Adăugare.
000D: - scăderea.
- Multiplicare.
0015: Diviziune.

Tipuri utilizate în MB.
Aici vom examina tipurile de note care sunt folosite în MB.
Un tip pe care deja îl știm, semnul $ denotă variabilele.
Este folosit un alt tip de variabile, marcat cu semnul @. Se utilizează pentru valori pe 16 biți, în principal în cronometre interne. Numele variabilei poate fi numeric, adică nu CAR @ și PED @, numai numere.
0006: 2 @ = 100, setați variabila 2 @ cu valoarea 100.
Introduceți JJ - acesta este modul de a trece la o etichetă oriunde în cod.
0002: salt JLabel1, du-te la etichetă: Label1
Tip J - indică un salt la o etichetă numai într-un anumit bloc.
Semnul # indică mașini, pede, arme.
Cu un semn de trecere la eticheta - J, o mulțime de hemoroizi, este conectat cu codare pentru Windows, nu numai pe Windows 9x, se pare, în general, pe un altul, este mai bine pentru a copia marca rândul anterior sau să nu fie în măsură să compileze codul.

Acum, când aveți un concept general de tipuri, variabile, vom scrie misiunea noastră simplă. Misiunea va fi că va fi necesar să depășească polițistul obsozevschego în cursa.
De asemenea, cursa poate fi câștigată prin ruperea mașinii adversarului. Cursa va avea loc pe insula StarFish. Run VC Mission Builder, dacă ați lansa pentru prima dată, este necesar să se specifice dosarul cu vice-City.Chtoby nu scrie tot codul de la zero, vom lua baza dosarului în care taie toate misiunile poveste, apăsați Ctrl + O și deschide fișierul Stripped_complete.txt care este în MissionBuilder \ folderul script Stripped. În primul rând, trebuie să adăugăm misiunea noastră la blocul de misiune. Din meniul Edit, selectați Căutare (căutare) și în fereastra deschisă scrie DEFINE MISIUNI, acum am găsit un loc în care misiunea definită. Modificarea numărului total de misiuni DEFINE MISIUNI 2 și după adăugarea de 0 DEFINE linie misiune cu misiunea noastră, DEFINE MISIUNE ЈЈMyMission 1 AT. Așa că am arătat că misiunea noastră va fi pe marcă. MyMission.
Du-te la sfârșitul fișierului, și înainte de linia 004E: end_thread, adăugând doar o singură linie - 0417: începe misiunea 1, așa că vom începe misiunea noastră. Și acum cel mai interesant lucru este codul misiunii noastre.
Noi scriem: MyMission - semnul de început al misiunii. Crearea unui nume MISIUNE flux de misiune, 03A4: name_thread „MISIUNEA“, asigurați-vă că pentru a crea un flux ca memoria necesară este alocată atunci când îl creați. Facem o mică întârziere de 1000 ms - 0001: așteptați 1000 ms. apoi ia player-ul la începutul cursei 0055: put_player $ PLAYER_CHAR la -273.507 -489.287 10.063. $ PLAYER_CHAR - doar se referă la player-ul și apoi du-te la coordonatele axele X, Y, Z.Teper nevoie pentru a crea o mașină pentru noi și adversarul și adversarul însuși, oborzevschego politist :) face o cerere pentru un model.
: SolicitareModeluri; marca
0247: model cerere #DELUXO; cereți un model al mașinii Deluxo
0247: model cerere #COP; cereți un model de polițist
în plus, este necesar să se verifice dacă există astfel de modele în general.
: CheckCars
00D6: dacă 21; dacă
8248: NOT model #DELUXO disponibil; modelul Deluxo nu există
8248: NOT model #COP disponibil; și modelul Co nu există
004D: jump_if_false ЈCreateCars; dacă există
0001: așteptați 0 ms; întârziere
0002: sari ЈCheckCars; mergeți la etichetă: CheckCars
Vom analiza acest bloc în mod mai detaliat dacă modelele unei roabe și a unui polițist există apoi la următoarea etichetă, dacă nu există, atunci reveniți la începutul blocului și totul se repetă. Dacă observați dacă aceasta este 21, deoarece verificăm 2 condiții simultan. Apoi, noi creăm mașini și polițiști.
: CreateCars
Curățăm teritoriul în care vor fi create mașinile.

0395: suprafața clară 1 la -274.309 -486.170 intervalul 10.0 10.0
de fapt, creăm mașini
00A5: $ PLAYER_CAR = create_car #DELUXO la -274.309 -486.170 10.071
00A5: $ OPP_CAR = create_car #DELUXO la -272.837 -476.868 10.095
Așa că am creat două roițe Deluxo, în variabila $ PLAYER_CAR - mașina aparatului și în $ OPP_CAR - mașina adversarului. #DELUXO - stabilește că trebuie să creați o roată Deluxo și nu altceva. În principiu, puteți înlocui numărul # PCJ600, atunci cursa se va desfășura pe motociclete, doar nu uitați solicitările, iar în test, puneți # PCJ600.
Apoi rotim roabele la nouăzeci de grade.
0175: set_car $ PLAYER_CAR z_angle_to 90.
0175: set_car $ OPP_CAR z_angle_to 90.0
creați un polițist în spatele volanului unei roabe $ OPP_CAR
0129: $ OPP_COP = create_actor 4 #COP in_car $ OPP_CAR driverseat
în continuare stabilim proprietățile unei roabe.
Setați viteza maximă a roabei.
00AD: set de masina $ OPP_CAR viteza maxima la 50.0
Am pus mașina adversarului să ignore semafoarele
00AE: unknown_set_car $ OPP_CAR to_ignore_traffic_lights 2
facem șoferul nebun :)
00A8: setați mașina OPP_CAR la conducătorul psiho
aruncați steagurile polițistului
01ED: resetează actorul $ OPP_COP
Există un bug, imediat după creare în șoferii roabei, el încearcă mereu undeva să meargă undeva, chiar dacă nu l-am lăsat să o facă. Prin urmare, scriem această linie
02C2: masina $ OPP_CAR conduce la punctul -272.837 -476.868 10.095
așa că specificăm unde să mergem la roaba $ OPP_CAR. Dar coordonatele la care trebuie să mergeți, sunt coordonatele unde am creat roaba. Deci, mașina nu merge nicăieri, dar am scăpat de bug-ul.
Apoi, atunci când toate mașinile sunt create, este timpul să începeți cursa.
Dar nu imediat și imediat ce jucătorul se află în roabă.
: CheckInCar
0001: așteptați 0 ms; întârziere
00D6: dacă 0; În cazul în care
80DC: NU se joacă $ PLAYER_CHAR conducând $ PLAYER_CAR; Jucătorul nu este în mașină
004D: jump_if_false ЈBackCount; Dacă în mașină trecem la etichetă
0001: așteptați 0 ms; întârziere
0002: salt ЈCheckInCar; Mergeți la etichetă: CheckInCar
În acest cod vom verifica pentru a vedea dacă jucătorul ($ PLAYER_CHAR) în mașină ($ PLAYER_CAR), apoi vom trece la următorul marcaj, în cazul în care nu apoi trece la începutul blocului. Astfel, până când jucătorul se află în mașină, cursa nu va începe. Vă întrebați de ce trebuie să introduceți întârzierile de 0001: așteptați 0 ms. și apoi că această bucată de cod este o buclă. Și dacă acest ciclu se repetă fără întârziere, jocul doar se blochează.
Apoi începeți să numărați 3, 2, 1 și apoi începeți cursa.
În primul rând, îngheți jucătorul, adică nu pot fi gestionați pentru o vreme.
01B4: setarea playerului $ PLAYER_CHAR stare înghețată 0
Spunem polițiștilor că nu este greu :)
01F7: set_player $ PLAYER_CHAR ignored_by_cops_state_to 1
și începe să numărăm
00BA: text_style "RACE2" 1500 ms 4; afișați mesajul 3
018C: play_sound 7 la 0.0 0.0 0.0; redați sunetul
0001: așteptați 1500 ms; așteptați 1500 ms
0395: zona clară 1 la -274.309 -486.170 interval 11.0 1.0; ștergeți tamponul
așa că repetați acest cod de 3 ori schimbând doar textul afișat pe ecran.
Apoi afișăm un mesaj despre începutul cursei și dezghețați jucătorul.
00BA: stil text "RACE1" 1200 ms 4; afișați un mesaj despre începutul cursei
01B4: setarea playerului $ PLAYER_CHAR stare înghețată 1; "jucator dezghețat"
și în final începem cursa.
0001: așteptați 0 ms; Ne așteptăm
0186: $ OPP_MRK = crează un marcator deasupra mașinii $ OPP_CAR; creați un marker pe radarul din jurul mașinii adversarului
02C2: masina $ OPP_CAR conduce la punctul -696.092 -489.462 9.890; Specificăm că mașina adversarului ar trebui să meargă la coordonatele finalizării misiunii
018A: $ F_CHECK = a crea punctul de control la -696.092 -489.462 9.890; a crea un punct de control pe radar indică locul final al cursei
Mai mult, verificăm condițiile pentru câștigarea cursei dacă adversarul este mort sau jucătorul a venit pentru prima dată la linia de sosire.
: CheckWin;
00D6: dacă 0; dacă
8118: NU este actorul OPP_COP mort; adversarul este în viață
004D: jump_if_false ЈEndMission; dacă sunteți morți, mergeți la marcajul de completare a misiunii
00D6: dacă 0; dacă
; jucătorul din mașină nu se află pe coordonate după ce trece, câștigând o misiune cu o rază de X Y Z
80F7: NOT jucător $ PLAYER_CHAR 0 lângă punctul în mașină -696.092 -489.462 9.890 rază 6.0 6.0 6.0
004D: jump_if_false ЈEndMission; În cazul în care pe coordonate apoi tranziții la finalizarea cursei
0001: așteptați 0 ms; întârziere
verificați condițiile pierderii, în cazul în care adversarul a ajuns la final.
: CheckFailed
00D6: dacă 0; dacă
; mașina adversarului nu se află pe coordonatele finalizării cursei
81AF: NU masina $ OPP_CAR 0 () aproape de punctul -696.092 -489.462 9.890 rază 6,0 6,0 4,0
004D: jump_if_false ЈMissFailed; dacă pe ele am pierdut misiunea și am ajuns la semnul pierderii
0001: așteptați 0 ms; întârziere
0002: sari ЈCheckWin; mergeți la etichetă: CheckWin
mărci suplimentare, jucătorul a câștigat sau a pierdut
; pierde
: MissFailed
00BA: Text_style "M_FAIL" 5000 ms 1; Afișați un mesaj despre misiune
0002: sari Ј Sfarsit; Mergeți la etichetă: Sfârșit

; won
: EndMission
0394: play_music 1; redă muzică
01E3: text_1number_styled "M_PASS" 3000 5000 ms 1; Afișează mesajul de completare a misiunii

și termină.
: Sfârșit
034F: distruge actorul cu decolorare OPP_COP; distrugeți actorul OPP_COP, oponentul nostru
00A6: distruge mașina $ OPP_CAR; distruge mașina adversarului
0164: disable_marker $ F_CHECK; opriți marcatorul de pe radar
01F7: setarea playerului $ PLAYER_CHAR ignorată de statutul polițiștilor la 0 (adevărat);
004E: end_thread; Finalizarea fluxului
Acum rămâne să ne compilam codul, în fișierul scm, apăsați F9 și Misiunea Builder va crea main.scm îl va copia în folderul Vice City și va începe jocul.
Acesta este sfârșitul articolului, mâinile mele sunt deja obosite, batem pe clave :).
Nu cu mult timp în urmă, GTA San Andreas a ieșit și vreau să spun că codarea misiunilor pentru el,
nu diferă de scrierea misiunilor pentru Vice City. Bineînțeles, tema creării misiunilor nu este închisă și voi publica în curând un articol despre scrierea unor misiuni mai complexe. Și există un gând să faceți o bază de date online a opcodelor cu descrierile și parametrii acestora, dar asta este totul în viitor ... Puteți descărca codul sursă al misiunii de aici. Dacă aveți întrebări legate de Misiunea Builder, scrieți-mi la [email protected]. dar nu mă umple cu spam cu solicitări precum "și cum să scriu un mod bazat pe Brigada filmului", o astfel de scrisoare imediat arunc în thrash. Nu pot decât să ajut într-o anumită problemă.

Articole similare