Przebudowany skrypt doświadczenia. 3922 7

O temacie

Autor Pyrooo

Zaczęty 27.05.2016 roku

Wyświetleń 3922

Odpowiedzi 7

_Karol_

_Karol_

Użytkownicy
posty357
Propsy102
ProfesjaGracz
  • Zbanowany
Witam.
To jest mój pierwszy samouczek. Jak coś będzie źle wytłumaczone to piszcie w komentarzach to poprawię.

Oryginalny skrypt polegał na tym, że po zdobyciu poziomu, doświadczenie do następnego się zwiększało a ze zdobytym przez nas nic się nie działo(to znaczy że po zdobytym poziomie się nie zerowało).
Mój skrypt zmienia na to, że po zdobyciu poziomu nasze doświadczenie się zeruję.
Bez obaw, tyle samo doświadczenia co było trzeba będzie zdobyć do nowego poziomu.
Koniec teorii, start praktyki.

Otwieramy plik B_GivePlayerXP.d znajdujący się w "Gothic 2\_work\data\Scripts\Content\Story\B_Story\"
Przechodzimy do części pliku w której jest skrypt awansu na następny poziom czyli:
if(hero.exp >= hero.exp_next) //Jeśli liczba naszego expa równa się liczbie expa wymaganej do następengo poziomu to...
{
hero.level = hero.level + 1;
hero.exp_next = hero.exp_next + ((hero.level + 1) * 500);
hero.attribute[ATR_HITPOINTS_MAX] = hero.attribute[ATR_HITPOINTS_MAX] + HP_PER_LEVEL;
hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS] + HP_PER_LEVEL;
hero.lp = hero.lp + LP_PER_LEVEL;
PrintScreen(PRINT_LevelUp,-1,YPOS_LevelUp,FONT_Screen,2);
Snd_Play("LevelUp");
};

A teraz wytłumaczenie:

if(hero.exp >= hero.exp_next) Jeśli liczba naszego expa równa się liczbie expa wymaganej do następengo poziomu to...
      hero.level = hero.level + 1; Nasz level zwiększa się o 1.
hero.exp_next = hero.exp_next + ((hero.level + 1) * 500); Liczba doświadczenia jakie musimy zdobyć do następnego poziomu zwiększa się.
np.poziom 0 - Maksymalne doświadczenie=500 + ((Nasz level=1 +1) * 500) wychodzi 1500 czyli tyle musimy zdobyć by osiągnąć poziom 2.

      hero.attribute[ATR_HITPOINTS_MAX] = hero.attribute[ATR_HITPOINTS_MAX] + HP_PER_LEVEL; Nasza maksymalna liczba punktów życia wzrasta o tyle co wynosi zmienna HP_PER_LEVEL(domyślnie 12).
      hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS] + HP_PER_LEVEL;Nasza maksymalna liczba punktów życia wzrasta o tyle co wynosi zmienna HP_PER_LEVEL(domyślnie 12). Można zmienić na
