Kwasowa Grota Heroes VIIMight & Magic XHeroes III - Board GameHorn of the AbyssHistoria Światów MMSkarbiecCzat
Cmentarz jest opustoszały
Witaj Nieznajomy!
zaloguj się    załóż konto
Cytadela Mocy i Magii  (Might and Magic)temat: MMExtension, czyli WoG do MM6-8
komnata: Cytadela Mocy i Magii (Might and Magic)

Kirin PW
25 maja 2011, 21:12
Jakiś czas temu GrayFace wydał MMExtension, rozszerzenie skryptowe do MM6-8, które jest potężnym narzędziem do modowania tychże gier. Wszystkie skrypty są pisane w języku Lua, przy czym uwzględnione są funkcje natywne gry i można ich dowolnie używać.

Główne zmiany względem oryginalnego systemu skryptów z MM:
- Styl pisania właściwy dla języków wysokiego poziomu
- Możliwość definiowania własnych funkcji, zmiennych, tablic, itd.
- Większa ilość funkcji i zmiennych natywnych
- Pętle (if..then, while..do, itd.)
- Łatwiejsze umieszczanie skryptów w grze
- Można pisać skrypty w czasie gry (istnieje do tego specjalna konsola)

Projekt cały czas jest rozwijany. Aktualny stan projektu można zobaczyć na tej stronie. Jest na niej również dokumentacja, kilka przykładów i zdekompilowane skrypty (pisane w pseudojęzyku).

Sama modyfikacja dostępna jest tutaj(wersja dla MM6), tutaj(wersja dla MM7) i tutaj(wersja dla MM8). Modyfikację instalujemy wrzucając foldery „ExeMods” i „Scripts” do folderu z grą. Do działania potrzebny jest patch GrayFace’a (MM6, MM7, MM8)

Mały mod i skrypt wyłączający Margaret na Szmaragdowej wyspie (oba napisane przeze mnie):
- Thaumaturgy mod – dodaje nowego NPC, który w zamian za parę przysług wprowadza nas w świat taumaturgii.
NPC nazywa się Guru i znaleźć go można w Tatalii. Taumaturgii używa się poprzez kombinację klawiszy ctrl + alt.
- Skrypt wyłączający Margaret

Skrypty wgrywamy do odpowiednich folderów w katalogu /Scripts, np. thaumaturgy_global do folderu /Scripts/global. Plik events.lod wrzucamy do katalogu /data w folderze z grą.

Na dniach postaram się przygotować wprowadzenie do pisania skryptów z wykorzystaniem MMExtension. Stay tuned!

Kirin PW
28 maja 2011, 16:05
A oto obiecane krótkie wprowadzenie.

Przeczytanie ze zrozumieniem poniższego tekstu daje +10 do wiedzy o pisaniu skryptów do MMVII z użyciem MMExtension. Przeczytanie bez zrozumienia daje +20 do zadawania głupich pytań.

Zakładam, że masz już zainstalowane MMExtension oraz zaopatrzyłeś się w MM8LevelEditor i jakiś edytor Lua. Jeśli nie, to właśnie jest dobry moment, aby to zrobić. Jeśli już posiadasz odpowiednie narzędzia, to możemy przystąpić do tworzenia naszego małego moda.

Zaraz na początku wypadałoby określić o czym ma być nasz mod. MMExtension pozwala na tworzenie przeróżnych modyfikacji – dodawanie nowych zadań, przypisywanie skryptów do obiektów, pisanie skryptów uruchamiających się wraz z mapą, itd. Jako że dodawanie zadań jest chyba najpopularniejszym wyborem, toteż tym zagadnieniem się zajmiemy. Nasz mod doda do domu Carolyn Weathers na Szmaragdowej Wyspie NPC o nazwie Dobroczyńca, który da nam zadanie polegające na przyniesieniu mu prymitywnej włóczni, za co da nam 500 sztuk złota i 500 doświadczenia.

