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 - DerDrache

Strony: [1]
1


OPIS:

Gothic I: Amplified to próba przemodelowania i zremasterowania świata Gothica I, starająca się zachować jedyny w swoim rodzaju klimat Górniczej Doliny. Podejście do projektu jest proste: ulepszyć i podkręcić każdy aspekt gry, bez dotykania fabuły, zadań, bez dodawania nowych NPC czy obozów. Pod wieloma względami jest to modyfikacja bardziej przypominająca L'Hiver czy Revisioned do drugiej części serii, niż popularne mody rozszerzające "jedynkę". Produkcja jest również mocno inspirowana protypowymi wersjami alpha i beta pierwszego Gothica, przywracając niektóre sensowne pomysły na które Piranhom nie wystarczyło czasu.


Główne założenia modyfikacji:

  • Odświeżenie całego świata Kolonii, zachowując oryginalny, surowy styl, bez sztucznego udawania stylu graficznego nowszych produkcji RPG (oszczędne wykańczanie świata obiektami otoczenia jak drzewa czy krzaki, oryginalne tekstury z poprawionym mapowaniem, obiekty intencjonalnie stylizowane na niską szczegółowość).
  • Przemodelowanie ekonomii gry, jak również balansu i podejścia do walki oraz rozwoju postaci w taki sposób, aby gra była bardziej przyjemna, wymagająca i różnorodna.
  • Nowe mechaniki, usprawnienia.
  • Brak dodatkowych obozów, NPC, questów, zmian w oryginalnej fabule Gothic I.


Bardziej szczegółowa lista feature'ów:
Spoiler
Przebalansowanie wszystkich broni, jak również nowe sposoby walki:
   Nowe właściwości broni, jak penetracja pancerza czy siła przeciw konkretnym typom oponentów.
   Obrażenia łuków skalujące się ze zręcznością
   Różne rodzaje strzał z możliwością ich szybkiej zmiany w trakcie walki.
   Znacznie bardziej agresywne potwory.
   Czary skalujące się z maną i kręgami (różne wzory dla run i zwojów - nierzadko użycie zwoju będzie wciąż opłacalne mimo posiadania runy).
   Walki z bossami.
   Różni przeciwnicy podatni na różne typy obrażeń.
   Możliwość założenia więcej niż jednej broni do walki w zwarciu i podpięcia jej pod klawisze 1-9.
   Opcjalne, szybsze wybieranie czarów pod jednym przyciskiem i myszką
   W pełni działające i zbalansowane potwory dystansowe, jak Ork z kuszą czy szkielet z łukiem.
Ulepszenia ekonomii
   Dostosowanie wartości każdego przedmiotu w grze.
   Niemożliwe jest po prostu kupienie najlepszych broni/amuletów/pierścieni.
   Mnożnik przy sprzedaży mocno obniżony.
   Ogólnie, znacznie zmniejszenie ilości rudy, i zwiększenie konieczności wydawania jej, w szczególności w końcowych rozdziałach.
   