hero.attribute[ATR_HITPOINTS_MAX] = hero.attribute[ATR_HITPOINTS; co znaczy, że przy awansie nasze zdrowie się odnawia do pełna.

hero.lp = hero.lp + LP_PER_LEVEL; Nasza liczba punktów nauki wzrasta o tyle co wynosi zmienna LP_PER_LEVEL(domyślnie 10).

PrintScreen(PRINT_LevelUp,-1,YPOS_LevelUp,FONT_Screen,2);Na naszym ekranie pojawi się napis ustawiony w zmiennej PRINT_LevelUp czyli Kolejny Poziom!

Snd_Play("LevelUp");Odtwarzany jest dźwięk "LevelUp"



Omówione to teraz jak to zmienić?
Chodzi nam o linijkę:
hero.exp_next = hero.exp_next + ((hero.level + 1) * 500);
Tworzymy nową zmienną gdzieś na początku(ja ją nazwałem NextMaxExp)
Zamiast tego:
hero.exp_next = hero.exp_next + ((hero.level + 1) * 500);Dajemy to:
NextMaxExp = hero.exp_next + ((hero.level + 1) * 500);Ale to nie wszystko ponieważ hero.exp_next się nie zmieni i co każde zdobycie expa będzie nowy level :D.
I teraz najważniejsze w tym systemie doświadczenia:
NextMaxExp = NextMaxExp - hero.exp_next;Czyli w naszej zmiennej będzie zapisane ile trzeba zdobyć doświadczenia na nowy poziom.
Ale jeszcze trzeba zapisać ile więcej expa zdobyliśmy niż trzeba było i zrobić by tyle równało się nasze zdobyte doświadczenie na następny level .
hero.exp = hero.exp - hero.exp_next; Gotowe. Teraz wystarczy zrobić by hero.exp_next równało się naszej zmiennej czyli w moim przypadku:
hero.exp_next = NextMaxExp;
To tyle

Ale po co nam to robić jak nie ma żadnej różnicy w gameplayu.
Ten system jest przydatny jeśli ma się pasek doświadczenia.
Bo wtedy pasek po zdobyciu poziomu nie zaczyna się w połowie zapełniony tylko od zera.

Gotowiec dla leni.
Spoiler
Stare:
hero.level = hero.level + 1;
hero.exp_next = hero.exp_next + ((hero.level + 1) * 500);

Nowe:
var int NextMaxExp;
hero.level = hero.level + 1;
NextMaxExp = hero.exp_next + ((hero.level + 1) * 500);
NextMaxExp = NextMaxExp - hero.exp_next;
hero.exp  = hero.exp - hero.exp_next;
hero.exp_next = NextMaxExp;
 
Podobno jestem trollem.

FOgidel

FOgidel

Użytkownicy
posty60
Propsy100
ProfesjaSkrypter
  • Użytkownicy
Wybacz, że to robię, ale można też tak:
hero.level = hero.level + 1;
hero.exp  = hero.exp - hero.exp_next;
hero.exp_next = ((hero.level + 1) * 500);
Właściwie nijak to nie usprawnia, ale nie mogłem się powstrzymać. Wybacz.

A tak na serio:
Fajny tutorial. Właściwie nigdy nie przyszło mi do głowy, żeby zrobić coś takiego.
Ale przede wszystkim wytłumaczyłeś wszystko co jest w tej funkcji, a to się przyda świeżakom (wiem, że gdzieś był już taki tutorial, ale z tego co pamiętam gorszy)
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Twoim sposobem będzie się miało doświadczenie na minusie (hero.exp - hero.exp_next) + jeszcze nie będzie wynosiło idealnej wartości, bo będzie odejmowało cały exp, a nie exp potrzebny na level wstecz. Mam nadzieję, że zrozumiale napisałem.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

FOgidel

FOgidel

Użytkownicy
posty60
Propsy100
ProfesjaSkrypter
  • Użytkownicy
Właśnie nie będzie na minusie. Będzie właśnie odejmowało exp na poprzedni lvl, bo dopiero po tym oblicza się nowy następny exp.
To co zrobiłem, to tylko usprawnienie jego skryptu. Jeśli jego działa to mój też.
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
hero.exp = 500
hero.exp_next = 1500
hero.exp - hero.exp_next = -1000

Łatwa matematyka
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
Chyba że dał warunek, ale nie napisał o nim >.< if(hero.exp<0){hero.exp=0;};
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
albo zrobi tak:
hero.exp_next - hero.exp
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

FOgidel

FOgidel

Użytkownicy
posty60
Propsy100
ProfesjaSkrypter
  • Użytkownicy
Przecież widać, że odejmuje stary następny exp, bo obliczanie nowego jest potem. Więc jak jest np. 560, to odejmie 500, a następny exp będzie obliczony dopiero potem.hero.level = hero.level + 1;
Zwiększa lvl
hero.exp  = hero.exp - hero.exp_next;
Od expa odejmuje STARY exp
hero.exp_next = ((hero.level + 1) * 500);
Oblicza nowy exp

To jest proste
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry