Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Pokaż wątki - Bogdan Zwei

Strony: [1] 2 3
1
C, C++ / [C++] Masowa modyfikacja plików tekstowych
« dnia: 2019-02-27, 17:39 »
Chcę zmodyfikować około 6000 plików na raz, które są też zaszyfrowane odpowiednio, żeby nikt nie miał do nich wglądu. Poszperałem trochę w internecie, tutaj tutorial, który nasunął mnie na odpowiednią bibliotekę
https://www.youtube.com/watch?v=h2Taf16gQDI
, a tu cała biblioteka do wglądu http://www.cplusplus.com/reference/fstream/fstream/. Mój problem polega na tym, że każdy plik ma jakąś linijkę, która się powtarza, a potrzebuje zmiany, lecz nie wiem jak wyszukać odpowiednie słowo i właśnie o to chciałem zapytać.
Nie mogę zdradzić, co pliki zawierają (nie ja sobie to ubzdurałem :P), więc załóżmy, że każdy plik ma linijkę z tekstem "królik", a odpowiedni program szyfruje go i teraz mamy napis "ąiwg24ć" i tylko program wie, co on oznacza, a chcę zmienić ten napis ("królik") na "drzewo", w każdym pliku, więc potrzebuję jakieś funkcji, która sama wyszuka dane słowo/słowa (w jednym pliku może się powtórzyć to samo słowo) i go zamieni.


Dodatkowo, jeśli jest to możliwe i w miarę nie skomplikowane, potrzebowałbym funkcję, która by przeskakiwała do następnego pliku (i jeśli to konieczne, otwierała kolejny folder) po edycji. Czyli, plik 1 jest edytowany, wskakuje do pliku 2 w tym samym folderze, po czym folder jest pusty, ale jest kolejny folder, który znowu ma 4 pliki i jeden folder, więc otwiera ten kolejny folder, po czym edytuje tam wszystko, otwiera podfoldery i je edytuje, przeskakuje do następnego folderu.
Wizualizacja:

Spoiler
folder
  • plik
  • plik
folder
  • plik
  • plik
  • plik
  • plik
  • folder
    • plik
Nie jest to jednak aż tak potrzebne, bo pliki znajdują się w 14 folderach (w przyszłości na pewno dojdzie więcej), więc mogę to dopisać ręcznie i edytować szybciej, jednak nie liczy się czas, tylko efektywność. Jeśli przeniosę program na inny komputer, będzie łatwiej.

2
Grafika 3D / Gmax vs. 3ds max?
« dnia: 2018-01-30, 14:26 »
Który jest lepszy? Chciałem pobrać 3ds maxa, ale przypomniało mi się, że jest płatny. Poszukałem coś z nadzieją, że uda mi się znaleźć darmową wersję, ale znalazłem tylko triale. O Gmaxie słyszałem tyle, że jest to "bezpłatna wersja 3ds maxa" (nie dosłownie). Nie wiem też, jakie możliwości ma Gmax, a 3ds max wiem, że oferuje sporo. Dotychczas używałem Blendera, ale jest to (jak dla mnie) tak popierdolony program, że nawet po 10 godzinach znie znalazłem, jak się w nim teksturuje.

Także, moje pytanie brzmi czy jest warto kupować/próbować dostać darmową i pełną wersję 3ds maxa, czy lepiej iść po Gmaxa?
Dobra, bądźmy szczerzy, i tak bym nie kupił 3ds maxa.

3
Offtopic / Clickbait.
« dnia: 2017-11-15, 15:08 »
Teraz zostaw propsa i wyjdź. Ewentualnie jakiś komentarz.

Spoiler
Znowu się dałeś nabrać. To też clickbait. Brawo. Zmarnowałeś czas na czytanie tego bezsensownego tematu.

4
Programowanie / Skakanie po kolei po obiektach
« dnia: 2017-11-11, 13:17 »
Ostatnio zastanawiałem się i kombinowałem, jak to osiągnąć? Chodzi mi o to, że jest sobie lista (powiedzmy na podstawie gry) npc, którzy nie są poukładani chronologicznie, tzn. Andrzej jest na numerze 1 tej listy, ale za jakiś czas może być na numerze 186. Teraz chcę, żeby błyskawica przechodziła z przeciwnika na przeciwnika, dobra, robię zapętlenie itd, ale zauważam, że jeden npc jest parę razy uderzany, bo podczas odświeżania listy ten jeden gościu zmienił numer z 4 na 15 i dostał dwa razy. Jak pozbyć się takiego problemu?