Aby dodać do gry własną postać niezależną, musimy wpisać ją do pliku NPCdata.txt w archiwum events.lod (otwieramy za pomocą MM8LevelEditora). Miejsca na postacie, które możemy wykorzystać, zaczynają się od numeru 447 - z tego też numeru skorzystamy. W polu „name” wpisujemy „Dobroczyńca” – jest to nazwa naszej postaci wyświetlana w grze. W polu „pic” wpisujemy 12, czyli numer obrazka, z którego nasza postać będzie korzystać (numer obrazka zazwyczaj bierzemy z archiwum Icons.lod – np. plik NPC012 ma numer 12). Resztę pól zostawiamy tak jak jest – ustawimy je później za pomocą skryptów.

Mimo że teksty, NPCTopic i powitanie ustawimy skryptowo, to gra musi je skądś pobrać. W pliku NPCText pod numerem 768 wpisujemy „Przynieście mi prymitywną włócznię, a dam wam 500 sztuk złota i doświadczenia”, pod numerem 769 „Nie ma włóczni, nie ma nagrody”, a pod numerem 770 „Macie włócznię? Proszę, oto wasza nagroda” (ambitne teksty rulez :P). W pliku NPCTopic pod numerem 573 wpisujemy „zadanie”. Z powitaniami sprawa wygląda najgorzej, ponieważ w MMVII nie ma na nie żadnych wolnych miejsc. Kopiujemy więc tekst ósmy na pozycję siódmą, natomiast pod pozycją szóstą ustawiamy własny tekst (np. „Witajcie!). Co to daje? Ano to, że zmieniliśmy drugi tekst Malwicka na jakiś brzmiący neutralnie, a pierwszy zastąpiliśmy naszym. Później przypiszemy jego pierwszy tekst do drugiego, tak, że będzie korzystał tylko z jednego. Może to wyglądać trochę zawile, ale w praktyce jest bardzo proste.

Ok, NPC już mamy, Teraz warto spisać sobie parę potrzebnych numerów, żeby nie otwierać co chwilę MM8LevelEditora w poszukiwaniu potrzebnych danych. Będą nam potrzebne:
- numer prymitywnej włóczni w items.txt (numer ten wynosi 31)
- numer domu Carolyn Weathers w 2Devents.txt (numer ten wynosi 239)
- numer QBitu, który będziemy ustawiać (quests.txt, numer ten wynosi 272)
- numer Malwicka w NPCdata.txt (numer ten wynosi 6)

W tym momencie mamy już wszystko, co jest nam potrzebne, więc przystąpimy do pisania skryptów. Jak większość zadań, nasz skrypt umieścimy w folderze /scripts/global. W tym celu utwórz w tym folderze nowy plik i nazwij go „minimod_global.lua”, a następnie otwórz go w swoim edytorze Lua. WAŻNE: Wielkość liter w Lua ma znaczenie!