Usunięcie każdego możliwego błędu w oryginalnych Gothicach  (bez dodawania nowych, tu ukłon do wersji nazwanej od najpopularniejszego interaktywnego obiektu w Świątyni Śniącego) (modyfikacja będzie również integrować już istniejące mod-fixy). Usunięcie również błędów nigdy nie poprawionych, jak zepsute SVM NPC-ów, brak losowej pory deszczu, błędy dźwiękowe przy zmianie niektórych motywów muzycznych (np. przy wyjście ze Starej Kopalni) i inne.
Możliwość nauki sprintu, jak również zwiększenia wytrzymałości przy użyciu przedmiotów.
Całkowicie nowy system kradzieży kieszonkowej, łączący najlepsze cechy tych z obu Gothiców.
Całkowicie nowy system otwierania zamków, nie losowy, i nie wymagający zapamiętywania kombinacji.
Usprawnienia typu quality-of-life, pochodnia pod przyciskiem, wygodny panel z informacjami, sprint pod przycisk, filtrowanie przedmiotów w ekwipunku po nazwie, ulepszenia focusowania przedmiotów, oznaczenie przeczytanych książek, możliwość używania stałych bonusów do statystyk od razu, i dużo więcej.
Przebudowany system teleportacji, z jedną runą i wybieraniem miejsca docelowego później. Również dodano wiele pojedynczych zwojów na wczesnym i średnim etapie gry aby zmniejszyć backtracking.
Opuszczona kopalnia.
Znane z dawnych wersji Podziemne miasto Orków, to z powierzchni zostało usunięte.
Przebudowane stare lokacje, jak Stara Cytadela, Wieża mgieł, Stary Klasztor, zachowując oryginalną stylistykę, jak również dziesiątki pomniejszych zmian w całym świecie.
Nowy system alchemii, z przejrzystymi, animowanymi ekranami informacyjnymi.
System tworzenia broni, z kilkoma poziomami wiedzy oraz recepturami do zdobycia, kupienia lub znalezienia.
Działająca Arena w Starym Obozie, z możliwością walki jak i obstawiania i oglądania codziennych walk.
Nowe potwore i nowe modele, animacje, rutyny, bronie, przedmioty użytkowe jak i otoczenia.
Pelna kompatybilność z DX11 i LegacyAltRenderer.
Dziesiątki pomniejszych zmian.


Screeny
Screeny dostępne są na stronie moda na moddb.com: https://www.moddb.com/mods/gothic-i-amplified


Stan prac
Aktualna wersja to CLOSED ALPHA. Działa większość featurów, część jest intesywnie testowana.
Chcesz pomóc, umiesz w grafikę 2D/3D, pisanie skrytów, copywriting, design świata, albo chcesz zostać testerem? Albo po prostu chcesz pogadać o modzie? Zajrzyj na nasz discord: https://discord.gg/G2Qu6SuE5E


Techniczne Info
Modyfikacja wymaga do działania Union w najnowszej wersji (proszę pamiętać o oryginalnej wersji Uniona z Steam Workshop/Resource Managera, a nie jakieś dziwne wersje krążące po discordach). Będzie dostępna również w Steam Workshop.


Foreigners info
Mod will be available also in EN. For details about mod, visit moddb mod page: https://www.moddb.com/mods/gothic-i-amplified



2
Skrypty / [G1][GFA] Kolizja strzał z NPC
« dnia: 2021-12-01, 17:13 »
Hej, to znowu ja.
Jak pewnie wiecie, strzała/pocisk magiczny wystrzelona/y przez NPC ignoruje wszystkich NPC po co drodze do celu, chyba że ten NPC to potwór lub ork. Potrzebuję to zmienić, a dokladnie, kiedy NPC który strzela jest orkiem i ten NPC po drodze jest rownież orkiem, to strzała przez niego przelatuje :)