Jedyne co mi przychodzi do głowy to tworzenie nowej listy obiektów i kasowanie ich jak zostali uderzeni błyskawicą. Problem w tym, że np. chcę żeby funkcja wywołała się parę razy, np. 15, a jest tylko 12 obiektów i chciałbym, żeby jakieś losowe npc dostały z tej błyskawicy ponownie. Troszkę pointless wydaje mi się robienie nowej listy podczas kiedy poprzednia się skończyła, albo wypełnianie jej ponownie trzema ludkami. Jest jakieś inne rozwiązanie?

5
Pytania i problemy / Szukam erpega... Albo paru.
« dnia: 2017-10-19, 17:40 »
Trudno się pisze "grę RPG" btw.

Szukam jakieś gry (nie Dark Souls, Shadow of Mordor czy TES) RPG podobnej go Gothic (1-3), Risen (w sumie w niego nie grałem, lol), Arcania, Dark Souls, Divine Divinity, Divinity 2 Ego Draconis/Flames of Vengeance. Może zawierać elementy hack 'n slash, ale żeby nie był to typowy Titan Quest, Grim Dawn, PoE czy Diablo.

Można sypnąć też fajnymi modami do G1, bo te do G2 jakoś mało mnie przekonują. :P

Dobrze by było, żeby gra ta nie była tak łatwa jak chociażby Divinity (w sumie, Divine Divinity jeszcze na poziomie trudnym było wymagające z początku) czy Gothic. Nie jest to mój wymóg. Najważniejsze, żeby gra była grywalna i nie miała gorszej grafiki od Divine Divinity. :P O! Losowość itemów i ich statów jak w Divinity byłoby masywnym plusem - czyli przedmioty dodają różne bonusy, są dwa te same, jeden dodaje do siły, drugi np. manę albo siłę i zręczność. I nic typu strzelanki (jeśli pojawi się tam jedna pukawka czy dwie, typu ELEX to jest ok, ważne, żeby miecze, topory, łuki i kusze przeważały). Chyba tyle, jakby co to edytuję ten post i powiem, co mi się jeszcze nie godzi. :P

6
Pytania i problemy / Pliki .bmd
« dnia: 2017-03-03, 14:56 »
Nie wie ktoś jakim programem otwierać pliki .bmd? Moduję inną grę i są tam biblioteki .bmd, które zawierają modele budynków. Dokładnie to poszukuję programu, który albo będzie konwertował modele do .bmd (niekoniecznie w ten sam sposób co te oryginalne pliki, czyli niekoniecznie jako biblioteka modeli), albo będzie potrafił edytować te pliki. Pliki innego formatu nie dadzą rady w tym przypadku, więc nie ma co kombinować.

7
Ostatnio naszło mnie takie pytanie, czy dałoby radę zrobić coś tego efektu, co Gothic 3. Dokładniej chodzi mi o zmianę, albo nałożenie podwójnej tekstury na broń. Jak wiemy, w G3 Topór Berserkera ma na sobie dwie tekstury - jedna to tekstura żelastwa, a druga to kontur odblasku (podam tekstury tych toporów, żeby było wiadomo o co chodzi). Zależnie od padającego światła, tekstura topora dostaje odblask konturów jego malowideł (wzorów) na ostrzu - chciałbym odwzorować ten efekt. Jakim, najprostszym, albo i nie prostym, ale efektownym sposobem byłoby to możliwe?

Spoiler

8
Skrypty / Nowa runa przemiany bez przerabiania starych run
« dnia: 2016-11-30, 18:06 »
Bez zbędnego pierdolenia.

Musimy dodać naszemu PC_Hero rutynę, która będzie się wykonywała na wp "TOT" (bardzo ważne, bo nie chcemy, żeby PC_Hero sobie znikł).

Robimy nowy czar TRF:


// ------ New Transformation ------
const int SPL_Cost_TrfMyNewTransformationSpell = 10;//Koszt czaru
var C_NPC npc;//make it global //potrzebujemy zapisać naszego potworka do globalnej instance

func int Spell_Logic_TrfMyNewTransformationSpell (var int manaInvested)
{
if ((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll)))
|| (self.attribute[ATR_MANA] >= SPL_Cost_TrfMyNewTransformationSpell)
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_TrfMyNewTransformationSpell;