Skrypt zaczniemy od właściwego umiejscowienia naszej postaci. Posłużymy się w tym celu funkcjami evt.MoveNPC(), evt.SetNPCTopic i evt.SetNPCGreeting(). Zaczniemy od ustawienia Malwickowi powitania o numerze 7. W tym celu wpisujemy:
kod:
evt.SetNPCGreeting(6, 7) --6 jest numerem Malwicka
Następnie ustawiamy naszego NPC wraz z odpowiednimi atrybutami wpisując (lub kopiując) [Znaki ‘--‘ oznaczają w Lua początek komentarza]:
kod:
evt.MoveNPC(447, 239) --numer naszego NPC i domu Carolyn
evt.SetNPCGreeting(447, 6) --powitanie o numerze 6
evt.SetNPCTopic(447, 0, 573) --0 oznacza, że NPCTopic jest umieszczony pod takim właśnie indeksem; jeśli byłby tam inny NPCTopic, to zostałby on usunięty
Jeśli zapiszemy teraz nasz plik i uruchomimy grę, to w domu Carolyn Weathers pojawi się nowy NPC z własnym powitaniem i NPCTopic „zadanie”, które po kliknięciu jeszcze nic nie robi. Teraz zajmiemy się właściwym wprowadzeniem zadania. W tym celu wpisujemy szkielet funkcji naszego zadania:
kod:
evt.Global[273] = function()
--tu będzie nasz mod
end
Aby sterować zadaniem posłużymy się QBitem. Jest to flaga, która po ustawieniu jest zapisywana i może być sprawdzana:
kod:
evt.Global[573] = function()
if evt.Cmp(evt.VarNum.QBits, 272) then --początek pętli ze sprawdzeniem, czy jest QBit
if evt.Cmp(evt.VarNum.Inventory, 31) then --instrukcje do wykonania, jeśli mamy prymitywną włócznię
evt.SetMessage(770) --wyświetla wiadomość, że mamy włócznię
evt.Player = evt.Players.All --następne linijki odnoszą się do całej drużyny
evt.Add(evt.VarNum.Gold, 500) --dodaje 500 sztuk złota
evt.Add(evt.VarNum.Experience, 500) --dodaje 500 doświadczenia
evt.SetNPCTopic(447, 0, 0) --usuwamy NPCTopic
local qbclear = 1 --ustalamy sobie zmienną
end
if not evt.Cmp(evt.VarNum.Inventory, 31) then --instrukcje do wykonania, jeśli nie mamy prymitywnej włóczni
evt.SetMessage(769) --wyświetla wiadomość „nie ma włóczni, nie ma nagrody"
end
end
if not evt.Cmp(evt.VarNum.QBits, 272) then --początek pętli ze sprawdzeniem, czy nie ma QBitu
evt.SetMessage(768) --ustawia początkową wiadomość
evt.Set(evt.VarNum.QBits, 272) --ustawia nasz QBit
end
if qbclear == 1 then --warunek prawdziwy tylko na końcu zadania
evt.Subtract(evt.VarNum.QBits, 272) -- usuwa nasz QBit
end
end
Brakuje tu jeszcze jednej rzeczy, mianowicie usunięcia QBitu. Nie możemy tego zrobić w pętli, która wykonuje się gdy mamy włócznię, bo wykona się wtedy pętla początkowa. W tym celu dodajemy sobie zmienną „qbclear” i dodajemy pętlę na końcu funkcji. Cały skrypt ma wtedy postać:
kod:
evt.SetNPCGreeting(6, 7)
evt.MoveNPC(447, 239) --numer naszego NPC i domu Carolyn
evt.SetNPCGreeting(447, 6) --powitanie o numerze 6
evt.SetNPCTopic(447, 0, 573)

evt.Global[573] = function()
if evt.Cmp(evt.VarNum.QBits, 272) then --początek pętli ze sprawdzeniem, czy jest QBit
if evt.Cmp(evt.VarNum.Inventory, 31) then --instrukcje do wykonania, jeśli mamy prymitywną włócznię
evt.SetMessage(770) --wyświetla wiadomość, że mamy włócznię
evt.Player = evt.Players.All --następne linijki odnoszą się do całej drużyny
evt.Add(evt.VarNum.Gold, 500) --dodaje 500 sztuk złota
evt.Subtract(evt.VarNum.Inventory, 31) --NPC zabiera na włócznię
evt.Add(evt.VarNum.Experience, 500) --dodaje 500 doświadczenia
evt.SetNPCTopic(447, 0, 0) --usuwamy NPCTopic
local qbclear = 1 --ustalamy sobie zmienną
end
if not evt.Cmp(evt.VarNum.Inventory, 31) then --instrukcje do wykonania, jeśli nie mamy prymitywnej włóczni
evt.SetMessage(769) --wyświetla wiadomość „nie ma włóczni, nie ma nagrody)
end
end
if not evt.Cmp(evt.VarNum.QBits, 272) then --początek pętli ze sprawdzeniem, czy nie ma QBitu
evt.SetMessage(768) --ustawia początkową wiadomość
evt.Set(evt.VarNum.QBits, 272) --ustawia nasz QBit
end
if qbclear == 1 then --warunek prawdziwy tylko na końcu zadania
evt.Subtract(evt.VarNum.QBits, 272) -- usuwa nasz QBit
end
end
Jeśli chcemy sprawdzić, czy mod działa, to ustawiamy naszej postaci umiejętność „włócznia” i idziemy do nowego NPC. Na tym kończę ten krótki poradnik i zachęcam do zapoznania się ze spisem funkcji na stronie projektu.

Miłego modowania!

J. M. Sower PW
24 stycznia 2016, 14:58
Nie wiem czy to odpowiedni temat, ale innego nie znalazłem.