Szukajac rozwiązan, trafiłem na teoretycznie rozwiązanie niemal gotowe, idealne w Gothic Free Aim. Otóż hookują oni tam oCAIArrow::CanThisCollideWith(zCVob*) przed samym koncem funkcji, sprawdzając kilka warunków i co najważniejsze dla mnie, pobierając strzelającego z oCAIArrow, a "ofiarę" oczywiście z parametru zCVob.
(https://github.com/szapp/GothicFreeAim/blob/master/_work/data/Scripts/Content/GFA/_intern/collision.d #554, GFA_ExtendCollisionCheck())

Niestety próby zhookowania tego u mnie całkowicie nie wypalają. Po zhookowaniu tego w miejscu w którym zrobili to tworcy GFA, nic sie nie dzieje, funkcja sie nie wywołuje nigdy, po prostu nic się nie dzieje. Po shookowaniu tego na początku(co ogólnie nie ma raczej sensu, bo chce zmodyfikowac wartosc zwracana) nastepuje crash w momencie próby edycji voblisty i wpisywania czegoś do rejestru.
Wygląda to mniej więcej tak (wersja z hookiem jak w GFA):

func void EVT_oCAIArrow_CanThisCollideWith()
{
var int collidingVobPointer; collidingVobPointer = MEM_ReadInt(ESP + 8);
var int arrowAI; arrowAI = MEMINT_SwitchG1G2(ESI, EDI);

if ((collidingVobPointer == 0) ||
(arrowAI == 0) ||
(!Hlp_Is_oCNpc(collidingVobPointer)))
{
return;
};

var C_Npc shooter; shooter = _^(MEM_ReadInt(arrowAI + oCAIArrow_origin_offset));
var C_NPC collidingNpc; collidingNpc = MEM_PtrToInst(collidingVobPointer);

if(C_NpcIsOrc(shooter) &&
   C_NpcIsOrc(collidingNpc))
{
// var int ignoreVobList; ignoreVobList = MEM_ReadInt(arrowAI + oCAIArrowBase_ignoreVobList_offset);
        // List_AddFront(ignoreVobList, collidingVobPointer);

        // // // Increase reference counter, otherwise NPC/vob will be deleted on list destruction!
        // var zCVob vob; vob = _^(collidingVobPointer);
        // vob._zCObject_refCtr += 1;

        // // Set return value of collision check to false
        //ECX = 0;
} else
{
PrintScreen("Something differrent than orc hit", 15,54,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};
};

func void Hook_oCAIArrow_CanThisCollideWith()
{
HookEngineF(oCAIArrow_CanThisCollideWithAddr_positive, 6, EVT_oCAIArrow_CanThisCollideWith);
};

Wszystko rozbija się o pobranie z odpowiednich miejsc shootera i victima. Jak rozumiem, ten vob który przelatuje jest na ESP + 8, poniewaz jedno słowo juz zostalo dolozone na stos, i to by sie zgadzało z liczbą pushy:


(call zdejmuje tych 5 pushy/argumetow koło siebie)

Natomiast nie do konca rozumiem dlaczego oCAIArrow jest odczytywane z ESI zamiast ESP + 4(wszak jest to ukryty argument).

Ogółem cały koncept reprezentowania rejestrów w LeGo/Ikarusie jest dość niezrozumiały dla mnie.
Np. tutaj (całkiem inna funkcja, ale pewnie niedługo się za to zabiorę)

EDI = DMG_OnDmg(EBP, MEM_ReadInt(dmgDesc + 8), EDI, +dmgDesc, +dmg_IsHit);
powyzszy kawałek kodu powstał na kanwie implementacji onDmg, która będzie mi potrzeban do czego innego: EDI jako deadalusowa zmienna jest traktowany jako wartość, ale z drugiej strony w przypisaniu collidingVobPointera juz ESP traktujemy jako adres? wuteef?

3
Do 3 razy sztuka..

Próbuję zrobić system, który poprawia AIV_ITEMSCHWEIN, aby nie reagował na przedmioty na które nie powinien reagować. Oczywiscie hookuję funkcję ikarusem/lego. Udało mi się zrobić już upuszczanie przedmiotu przy NPC, zostało jeszcze upuszczanie broni czy co tam osoba trzyma w dłoni przy śmierci/unconscious. Niestety nie jestem w stanie określić która z funkcji to określa

Próby z róznymi funkcjami wygląda tak:

func void Hook_oCNPC_DropFromSlot()
{
const int oCNpc__DropFromSlotAddr = 6972016; //006A6270
HookEngineF(oCNpc__DropFromSlotAddr, 6, EVT_oCNPC_DropFromSlot);
};

func void EVT_oCNPC_DropFromSlot()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);

if(Npc_GetInvItemBySlot(slf, INV_WEAPON, 1))
{
item.change_atr[0] = 99;
PrintScreen (ConcatStrings(ConcatStrings(slf.name, ": DROPFROMSLOT, flage AIV_ITEMSCHWEIN przedmiotu: "), item.name), 15,40,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
} else
{
PrintScreen (ConcatStrings(slf.name, ": DROPFROMSLOTNIC NIE MA NA SLOT1"), 15,42,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};

if(Npc_GetInvItemBySlot(slf, INV_WEAPON, 2))
{
item.change_atr[0] = 99;
PrintScreen (ConcatStrings(ConcatStrings(slf.name, ": DROPFROMSLOT, flage AIV_ITEMSCHWEIN przedmiotu: "), item.name), 15,44,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
} else
{
PrintScreen (ConcatStrings(slf.name, ": DROPFROMSLOTNIC NIE MA NA SLOT2"), 15,46,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};
};

func void Hook_oCNPC_DropAllInHand()
{
const int oCDropAllInHandAddr = 6898224; //694230
HookEngineF(oCDropAllInHandAddr, 1, EVT_oCNPC_DropAllInHand);
};

func void EVT_oCNPC_DropAllInHand()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);

PrintScreen (ConcatStrings(slf.name, "DropAllInHand, enter:"), 65,5,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);

if(Npc_GetInvItemBySlot(slf, INV_WEAPON, 1))
{
item.change_atr[0] = 99;
PrintScreen (ConcatStrings(ConcatStrings(slf.name, ": DROPALLI HAND, fl AIV_ITEMSCHWEIN SLOT1 ITEMOWI:"), item.name), 15,70,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
} else
{
PrintScreen (ConcatStrings(slf.name, ": DROPALLI NIC NIE MA NA SLOT1"), 15,72,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};

if(Npc_GetInvItemBySlot(slf, INV_WEAPON, 2))
{
item.change_atr[0] = 99;
PrintScreen (ConcatStrings(ConcatStrings(slf.name, ": DROPALLINHAND, fl AIV_ITEMSCHWEIN SLOT2 ITEMOWI:"), item.name), 15,70,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
} else
{
PrintScreen (ConcatStrings(slf.name, ": DROPALLI NIC NIE MA NA SLOT2"), 15,74,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};
};

func void Hook_oCNpc_EquipWeapon()
{
const int oCNpc_EquipWeaponAddr = 6908960; //696C20
HookEngineF(oCNpc_EquipWeaponAddr, 1, EVT_oCNpc_EquipWeapon);
};

func void EVT_oCNpc_EquipWeapon()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
var C_ITEM itm; itm = MEM_PtrToInst(MEM_ReadInt(ESP + 8));

PrintScreen ("wchodzenie w equip wepaon", 15,60,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);

if (!Hlp_IsValidItem (itm))
{
PrintScreen ("ZLY ITEM", 15,62,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
return;
};

PrintScreen ("EquipWeapon: ZMIENIAMY ITEMSWINIE", 15,62,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
itm.change_atr[0] = 99;
};

func void Hook_oCNpc_Equip()
{
const int oCNpc_EquipAddr = 6908144; //6968F0
HookEngineF(oCNpc_EquipAddr, 3, EVT_oCNpc_Equip);
};

func void EVT_oCNpc_Equip()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
var C_ITEM itm; itm = MEM_PtrToInst(MEM_ReadInt(ESP + 8));

PrintScreen ("wchodzenie w equip", 15,64,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);

if (!Hlp_IsValidItem (itm))
{
PrintScreen ("ZLY ITEM", 15,66,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
return;
};

PrintScreen ("Equip: ZMIENIAMY ITEMSWINIE", 15,66,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
itm.change_atr[0] = 99;
};

func void Hook_oCNpc_EquipItem()
{
const int oCNpc_EquipItemAddr = 6879552; //68F940
HookEngineF(oCNpc_EquipItemAddr, 2, EVT_oCNpc_EquipItem);
};

func void EVT_oCNpc_EquipItem()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
var C_ITEM itm; itm = MEM_PtrToInst(MEM_ReadInt(ESP+48+4));

PrintScreen ("wchodzenie w equipITEM", 15,60,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);

if (!Hlp_IsValidItem (itm))
{
PrintScreen ("ZLY ITEM", 15,62,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
return;
};

PrintScreen ("ZMIENIAMY ITEMSWINIE", 15,62,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
itm.change_atr[0] = 99;
};

Nie wiem czy wszędzie są itemy poprawnie przekazane (jak ktoś wie jak to robić, i jest w stanie wytłumaczyć, można używać stricte programistycznego jezyka bo zawodowo jestem programistą cepa; starałem się sledzić skąd po kolei w danym rejestrze brał się itemek, ale nie wiem czy jest to dobrze zrobione, prawdopodobnie moznaby jakieś funkcje powywoływać ręcznie i pobrać ten item), ale ogólnie te funkcje.. w ogóle się nie wywołują. Np żadna z tych z rodziny "equip" nie pokazuje się ani razu, przy zakladaniu czegokolwiek przez kogokolwiek. Jedyna funkcja, jaka sie wywołuje to DropFromSlot(), ale nie mam pojęcia kiedy, bo zdaje się robić to dość losowo, czasem gdy przejdę koło NPC, czasem gdy przyzwę NPC insertem, gdy postać zginie zazwyczaj sie wywołuje, ale nie zawsze itp.

Generalnie w systemie rozchodzi się o to, zeby ustawić itemowi change_atr[0] = 99;. Najłatwiej i najsensowniej wydaje mi sie ze w funkcjach equip, bo potem by to nie lagowało ewentualnie przy zabijaniu wiekszej ilości NPC na raz, ale tak jak mówiłem nie działa to.


4
Skrypty / [Gothic I] LeGo i Ikarus - ktore w końcu?
« dnia: 2021-11-03, 00:31 »
Chcę zrobić system reakcji NPC na podnoszone itemki w ich obecności. Coś bardziej dopracowanego niż aivar przypisany np. Laresowi i Straznikowi w zamku magnatow, czy pole owner w klasie C_ITEM. Jako punkt startowy znalazlem sobie taki temat: https://themodders.org/index.php?topic=28197.0

Problem w tym, ze uzywają tam HookEngine, ktory zdaje się jest w pakiecie LeGo. Czy ten pakiet dziala, czy nie dziala z Gothikiem I? Nie znalazlem nigdzie jasnej informacji poza tematem z 2012 roku. Przy probie instalacji Ikarusa i LeGo, wrzuceniu plikow gdzie trzeba (świetne instrukcje/README mają, raptem godzinę mi zajelo rozkmienienie, nie ma co), co rusz pojawiaja sie blędy parsowania, zduplikowany ident(e.g. ASMINT_OP_popEAX) i tak dalej.

5
Bawię się w przenoszenie różnych potwórków do jedynki, bez zbędnych udziwnień, 1:1. GSourcerem przekonwertowałem WOLF.MSB z dwojki, i po przeniesieniu dodatkowo tekstury .TEX zrobiłem bez problemu warga

Mdl_SetVisualBody      (self,   "Warg_body2"...


Chcialem rowniez przeniesc smoczego zebacza i szkieleta-cieniostwora, natomiast konwersja SHADOW.MSB nie daje nic tzn w ogóle GS nie znajduje odpowiednich plików, mimo ze powinny tam być, bo w G2NK ustawianie wygladu cieniostwora wygląda tak:

Mdl_SetVisual(self,"Shadow.mds");
Mdl_SetVisualBody(self,"Shadowbeast_Skeleton_Body",DEFAULT,DEFAULT,"",DEFAULT,DEFAULT,-1);

Po próbie ustawienia tego w skryptach gra sie crashuje gdy przywolam cieniostwora z message, ze nie znajduje ShadowbeastSkeletonBody. Z zebaczem jest identycznie.


Strony: [1]
Do góry