npc = Hlp_GetNpc(MonsterInstance); //tutaj przypisujemy do naszej globalnej zmiennej ID naszego wymarzonego npc
Wld_SpawnNpcRange(PC_Hero, npc, 1, 500);//Przyzywamy naszego npc niedaleko PC_Hero
SetAsPlayer(npc); //IKARUS / LEGO!: zmienia naszego bohatera z naszym npc
Npc_ClearAIQueue(PC_HERO);
AI_Teleport(PC_HERO, "TOT");//Wysyłamy naszego PC_Hero do wp TOT
return SPL_SENDCAST;
}
else
{
return SPL_SENDSTOP;
};
};
   
Teraz per frame:

if (MEM_KeyState(KEY_ENTER) == KEY_PRESSED) //IKARUS: Jeśli naciśniemy enter:
{
Npc_ClearAIQueue(PC_HERO);
AI_Teleport(PC_HERO, Npc_GetNearestWP(hero);//Teleportuje PC_Hero niedaleko nas
SetAsPlayer(PC_HERO);//Zmieniamy się z ciałem z PC_Hero
Npc_ClearAIQueue(npc);
B_RemoveNpc(npc);//bestia idzie do domu, czyli umiera i teleportuje się na wp TOT
};


Jest to uboższa wersja transformacji.


Wiadomo, czar też trzeba zrobić...

9
Offtopic / Stronki do sprzedaży róznorodności
« dnia: 2016-07-11, 12:55 »
Znacie może jakieś stronki do wystawiania ogłoszeń sprzedaży? Wykluczam Allegro i olx (olx bo jest płatny, a allegro o nim każdy wie). Chodzi mi o stronki darmowe.

10
Skrypty / Wytłumaczenie operacji bitowych
« dnia: 2016-06-29, 14:25 »
Jest tutaj jakiś geniusz, który dałby radę wytłumaczyć mi funkcjonalność operacji bitowych? Chodzi tutaj o wszystkie zastosowania znaków (~, &, | itd.) itp.

Chodzi mi o działanie w Gothicu, nie wiem czy są jakieś różnice między Gothicowymi a ogólnymi - nie jestem informatykiem.

11
Skrypty / Jak poprawnie zaimplementować Bary z LeGo
« dnia: 2016-06-23, 16:28 »
Opiszę tutaj jak poprawnie robić paski w Gothic. Dużo osób kompletnie nie wie, jak to działa, więc opiszę to.

Najpierw tworzymy instancję naszego paska:

instance StaminaBar(GothicBar) {
    x = 720;
    y = 880;
    backTex = "Bar_Back.tga";
    barTex = "Bar_Misc.tga";
};

X to pozycja X liczona w pikselach.
Y to pozycja Y liczona w pikselach.
backTex to podstawka naszego paska, czyli to, co widać jak nasz pasek ma wartość 0/x.
barTex to nasze wypełnienie paska.
backTex i barTex to tekstury, jak widać.

Teraz potrzebujemy zrobić zmienną, która będzie zapisywała nasz pasek:
var int StamBar;
Przechodzimy teraz do samego paska:

func void StaminaBarLoop() {
    if(!Hlp_IsValidHandle(StamBar)) {
        StamBar = Bar_Create(StaminaBar);
    };
    Bar_Hide (StamBar);
};

Hlp_IsValidHandle(StamBar) sprawdza, czy nasza zmienna paska jest wypełniona.
StamBar = Bar_Create(StaminaBar) tworzy i przypisuje nasz pasek do zmiennej StamBar.

Teraz musimy wypełnić nasz pasek jakąś wartością:
tworzymy zmienną, która będzie zawierała wartość naszego aktualnego i maksymalnego zmęczenia (staminy):

var int StaminaVariable;
var int StaminsMax;
Zmienne te wypełniamy w odzielnym skrypcie.

Teraz potrzebujemy wypełniać tymi zmiennymi nasz pasek:

Bar_SetValue (StamBar, StaminaVariable);
Bar_SetMax (StamBar, StaminaMax);

Bar_SetValue wypełnia nasz pasek (StamBar) naszą zmienną. Jest to wartość, która określa naszą aktualną wartość paska.
Bar_SetMax wypełnia nasz pasek (StamBar) naszą drugą zmienną. Jest to wartość maksymalna paska.
SetMax i Value najlepiej wywoływać co klatkę, żeby się ładnie aktualizowały.

Teraz chowanie i pokazywanie paska:

Bar_Hide (StamBar) chowa nasz pasek.
Bar_Show (StamBar) pokazuje nasz pasek (na ekranie).

Te dwie funkcje wywołujemy wtedy, kiedy chcemy włączyć/wyłączyć nasz pasek.

Edit:
Na sam koniec dodajemy zaraz po inicjacji LeGo oraz Ikarusa:
StaminaBarLoop();
Zabraniam kopiowania, tutorial powstał tylko dla tego forum.

12
Skrypty / BinaryMachines (LeGo)
« dnia: 2016-06-18, 10:34 »
LeGo oferuje nam pakiet nazwany "BinaryMachines". Służy on do zapisywania różnych naszych danych/informacji podczas gry do pliku tekstowego. Można tego użyć do np. zapisywania zmiennych ECX / EDI / ESI itp., jeśli szukamy odpowiedniego adresu itp. Nie jest to nic trudnego do obsługiwania:

BW_NewFile(filename) - tworzy nowy plik w folderze Gothic.
BW_NextLine() - enter (czyli kolejna linia).
BW_String(string) - tutaj wpisujemy tekst.
BW_Close() - zamyka plik, kończy cały zapis do tego pliku.

Przykłady:

BW_NewFile("Tutorial File.d");//Polecam dopisywać .d, żeby tworzył się plik w formacie .d, inaczej będzie plik bez formatu.
BW_NextLine();
BW_String("Npcs nearby:");
BW_NextLine();
BW_String("Xardas");
BW_NextLine();
BW_String("Cavalorn");
BW_NextLine();
BW_String("Wolf");
BW_NextLine();
BW_Close();

BW_NewFile("Hookengine Variables.d");
BW_NextLine();
BW_String(ConcatStrings("EAX: ", IntToString(MEM_ReadInt(EAX))));
BW_NextLine();
BW_String(ConcatStrings("ECX: ", IntToString(MEM_ReadInt(ECX))));
BW_NextLine();
BW_String(ConcatStrings("ESP: ", IntToString(MEM_ReadInt(ESP))));
BW_NextLine();
BW_String(ConcatStrings("EBX: ", IntToString(MEM_ReadInt(EBX))));
BW_NextLine();
BW_String(ConcatStrings("EBP: ", IntToString(MEM_ReadInt(EBP))));
BW_NextLine();
BW_String(ConcatStrings("EDI: ", IntToString(MEM_ReadInt(EDI))));
BW_NextLine();
BW_String(ConcatStrings("ESI: ", IntToString(MEM_ReadInt(ESI))));
BW_NextLine();
BW_Close();
To doda nam wartości do pliku, czyli jeśli ESI wynosi 18853, to w pliku znajdziemy wpis "ESI: 18853".

Tutorial przeznaczony tylko dla tego forum, zabraniam kopiowania.

13
Skrypty / Jak zapobiec cheatowaniu w modzie
« dnia: 2016-06-03, 12:59 »
Chciałbym wam mniej-więcej opisać, jak zapobiec używaniu kodów i marvina w Gothic. Posługuję się tutaj Gothiciem 2.
Do tego przyda nam się FrameFunctions (lub trigger) co klatkę oraz klasa oCGame.

W triggerze co klatkę ustawiamy:

if (MEM_Game.game_testmode)
{
MEM_Game.game_testmode = 0;
};

To sprawi, że po włączeniu marvina zaraz się on wyłączy. Można także się pobawić tym i zrobić jakieś kary za używanie kodów, np. zwiększyć przychodzące obrażenia do hero czy zmniejszyć obrażenia zadawane przez hero, lecz do tego przyda się dodatkowa zmienna w story globals:
var int PlayerIsCheating;
oraz skrypt w FF co klatkę:
if (MEM_Game.game_testmode)
{
PlayerIsCheating = true;
};

Później możemy się bawić "skutkami ubocznymi" używania kodów w taki sposób:

if (PlayerIsCheating)
{
    //skrypt;
};

Można się także pobawić i sprawdzić jak długo ktoś miał marvina włączonego, dodając dodając do zmiennej MEM_GameMananger.playTime podczas włączenia marvina i do drugiej zmiennej czas wyłączenia MEM_GameMananger.playTime.
var int endofcheating;
var int startofcheating;
var int fullCheatingTime;
var int blockStart;
var int blockEnd;
if (MEM_Game.game_testmode)
&& (!blockStart)
{
startofcheating = MEM_GameMananger.playTime;
blockStart = true;
}
else if (startofcheating && !MEM_Game.game_testmode)
&& (!blockEnd)
{
endofcheating = MEM_GameMananger.playTime;
blockEnd = true;
};

if (startofcheating && endofcheating)
{
fullCheatingTime += endofcheating - startofcheating;
startofcheating = 0;
endofcheating = 0;
blockStart = false;
blockEnd = false;
};

Bawcie się dobrze!

14
Nazwałem ten temat "Zrób to sam!" dlatego, że będzie to w 100% teoria, jak zrobić system powiadomień jak w Czasie Zapłaty.

Przejdźmy najpierw do wytłumaczenia, czym jest ten system powiadomień:
Ten system używa poboczną (pierwotną) klasę dialogów, które są w Gothicu. Klasa ta została wykasowana z okien dialogowych i zastąpiona nową, bardziej rozbudowaną, a tą przenieśli do Smalltalk, czyli okienek, które wyświetlają się jak dwa npc rozmawiają ze sobą (czyli jest rozmowa pomiędzy dwoma npc, ale żaden z nich to nie hero). Jako tako, ta klasa nie jest używana (wcale). Twórcy postanowili przerobić Smalltalk i dodali ją do klasy dialogowej, która jest obecnie używana, a tą starą zostawili jako "relikwię". Relikwia (klasa) ta była zbyt mała, przez co dialogi mogły mieć tylko dwie linie, dlatego też ją rozbudowali.

Oto jak pierwotna klasa dialogów wyglądała:

class DialogBoxClass
{
var int MsgAlpha;
var int TextMove;
var int ViewMove;
var int MsgView;
var int Text;
var int FirstLine;
var int SecondLine;
var int time;
};

Jak widać, jest strasznie mała, idealna na system powiadomień (zdaje mi się, że Print() używa tej klasy). W Czasie Zapłaty postanowili ją "ożywić" i ulepszyć, robiąc nowy system powiadomień (PrintScreen). Klasa różni się pomiędzy dwoma Gothic'ami (chyba tylko nazwami zmiennych). Żeby zrobić podobny system powiadomień, trzeba użyć pakietu Anim8, View oraz Interface.

Przejdźmy do opisania, jak co ma wyglądać:

class DialogBoxClass
{
var int MsgAlpha; // Anim8(h) Alpha
var int TextMove; // Anim8(h) Text position
var int ViewMove; // Anim8(h) View position
var int MsgView; // Anim8(h) View
var int Text; // PrintScreen
var int FirstLine; // Print separator
var int SecondLine; // Print separator
var int time; // View Duration
};
instance DialogBoxClass@(DialogBoxClass);

MsgAlpha to animacja alfy całego powiadomienia (Print + View).
TextMove to animacja napisu (przemieszczanie się informacji).
ViewMove to animacja boxa dialogowego (informacyjnego).
MsgView to po prostu View.
Text to po prostu PrintScreen w postaci int (czyli tutaj musicie użyć PrintScreen z Lego).
First i SecondLine to linie. Linia pierwsza chyba musi być wypełniona, druga nie musi.
time to czas działania tej informacji (pierwotnie - dialogu).

DialogBoxClass@ jest użyte jako pointer w późniejszym skrypcie, gdzie wypełniamy naszą nową zmienną DialogBoxClass.


To chyba na tyle. Jak widać klasa jest idealnie rozbudowana, żeby zrobić takie cudo jak w CZ. Teraz starczy tylko pobawić się trochę całą klasą i utworzyć nowy system powiadomień. Wydaje mi się, że da radę także przypisać do tej klasy cały system dialogowy, ale nie jestem co do tego pewien, może wywalić parę błędów, albo w ogóle nie reagować na tę klasę, jeśli jednak by załapało, nie pójdzie manipulować całym dialogiem, lecz tylko jego częścią.


Jak w każdych moich tutorialach i "tutorialach", nie pozwalam na kopiowanie.

15
Skrypty / Ikarusowe FLOAT
« dnia: 2016-05-20, 16:26 »
Witam. Dzisiaj opiszę wam floaty z Ikarusów (w zasadzie, nie jest to jako tako tylko w Ikarusie), bo nie każdy z Was je ogarnia.

Najpierw, co oznacza sama nazwa FLOAT? Nic innego jak liczba, która ma jeszcze coś po przecinku (tak, nigdy nie słuchałem na matematyce, nie wiem jak wam to powiedzieć), czyli na przykład 1.69, 4.20, 46.2378478 itd.

Przejdźmy do opisania poszczególnych funkcji i wyjaśnienia ich.
Spoiler
mkf(int) - Make Float - Stwórz Float -> Przeobraża liczbę int (czyli np. 16, 33, 120, 420) w float, czyli po zapisaniu mkf(1); otrzymamy dziwną liczbę, jeśli ją wyświetlimy w grze poprzez np. Print(). W tym przypadku otrzymamy liczbę 1065353216, czyli 1.0 (nie 1, bo już mamy float, a nie int).

truncf (int) - Truncate Float - Zetnij float -> Przywraca Float do inta. Czyli, jeśli nasz float wynosi 1.0, zmieni go na 1 (int), jeśli nasz float wynosił 3.528, przywróci nam 3. Ważna uwaga, int działa tak, że odczytuje tylko liczbę pierwszą, przed przecinkiem, czyli jeśli nasz float będzie miał 3.999... to i tak dostaniemy 3 z powrotem (obcina przecinek).

roundf (int) - Round Float - Zaokrąglij float -> konwertuje naszego float do int, zaokrąglając jego wartość, czyli jeśli po przecinku będzie 5 i więcej, zwiększy nam wartość o jeden do góry i odda int. Przykład: 4.3 = 4, 7.6 = 8.

addf (int x, int y) - Add Floats - Dodaj floaty -> dodawanie, floatów nie da się dodawać jak inty, trzeba używać tej funkcji. Jeśli nie wiadomo, co znaczy dodawanie: łączy liczbę X i liczbę Y, np. 1+1=2.

subf (int x, int y) - Subtract Floats - Odejmij floaty -> odejmowanie floatów. 2-1=1.

negf (int) - Negate Float - Negacja floata -> przeobrażanie liczby dodatniej na ujemną (np. -1 = 1).

mulf (int x, int y) - Multiply Floats - Pomnóż floaty -> mnożenie. 4*4 = 16.

divf (int x, int y) - Divide Floats - Dziel floaty -> dzielenie. 16/4 = 4.

invf (int) - Inverse Float -> Nie do końca wiem o co tu chodzi, dzieli 1 przez wasz float, czyli np. 1/32 = 0.03125.

fracf (int x, int y) - to samo co divf (nie wiem po co).

gf (int x, int y) - Greater Float - Większy float -> zwraca true jeśli x > y, false jeśli nie.

gef (int x, int y) - Greater or Equal Float - Większy bądź równy float -> zwraca true jeśli x > y, lub x = y, false jeśli mniejszy.

lf (int x, int y) - Lower Float - Mniejszy float -> zwraca true, jeśli x < y.

lef (int x, int y) - Lower or Equal Float - Mniejszy bądź równy float -> zwraca true jeśli x < y, lub x = y, false jeśli większy.

sqrtf (int) - Square root Float - Skróć Float -> zmniejsza float z x.abcdef... do x.abcd.

sqrtf_approx (int) - to samo, co sqrtf, tyle, że zaokrągla ostatnią liczbę, czyli 3.5888883 = 3.5889.

printf (int) - Pokazuje napis z wartością naszego floata. Osobiście polecam to, ponieważ nie ucina żadnych liczb i można użyć do wszystkiego, nie tylko, żeby wyświetlić wartość na ekranie.
Ten pakiet floatów pozwala na edytowanie dużej ilości wartości systemowych, takich jak deszcz, chmury, rozmiar słońca, a także szerokość ekranu czy innych rzeczy, oznaczonych jako zFLOAT czy zREAL.
Zmienne (te systemowe oczywiście) oznaczone tymi oto komentarzami nie czytają intów (tzn. czytają, ale musi być przekonwertowany na bitowe floaty). Można także edytować te zmienne bez używania tego pakietu, ale wtedy trzeba będzie znać konwertowanie intów do bitów, a tego raczej nie jest nikt w stanie się nauczyć.

Teraz parę przykładów użycia tych floatów.

var int TwoAndHalf; TwoAndHalf = divf(mkf(25), mkf(10)); //2.5
var int ThreeSeventyFive; ThreeSeventyFive = divf(mkf(375), mkf(100)); //3.75
var int FiveTwentyFive; FiveTwentyFive = addf(ThreeSeventyFive, TwoAndHalf); //5.25 !!! UWAGA! Jeśli float jest zapisany w zmiennej, nie używamy już mkf, ponieważ jest on już floatem.
var int TenAndHalf; TenAndHalf = mulf(FiveTwentyFive, mkf(2)); //10.5
var int Eight; Eight = subf(TenAndHalf, TwoAndHalf); //8
var int MinusEight; MinusEight = negf(Eight); //-8

Teraz przykłady zmiennych, które posługują się tylko i wyłącznie floatami:

MEM_SkyController.cloudShadowScale = 1; // wynosi 0, bo nie jest float
MEM_SkyController.cloudShadowScale = 180; // wynosi 0, bo nie jest float
MEM_SkyController.cloudShadowScale = 95771; // wynosi 0, bo nie jest float
MEM_SkyController.cloudShadowScale = mkf(1); // wynosi 1, bo jest float
MEM_SkyController.cloudShadowScale = mkf(951); // wynosi 951, bo jest float
MEM_SkyController.cloudShadowScale = mkf(18883636); // wynosi 18883636, bo jest float

Teraz odczytywanie. Jeśli używacie tego, możecie także dodać funkcję do książki (jak na screenie), lub do printu lub gdziekolwiek:
Print(Float32ToString(TenAndHalf)); // napis 10.5 na ekranie
Print(Float32ToString(MinusEight)); // napis -8 na ekranie
Samo Float32ToString(x) można wpakować do stringa i używać gdziekolwiek się chce (oczywiście razem ze stringami).
W przeciwnym razie używacie Printf(x) i pokazuje się wam na ekranie float x.abcd (np. 10.5000).

Teraz potrzebujemy przekonwertować nasze Eight (8) do inta, bo potrzebujemy (nie wnikam gdzie i po co), lecz wiedząc, że wynosi 8.0, a nie 8.x, to używamy truncf.
var int intEight; intEight = trunkf(Eight); //int 8
Ale w sumie, potrzebuję jeszcze przekonwertować TenAndHalf (10.5) do inta, lecz wiem, że zmienna ta wynosi coś między 10 a 11:
var int intTenAndHalf; intTenAndHalf = roundf(TenAndHalf); //11, ponieważ jeśli zaokrąglimy 10.5 to da nam 11

Teraz możemy używać intEight (8) i intTenAndHalf (11) gdziekolwiek chcemy, możemy dodać do odporności pancerza, do obrażeń jakiejś broni itp.



To chyba na tyle. W razie jakichkolwiek pytań piszcie.

Zabraniam kopiowania. Temat powstał tylko dla użytkowników tego forum.

16
Mój problem polega na tym, że mam trzy zdjęcia, które różnią się tylko wielkością pikseli.

Zdjęcie 1: 800x600 plik .jpg
Zdjęcie 2: 2000x1700 plik .jpg
Zdjęcie 3: 2816x2338 plik .jpg

Komputer odczytuje je wszystkie, ale podczas nagrania na płytę nie odczytuje zdjęcia 2. Zdjęcie 1 i 3 odczytuje bezproblemowo.

Zdjęcia 1 i 3 były robione aparatem komórkowym, a zdjęcie 2 było kserem oryginalnego zdjęcia z lat 1960+ (starym aparatem fotograficznym). Zdjęcie numer 2 było modyfikowane w gimpie, żeby nie było za małe, oraz formatowane programem Format Factory, bo nie działało na nagrywarce (na płycie) po samym gimpie. Co może być przyczyną tego, ze zdjęcie 2 nie działa na owej nagrywarce? Nagrywarka jest z około 2005 roku, nie stać nas na nową.

17
Skrypty / Błąd przy otwieraniu skrzyni
« dnia: 2016-02-06, 14:58 »
Nic nie bawiłem się ze skrzyniami. Znaczy się, bawiłem, ale skrypty wyłączyłem, bo nie przydają się na chwilę obecną. A tu oto se errorek mnie odwiedził.  :lol2:



Ktoś wie o co może chodzić?

W sumie wątpię, że to może być problemem w FocusNames.d
else if (Hlp_Is_oCMobLockable(her.focus_vob))
{
var oCMobLockable mob; mob = MEM_PtrToInst(her.focus_vob);

if (mob.bitfield & oCMobLockable_bitfield_locked)
{
col = RGBA(255,0,0,255);
};
}

18
Sprzęt, oprogramowanie / Dziwne problemy z myszką.
« dnia: 2015-12-13, 14:23 »
Wczoraj grając sobie w League of Legends wyłączyła mi się myszka. Pomyślałem, zepsuła się. Idę po myszkę brata - nie działa. Myślę sobie, restart pomoże. Nic. Idę po moją starą, działającą. Nic. Podłączam tą co myślałem, że się popsuła i zauważyłem, że scroll się nie świeci, a zawsze świecił, a jako, że to myszka z rodzaju Bloody, to jest na jej "tyłku" łapka, która się świeciła pomimo niedziałającej myszki. Byłem pewien, że coś się spaliło, a google mi mówiły tylko o sterownikach, które działają poprawnie, bo nic z nimi nie robiłem i wszystko ładnie śmigało. Dzisiaj włączam komputer, myszka działa. Wtf? Co może być przyczyną? Coś się przegrzało? Spaliło? Sterowniki działają i nie ma z nimi żadnych problemów, każde z USB nie działało. Restarty nic nie dawały, a teraz magicznie działa.

19
Jako, że mi się dzisiaj nudziło i chciałem także ulepszyć sen, postanowiłem zrobić funkcję, która przyspiesza lub spowalnia czas. Łapcie, darmozjady!  :trollface: :ok:

Spoiler
func void B_ScaleTime (var int x)
{
   var int world_timer; world_timer = MEM_Timer.frameTimeFloat;
   var int acceleration; acceleration = fracf(x, 100);
   world_timer = mulf(world_timer, subf(acceleration, mkf(1)));
   MEM_WorldTimer.worldTime = addf(MEM_WorldTimer.worldTime, world_timer);
};

Jak używać: Chciałem nie pisać, ale napiszę, a co mi tam! :F
B_ScaleTime (100);//czas upływa normlanie
B_ScaleTime (55);//czas upływa 45% powolniej (czyli 55% standardowego upływania czasu)
B_ScaleTime (1000);//czas upływa 10 razy szybciej

A jeśli chcemy, żeby jedna sekunda to była jedna Gothicowa minuta:
B_ScaleTime(25); //Jedna sekunda = 15 Gothicowych sekund; 4 sekundy = 1 Gothicowa minuta

A jak ktoś chce zrobić, żeby 1 sekunda = około 1 sekunda w Gothic... :F :F :F
Spoiler
const int GameScaleToRealScaleApprox = 6616225;
func void B_ScaleGameTimeToRealTime ()
{
   var int world_timer; world_timer = MEM_Timer.frameTimeFloat;
   var int acceleration; acceleration = fracf(GameScaleToRealScaleApprox, 100000000);
   world_timer = mulf(world_timer, subf(acceleration, mkf(1)));
   MEM_WorldTimer.worldTime = addf(MEM_WorldTimer.worldTime, world_timer);
   if(!MEM_Game.game_showtime){MEM_Game.game_showtime = !MEM_Game.game_showtime;};
};

Skrypt wywoływać najlepiej co klatkę.


Liczyłem dokładnie, nie bójcie się! :trollface: :ok: :trollface: :ok: :trollface: :ok: :trollface: :ok: :trollface: :ok: :trollface: :ok: :trollface: :ok:


EDIT (02.12.2015): Clean-up zrobiony. Lepsza wersja.
EDIT (19.07.2016): Dostosowano B_ScaleGameTimeToRealTime, żeby jeszcze trafniej skalował czas gry z naszym (w sumie, sama zmienna GameScaleToRealScaleApprox powinna wynosić około 6616224738192, ale Gothic nie uciągnie takiej matematyki).

20
Offtopic / Życie z kobietą a inne zamiłowania
« dnia: 2015-11-29, 19:28 »
W sumie nie wiedziałem dokładnie jak to nazwać.

Jestem osobą, która nie przepada za rozmawianiem z innymi i woli siedzieć sama, bez nikogo przy sobie. Moje dogadywanie się z dziewczynami jest, powiedziałbym, marne. Nigdy nie miałem dziewczyny. Zawsze spierdalam sobie znajomości. Dwa lata temu pochłonęła mnie kulturystyka. Teraz nie ma dnia, w którym bym ot tak sobie powiedział "dzisiaj nie ćwiczę, nie chce mi się", ponieważ czuję się, jakby ktoś celował mi w głowę - kompletnie się uzależniłem (nie przeszkadza mi to). Szukam obecnie pracy. Mieszkam z rodzicami. Mam 19 lat i nie jestem jakoś super inteligenty, moja inteligencja w skali od 1 do 10 to bym powiedział 2 / 3 / 4 (chociaż 4 to chyba troszkę przesada). Naszło mnie, żeby przemyśleć, co dalej? Otóż, nie jestem pewien, czy powinienem szukać dziewczyny, czy powinienem tworzyć rodzinę. Dziewczyny mi się "podobają na chwilę" (nie czuję się z tym dobrze). Zaś kulturystyka podoba mi się na tyle, że chciałbym powiązać z nią całe życie. Nie wiem, czy powinienem wybrać życie samotnego (tak wiem, w przyszłości będę przychodził do pustego domu, robił wszystko sam, ćwiczył i miał trochę wolnego czasu, brak seksu czy jakichś interakcji z drugą połówką), czy po prostu poszukać na chama jakieś kobiety, która "będzie mi odpowiadać" i będę w stanie z nią spędzać całe życie.

Postanowiłem zapytać tutaj, bo jest tu mnóstwo inteligentnych oraz pomocnych osób.

Strony: [1] 2 3
Do góry