Czy widzieliście news na stronie Maestro z września 2015 roku? Udostępniono edytor map do MM6-8! Wypróbowałem i to naprawdę działa! :D Co prawda nie znam się na skryptach Lua (jedynie trochę liznąłem teraz temat przy okazji testowania edytora), a bez tego za wiele się nie osiągnie, ale mapy naprawdę łatwo się przerabia. :) Nie testowałem jeszcze wklejania własnych modeli w formacie .obj ale to nie jest zbyt trudne. Poniżej macie screen przedstawiający moją zabawę w przerabianie Szmaragdowej wyspy na Vori. ;D


Ps. Gdyby ktoś nie wiedział jak się zabrać za pracę z edytorem to mogę trochę podpowiedzieć. ;)

Tarnoob PW
24 stycznia 2016, 15:37
Ej, super. :-D Może po kilkunastu latach wreszcie się doczekamy w MM7 Krewlod, Vori, autentycznej (a nie tylko ludzkiej) Tatalii itd.

J. M. Sower PW
24 stycznia 2016, 16:02
Czuję, że w końcu otwierają się przede mną świeże perspektywy związane z serią Might and Magic. :D Gdyby kręciła się tu osoba znająca skrypty Lua i chciałaby ze mną trochę powspółpracować, to jestem otwarty na propozycje. ;D Nie jestem też za bardzo obeznany z możliwościami moddingu tejże gry. Zastanawia mnie choćby możliwość dodania własnej jednostki. Jeśli się da, to chyba z chęcią zabrałbym się za wydłużenie fabuły (gobliny z blasterami pojawiające się po uruchomieniu Kuźni ;D). Ciekaw jestem też czy w miarę łatwo jest dodać całkiem nową mapę niezależnie od tych starych, np. właśnie Vori, bądź Krewlod. Jak pobawię się trochę więcej (np. zaimportuję jakieś modele) to zdam dokładniejszy raport. ;D

Tarnoob PW
24 stycznia 2016, 16:29
Masz mój miecz. :-)

J. M. Sower PW
24 stycznia 2016, 18:31
Nie wiem czy zadziała to na każdej wersji (ja mam z konieczności zainstalowany patch GrayFace'a), ale możecie sobie pobrać i sprawdzić co udało mi się zrobić. ;) Obrazek należy wrzucić do icons.lod, a pliki mapy do games.lod (polecam do tego celu użyć programu MMArchive). Najlepiej jeszcze zrobić sobie wcześniej kopię zapasową obu archiwów, aby można było cofnąć zmiany. ;) Jest to zmodyfikowana mapa Szmaragdowej wyspy.
http://www.speedyshare.com/cbsYT/out01.rar

Co do importu/eksportu modeli 3D (budynków, statków, jaskiń itp.) to działa to całkiem dobrze. Jedynie po załadowaniu modelu z pliku .obj najlepiej zmienić nazwę modelu, gdyż po zapakowaniu do mapy nowy obiekt zastąpi stary, o tej samej nazwie (chociaż nie jestem tego do końca pewien ;P). No i po wczytaniu pliku w Blenderze fragmenty modeli nieraz są przypisane do przezroczystego materiału. Model wrzucony w takim stanie do mapy będzie po prostu posiadał "dziury", więc trzeba przypisać te fragmenty modelu do innego materiału. Jest to jednak mały problem i każdy grafik obeznany nieco z Blenderem będzie w stanie sobie z tym poradzić. Przykład moich działań z modelami 3D to te dwa dodatkowe statki w porcie. ;)

Jeśli chodzi o użytkowanie edytora, to w dołączonym do niego pliku tekstowym "MMEditor Readme" mamy wszystko rozpisane. Jeśli wrzuciliśmy do folderu z grą (z zainstalowanym patchem grayFace'a) pliki MMExtension i pliki edytora, to po odpaleniu gry (należy pracować w trybie okienkowym - należy wcisnąć bodajże F4) i włączeniu rozgrywki, wciskamy Alt+F1 i możemy się już bawić, aczkolwiek dalej jesteśmy w rozgrywce. Aby zacząć edytować mapę samą w sobie należy wcisnąć przycisk "Internal map" i załadować co się chce. ;) Obrobione mapy można później zapisać na dysku, jednak mają wtedy inny format niż używany przez grę. w tym celu należy wcisnąć "Compile" i zapisać pliki mapy na dysku po czym zapakować je do games.lod. Nie będę już tłumaczył jak dokładnie się go używa, gdyż musiałbym się nieźle rozpisać (i kiepski ze mnie nauczyciel ;P), jednak wszystko jest w miarę intuicyjne. W razie problemów proszę pytać. ;)

Ps. Opcja "Land" służy do ustawienia zaznaczonego obiektu na takiej wysokości aby "leżał" na ziemi, a nie unosił się gdzieś w przestrzeni. ;P

Można też stworzyć całkiem nową mapę, a nie pracować na którejś z oryginalnych, jednak wprowadzenie jej do gry to już musi być jakaś wyższa filozofia. ;) Można wtedy co najwyżej otworzyć ją w trybie edytora i go wyłączyć ponownie wciskając Alt+F1, jednak wtedy gra się jakoś dziwnie. Na przykład to kliknięciu na chłopa zbieramy go, jakby był zwłokami ;P

Ps2. Nie wiem też dlaczego, ale gra z zainstalowanym patchem GrayFace'a nie działa na Windowsie 7, więc gdy chcę się pobawić edytorem to przesiadam się na XP.

AmiDaDeer PW
24 stycznia 2016, 22:28
Wygląda naprawdę sympatycznie. Ciekawe czy zostanie to w jakiś sensowny sposób wykorzystane...

J. M. Sower PW
24 stycznia 2016, 22:46
Póki co, bez niczyjej pomocy nie jestem w stanie tego wykorzystać, gdyż nie opanowałem skryptów Lua. Jednak jeśli z czasem nauczę się ich używać, bądź zjawi się ktoś kto mi pomoże, to można by się zastanawiać. ;) Osobiście chyba na początek wziąłbym pod topór wykonanie mapy dla krainy Marshland (bagna i jaszczuroczłeki na południowy wschód od mapy Tatalii), jako że w tym przypadku możnaby zaporzyczyć grafiki mieszkańców Wysp Krwawego Sztyletu z MM8. Sądzę że na pierwsze, eksperymentalne podejście to odpowiedni cel. Swoją drogą, to z pewnością przydałby mi się też ktoś od wymyślania NPCów i zadań, bo bez tego całkiem piękna lokacja i tak może być nudna, jednak póki co muszę rozgryźć skrypty i dowiedzieć się czy w ogóle można dodać całkiem nowe stworzenia ;)

J. M. Sower PW
23 kwietnia 2016, 10:20
GrayFace wypuścił nową wersję MMExt. i MMEditora oznaczoną numerem 2.1. Do pobrania na jego stronie.

Można teraz nie tylko dodawać nieograniczoną liczbę NPCów, ale także domów (zawarte w 2DEvents.txt), a samych NPCów można teraz ręcznie w MMEditorze przypisać do wybranych stworków na mapie (wcześniej takie postacie dało się jedynie wprowadzić skryptami). Jest też możliwość dodania nieograniczonej ilości map (zawartych w MapStats.txt). Poniżej cytat samego GrayFace. Mówi jeszcze o naprawieniu paru błędów i usprawnieniu tworzenia map podziemi/lochów.

"GrayFace":
Version 2.1

I fixed two critical bugs introduced in last MMExt version: 1) no damage from enemy spells abd dragon breath and 2) crash whenever an item was broken using a mass spell.
Limits for MapStats.txt and 2DEvents.txt files removed. You can simply add as many new lines as you want to these files.
In MMEditor I've added NPC_ID parameter that I forgot to include for monsters.
Also, now rooms without manual portals get automatic portals even if some rooms in the dungeon do have manual portals. Disregard this sentence if you don't understand what it is about :D

Ponadto GrayFace zdradził, iż w przyszłości należy się spodziewać usunięcia limitów w plikach Hostile.txt i Monsters.txt, co pozwoli na zwiększenie liczby stworzeń wedle uznania. Napomknął też coś o pomocniczych programach, które zrobił dla Maestro (np. automatyczne wrzucanie nowych sprite'ów jednostek do gry), ktorych niestety póki co publicznie nie udostępniono.
temat: MMExtension, czyli WoG do MM6-8

powered by phpQui
beware of the two-headed weasel