Poprzedni temat «» Następny temat
Pytania i porady odnośnie modowania
Autor Wiadomość
Zed Nocear 
Uczeń Gonda
Laureat Konkursu Modderskiego


Wiek: 49
Posty: 2041
Podziękowania: 253/48
Skąd: gród Vratislavia
Wysłany: 2018-09-06, 06:15   

nowus777 napisał/a:
W pliku DORNJ.DLG (State 229) na pytanie Dorna o treści "Co inni o mnie mówią?! Kto śmie plotkować na mój temat?" gra wyrzuca odpowiedzi, które są imionami NPC z drużyny. Oczywiście po wybraniu odpowiedzi (imienia NPC), owy NPC coś odpowiada, a następnie Dorn również odpowiada i atakuje owego NPC. Chciałbym do odpowiedzi dodać imiona tworzonych przeze mnie NPC (i tym samym zainicjować także możliwość wskazania Dornowi moich NPC), ale nie do końca wiem, jak to zrobić (do tej pory łączyłem dialogi głównie za pomocą ICT). Na pewno jest to związane z warunkiem InParty("imię NPC"), ale nie wiem, jak w pełni go sformułować oraz w którym pliku umieścić (skrypt .baf czy dialog .d?) + jak to zawrzeć w skrypcie instalacyjnym. Być może pytanie jest trywialne, a odpowiedź banalna, ale do tej pory nie dodawałem nowych odpowiedzi do dialogów już istniejących w grze, więc dla mnie jest to jednak nowość.


W pliku dialogowym D definiującym dialog w drużynie Twojego NPCa dodajesz na końcu (nie może przerywać ciągu bloków po BEGIN ) do dialogu Dorna nową odpowiedź do wyboru:

EXTEND_BOTTOM ~DORNJ~ 229
+ ~InParty("TWOJNPC")~ + ~Imię Twojego NPCa~ EXTERN TWOJNPCJ Odp_Dorn_00 //Nazwa Join_dialogu i etykieta bloku odpowiedzi Dornowi Twojego NPCa w nim.
END
_________________
"There are also some elements of the game that are not «broken» but could do with a tweak to make them just a little better in some way."
Podziękuj autorowi tego posta
 
 
Więcej szczegółów
Za tę wypowiedź podziękowali:
nowus777
nowus777 
Uczeń Gonda


Wiek: 29
Posty: 300
Podziękowania: 14/61
Skąd: Warszawa
Wysłany: 2018-09-06, 20:47   

Ned, stokrotne dzięki za każdą pomoc i wszystkie wskazówki - póki co udało Ci się rozwiązać niemal wszystkie moje problemy i przy okazji nauczyć mnie wielu rzeczy.

W wolnej chwili zerknij proszę jeszcze na ostatni post tutaj: http://athkatla.cob-bg.pl...r=asc&start=825
_________________
BGEE 10 NPC PROJECT: NOWE POSTACI, NOWE ROMANSE, NOWE PRZYGODY!
  
Podziękuj autorowi tego posta
 
 
dradiel 
Dziecię Bhaala
Jeździec Shaundakula

Posty: 1598
Podziękowania: 750/107
Wysłany: 2018-09-07, 05:57   

nowus777 napisał/a:
No ok, to jeszcze jedno pytanko... Czy ktoś jest w stanie wskazać błąd, przez który nie następuje przejście warunku z Global("MIRANDALoveTalk","GLOBAL",8) na Global("MIRANDALoveTalk","GLOBAL",9) ? Jest to rozmowa uaktywniająca się po odpoczynku. I o ile w przypadku 4 postaci skrypt zbudowany w ten sposób działa, o tyle w przypadku Mirandy nie. Niby jest po odpoczynku, niby warunek questu GlobalGT("MIRANDAQuestTalk","GLOBAL",10) przyjmuje wartość 11, a tymczasem jak sprawdzam w sejwie Global("MIRANDALoveTalk","GLOBAL",8) nadal nie zmienia się z 8 na 9 :( Czy za dużo moddingu w ostatnich dniach i ja jestem już ślepy? Proszę, aby ktoś zerknął.

IF
PartyRested()
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
ReputationGT([PC],9)
GlobalGT("MIRANDAQuestTalk","GLOBAL",10)
Global("MIRANDARomanceActive","GLOBAL",1)
Global("MIRANDALoveTalk","GLOBAL",8)
THEN
RESPONSE #100
IncrementGlobal("MIRANDALoveTalk","GLOBAL",1)
END

IF
Global("MIRANDALoveTalk","GLOBAL",9)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR2")
StartDialogue("MIRANDAJ",Player1)
END


Sprawdź wszystkie bloki skryptów występujące przed tymi dwoma. To, że one się nie wykonują może być spowodowane blokami skryptów występującymi przed nimi.

W jaki sposób gra interpretuje plik .bcs możesz poczytać tutaj:
http://www.pocketplane.ne.../simscript.html

Może, w którymś bloku wcześniejszym trzeba dodać Continue() - to jedna możliwość. Akcja ta zapobiega restartowaniu skryptu. Zapoznaj się z diagramem z linku, który Ci podrzuciłem.
Poza tym blok z PartyRested() spróbuj dodać na górze skryptu.

Najlepiej załącz cały skrypt, do którego dodajesz te dwa bloki. W takich przypadkach potrzebny jest szerszy kontekst.
Podziękuj autorowi tego posta
 
 
nowus777 
Uczeń Gonda


Wiek: 29
Posty: 300
Podziękowania: 14/61
Skąd: Warszawa
Wysłany: 2018-09-07, 22:05   

Spróbowałem dodać Continue() oraz przenieść blok z odpoczynkiem na początek skryptu - nie pomogło. Troszeczkę zmieniłem kodowanie, przez co rozmowa po odpoczynku uruchamia się, ale tylko w momencie, gdy kliknie się ikonkę rozmowy na Mirandzie. Po sprawdzeniu w sejwie wszystkie warunki są już na swoich miejscach - problem polega teraz na tym, że gra sama nie wyrzuca dialogu po odpoczynku (identyczne kodowanie mam przy 4 innych NPC i rozmowy po odpoczynkach nie działają, więc przyznam szczerze, że ta sytuacja doprowadza mnie już do szału).

Przez pół dnia analizowałem dziś podesłany link, ale nie udało mi się znaleźć rozwiązania. Dradiel, zgodnie z Twoją sugestią podsyłam zatem większą część skryptu z wyboldowaniem tych dialogów, przy których pojawia się problem. Może Twoje mądre oczy dojrzą coś, czego moje nie mogą znaleźć od ponad tygodnia...


//pierwsza rozmowa - Miranda zaczyna rozmowę
IF
See(Player1)
NumTimesTalkedTo(0)
Global("MIRANDAJoinInnitial","GLOBAL",0)
THEN
RESPONSE #100
SetGlobal("MIRANDAJoinInnitial","GLOBAL",1)
MoveToObject(Player1)
StartDialogueNoSet(Player1)
END

IF
HaveSpell("BEASTMASTER_FIND_FAMILIAR")
THEN
RESPONSE #100
RemoveSpell("BEASTMASTER_FIND_FAMILIAR")
END

//reputacja
//rozmowa-ostrzeżenie
IF
InParty(Myself)
See(Player1)
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
ReputationLT(Player1,8)
Global("MIRANDALowReputation","GLOBAL",0)
THEN
RESPONSE #100
SetGlobal("MIRANDALowReputation","GLOBAL",1)
END

IF
Global("MIRANDALowReputation","GLOBAL",1)
THEN
RESPONSE #100
StartDialogue("MIRANDAJ",Player1)
END

//powrót warunku przy podniesieniu reputacji
IF
InParty(Myself)
See(Player1)
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
ReputationGT(Player1,7)
Global("MIRANDALowReputation","GLOBAL",2)
THEN
RESPONSE #100
SetGlobal("MIRANDALowReputation","GLOBAL",0)
END

//odejście z drużyny
IF
InParty(Myself)
See(Player1)
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
ReputationLT(Player1,4)
Global("MIRANDALowestReputation","GLOBAL",0)
THEN
RESPONSE #100
SetGlobal("MIRANDALowestReputation","GLOBAL",1)
END

IF
Global("MIRANDALowestReputation","GLOBAL",1)
THEN
RESPONSE #100
StartDialogue("MIRANDAJ",Player1)
END

//rozpoczęcie questu
IF
InParty(Myself)
Global("MIRANDAQuestActive","GLOBAL",0)
Global("MIRANDAQuestTalk","GLOBAL",0)
THEN
RESPONSE #100
SetGlobal("MIRANDAQuestActive","GLOBAL",1)
SetGlobal("MIRANDAQuestTalk","GLOBAL",1)
RealSetGlobalTimer("MIRANDAQuestTimer","GLOBAL",180) //pierwszy dialog w 3 minuty po rozpoczęciu znajomości
END

IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",1)
RealGlobalTimerExpired("MIRANDAQuestTimer","GLOBAL")
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//przypomnienie o pójściu do Kniei Larsa, po trzech dniach od przyłączenia
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",2)
Global("MIRANDAremind1","GLOBAL",0)
RealGlobalTimerExpired("MIRANDARemindTimer","GLOBAL")
THEN
RESPONSE #100
StartDialogue("MIRANDAJ",Player1)
END

//opuszczenie drużyny z powodu niepójścia do Kniei Larsa, po trzech dniach od momentu ostrzeżenia o odejściu
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",2)
Global("MIRANDAremind2","GLOBAL",0)
RealGlobalTimerExpired("MIRANDARemindTimer2","GLOBAL")
THEN
RESPONSE #100
StartDialogue("MIRANDAJ",Player1)
END

//po wejściu do Kniei Larsa
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
AreaCheck("AR2900")
!Dead("CORSONE")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",2)
THEN
RESPONSE #100
SetGlobal("MIRANDAQuestTalk","GLOBAL",3)
END

IF
Global("MIRANDAQuestTalk","GLOBAL",3)
THEN
RESPONSE #100
StartDialogue("MIRANDAJ",Player1)
END

//po puszczeniu Corsone wolno
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Global("MirandaCorsone","GLOBAL",1)
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",4)
THEN
RESPONSE #100
StartDialogue("MIRANDAJ",Player1)
END

//po zabiciu Corsone
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Dead("CORSONE")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",4)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//w godzinę po zabiciu Corsone
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
RealGlobalTimerExpired("MIRANDAQuestTimer","GLOBAL")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",5)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//w godzinę po ostatniej rozmowie
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
RealGlobalTimerExpired("MIRANDAQuestTimer","GLOBAL")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",6)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//przypomnienie o ponownym pójściu do Kniei Larsa
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",7)
Global("MIRANDAremind3","GLOBAL",0)
RealGlobalTimerExpired("MIRANDARemindTimer3","GLOBAL")
THEN
RESPONSE #100
StartDialogue("MIRANDAJ",Player1)
END

//opuszczenie drużyny z powodu niepójścia do Kniei Larsa
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",7)
Global("MIRANDAremind4","GLOBAL",0)
RealGlobalTimerExpired("MIRANDARemindTimer4","GLOBAL")
THEN
RESPONSE #100
StartDialogue("MIRANDAJ",Player1)
END

//po wydaniu Mirandy Alaricowi
IF
InParty(Myself)
See(Player1)
See("Alaric")
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",8)
Global("MirandaAlaric","GLOBAL",1)
THEN
RESPONSE #100
MoveToObject(Player1)
StartDialogue("MIRANDAJ",Player1)
END

//po zabiciu Alarica
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Dead("ALARIC")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",8)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//po zabiciu Radusha
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Dead("RADUSH")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",10)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//po rozmowie z Enderem
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
PartyHasItem("SCRL2Y")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",11)
THEN
RESPONSE #100
MoveToObject(Player1)
StartDialogue("MIRANDAJ",Player1)
END

//po wejściu do Kniei Otulisko IV
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
AreaCheck("AR1700")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",12)
THEN
RESPONSE #100
SetGlobal("MIRANDAQuestTalk","GLOBAL",13)
END

IF
Global("MIRANDAQuestTalk","GLOBAL",13)
THEN
RESPONSE #100
StartDialogue("MIRANDAJ",Player1)
END

//w dwie godziny po opuszczeniu Kniei Otulisko
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
RealGlobalTimerExpired("MIRANDAQuestTimer","GLOBAL")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",14)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//po odczytaniu listu od Mercka
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
PartyHasItem("BOOKIMI")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",16)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//po zabiciu Mercka
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Dead("MERCK")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",18)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//w dwie godziny po zabiciu Mercka
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
RealGlobalTimerExpired("MIRANDAQuestTimer","GLOBAL")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",19)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//po spotkaniu z Medithem
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",21)
THEN
RESPONSE #100
StartDialogue("MIRANDAJ",Player1)
END

//w godzinę po spotkaniu z Medithem (przy aktywnym pre-romansie)
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
RealGlobalTimerExpired("MIRANDAQuestTimer","GLOBAL")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",22)
OR(2)
Global("MIRANDARomanceActive","GLOBAL",1)
Global("MIRANDARomanceActive","GLOBAL",2)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//w godzinę po spotkaniu z Medithem (przy nieaktywnym pre-romansie)
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
RealGlobalTimerExpired("MIRANDAQuestTimer","GLOBAL")
Global("MIRANDAQuestActive","GLOBAL",1)
Global("MIRANDAQuestTalk","GLOBAL",22)
OR(2)
Global("MIRANDARomanceActive","GLOBAL",0)
Global("MIRANDARomanceActive","GLOBAL",3)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//rozpoczęcie i przebieg znajomości
IF
InParty(Myself)
Global("MIRANDAFriendshipActive","GLOBAL",0)
Global("MIRANDAIsTalking","GLOBAL",0)
THEN
RESPONSE #100
SetGlobal("MIRANDAFriendshipActive","GLOBAL",1)
SetGlobal("MIRANDAIsTalking","GLOBAL",1)
RealSetGlobalTimer("MIRANDATimer","GLOBAL",3600)
END

IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
RealGlobalTimerExpired("MIRANDATimer","GLOBAL")
Global("MIRANDAFriendshipActive","GLOBAL",1)
OR(4)
Global("MIRANDAIsTalking","GLOBAL",1)
Global("MIRANDAIsTalking","GLOBAL",3)
Global("MIRANDAIsTalking","GLOBAL",7)
Global("MIRANDAIsTalking","GLOBAL",9)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

//rozmowa na powietrzu
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
RealGlobalTimerExpired("MIRANDATimer","GLOBAL")
Global("MIRANDAFriendshipActive","GLOBAL",1)
AreaType([OUTDOOR])
Global("MIRANDAIsTalking","GLOBAL",5)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR")
StartDialogue("MIRANDAJ",Player1)
END

IF
OR(4)
Global("MIRANDAIsTalking","GLOBAL",2)
Global("MIRANDAIsTalking","GLOBAL",4)
Global("MIRANDAIsTalking","GLOBAL",6)
Global("MIRANDAIsTalking","GLOBAL",8)
THEN
RESPONSE #100
IncrementGlobal("MIRANDAIsTalking","GLOBAL",1)
RealSetGlobalTimer("MIRANDATimer","GLOBAL",3600)
END

//warunki dla pre-romansu
IF
InParty(Myself)
Gender(Player1,MALE)
OR(2)
Alignment(Player1,MASK_GOOD)
Alignment(Player1,NEUTRAL)
OR(3)
Race(Player1,ELF)
Race(Player1,HUMAN)
Race(Player1,HALF_ELF)
ReputationGT([PC],9)
CheckStatGT(Player1,10,WIS)
Global("MIRANDAMatch","GLOBAL",0)
THEN
RESPONSE #100
SetGlobal("MIRANDAMatch","GLOBAL",1)
END

IF
Global("MIRANDAMatch","GLOBAL",1)
Global("MIRANDAFriendshipActive","GLOBAL",2)
Global("MIRANDARomanceActive","GLOBAL",0)
Global("MIRANDALoveTalk","GLOBAL",0)
THEN
RESPONSE #100
SetGlobal("MIRANDARomanceActive","GLOBAL",1)
SetGlobal("MIRANDALoveTalk","GLOBAL",1)
RealSetGlobalTimer("MIRANDARomanceTimer","GLOBAL",3600)
END

//przebieg pre-romansu
IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
ReputationGT([PC],9)
RealGlobalTimerExpired("MIRANDARomanceTimer","GLOBAL")
OR(2)
Global("MIRANDARomanceActive","GLOBAL",1)
Global("MIRANDARomanceActive","GLOBAL",2)
OR(7)
Global("MIRANDALoveTalk","GLOBAL",1)
Global("MIRANDALoveTalk","GLOBAL",3)
Global("MIRANDALoveTalk","GLOBAL",5)
Global("MIRANDALoveTalk","GLOBAL",7)
Global("MIRANDALoveTalk","GLOBAL",11)
Global("MIRANDALoveTalk","GLOBAL",15)
Global("MIRANDALoveTalk","GLOBAL",19)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR2")
StartDialogue("MIRANDAJ",Player1)
END

IF
PartyRested()
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
ReputationGT([PC],9)
RealGlobalTimerExpired("MIRANDARomanceTimer","GLOBAL")
Global("MirandaRadush","GLOBAL",1)
Global("MIRANDARomanceActive","GLOBAL",1)
Global("MIRANDALoveTalk","GLOBAL",9) //rozmowa uwarunkowana odpoczynkiem
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR2")
StartDialogue("MIRANDAJ",Player1)
END


IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
ReputationGT([PC],9)
RealGlobalTimerExpired("MIRANDARomanceTimer","GLOBAL")
GlobalGT("CHAPTER","GLOBAL",4)
Global("MIRANDARomanceActive","GLOBAL",2)
Global("MIRANDALoveTalk","GLOBAL",13)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR2")
StartDialogue("MIRANDAJ",Player1)
END

IF
InParty(Myself)
See(Player1)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
ReputationGT([PC],9)
RealGlobalTimerExpired("MIRANDARomanceTimer","GLOBAL")
GlobalGT("CHAPTER","GLOBAL",6)
Global("MIRANDARomanceActive","GLOBAL",2)
Global("MIRANDALoveTalk","GLOBAL",17)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("N#VMIR2")
StartDialogue("MIRANDAJ",Player1)
END

IF
OR(2)
Global("MIRANDARomanceActive","GLOBAL",1)
Global("MIRANDARomanceActive","GLOBAL",2)
OR(9)
Global("MIRANDALoveTalk","GLOBAL",2)
Global("MIRANDALoveTalk","GLOBAL",4)
Global("MIRANDALoveTalk","GLOBAL",6)
Global("MIRANDALoveTalk","GLOBAL",8)
Global("MIRANDALoveTalk","GLOBAL",10)
Global("MIRANDALoveTalk","GLOBAL",12)
Global("MIRANDALoveTalk","GLOBAL",14)
Global("MIRANDALoveTalk","GLOBAL",16)
Global("MIRANDALoveTalk","GLOBAL",18)
THEN
RESPONSE #100
IncrementGlobal("MIRANDALoveTalk","GLOBAL",1)
RealSetGlobalTimer("MIRANDARomanceTimer","GLOBAL",3600)
END
_________________
BGEE 10 NPC PROJECT: NOWE POSTACI, NOWE ROMANSE, NOWE PRZYGODY!
Podziękuj autorowi tego posta
 
 
dradiel 
Dziecię Bhaala
Jeździec Shaundakula

Posty: 1598
Podziękowania: 750/107
Wysłany: 2018-09-08, 07:43   

Co rozumiesz pod pojęciem, że umieściłeś go na początku? Umieściłeś blok na pierwszej pozycji dla testu? Skrypt przypięty jest do postaci na pozycji OVERRIDE?

Cytat:
There are 7 script levels which can be assigned to every creature: Override, Area, Specifics, Class, Race, General and Default. They are processed in that order; the first script is parsed, and if nothing in it executes, the game moves onto the next script, and so on. If anything is executed, a new cycle begins.


W przypadku postaci wszystkie skrypty do niej przypięte są traktowane jako jeden.

Zakładając, że dałeś w override, drugi blok jest dla mnie podejrzany:

IF
HaveSpell("BEASTMASTER_FIND_FAMILIAR")
THEN
RESPONSE #100
RemoveSpell("BEASTMASTER_FIND_FAMILIAR")
END

Ten blok moim zdaniem powinien mieć Continue(), albo dodaj go na koniec pliku .bcs, tak żeby był za blokiem z PartyRested(). Tak swoją drogą wrzucaj bloki z PartyRested na początek skryptu.

Powyższy blok zawsze zachodzi po odpoczynku i restartuje wykonywanie skryptu. Zamiast usunąć umiejętność specjalną raz, a dobrze usuwasz po każdym odpoczynku zapamiętaną umiejętność. Stwórz pliczek .spl usuwający tą umiejętność i wywołaj go w skrypcie poleceniem ApplySpellRES. Takie rozwiązanie jest bardziej eleganckie, usuniesz umiejętność raz a dobrze.


Jeśli Twój blok z PartyRested() jest za nim to nigdy się nie wykona. PartyRested() to trigger który jest prawdziwy chwilę po zdarzeniu, zdarzenie właśnie zaszło. Skoro właśnie zaszło, to nie może być prawdziwe w drugim, trzecim, czy dziesiątym obiegu skryptu. Drużyna właśnie się przespała, a nie sekundę, dwie, czy dziesięć temu. Prawdziwy jest przy pierwszym przebiegu po zdarzeniu, czyli odpoczynku drużyny.

Co dzieje się w tym przypadku? Drużyna idzie spać. Po zakończeniu odpoczynku skrypt postaci rozpoczyna przebieg od początku. Gra sprawdza pierwszy blok, jeśli jest false idzie dalej. Napotyka drugi blok i po śnie jest on zawsze true. Nie ma Continue() więc wykonywanie skryptu jest restartowane. Zaczyna się kolejny przebieg. Wszystkie Warunki PartyRested() są false. Tak będzie z jakimkolwiek blokiem, który okaże się true, który jest przed Twoim blokiem z PartyRested().

A dlaczego działa w takim razie dialog jak kliknie się na postać? Ponieważ w pliku dialogowym postaci pewnie wszystkie warunki uruchamiające ten dialog masz prawdziwe. W tym momencie wywołania nie blokuje PartyRested() ze skryptu. Zdarza się z tego co widziałem, że w niektórych modach PartyRested() jest wstawiane w skrypcie dialogowym, co moim zdaniem nie ma sensu. Przypuszczam, że w dialogach jest ono zawsze traktowane jako true, ale testów tego nie prowadziłem.

Powołujesz się na swoje inne postacie, że tam wszystko działa jak powinno, a czy w nich byłeś zmuszony usuwać umiejętność specjalną skryptem? Jeśli nie to byłaby wskazówka, że mogę mieć rację i ten wskazany przez mnie blok jest problemem

To tyle mojego teoretyzowania patrząc na kod Twojego skryptu. Mam nadzieję, że moje przypuszczenia na sucho bez testu na działającej grze coś ci pomogą w rozwiązaniu problemu.

Tak jeszcze przy okazji moja uwaga na temat poniższego bloku:

IF
See(Player1)
NumTimesTalkedTo(0)
Global("MIRANDAJoinInnitial","GLOBAL",0)
THEN
RESPONSE #100
SetGlobal("MIRANDAJoinInnitial","GLOBAL",1)
MoveToObject(Player1)
StartDialogueNoSet(Player1)
END

MoveToObject(Player1)
StartDialogueNoSet(Player1)


Obie powyższe akcje załatwia: Dialogue(Player1)
Podziękuj autorowi tego posta
 
 
Więcej szczegółów
Za tę wypowiedź podziękowali:
nowus777
nowus777 
Uczeń Gonda


Wiek: 29
Posty: 300
Podziękowania: 14/61
Skąd: Warszawa
Wysłany: 2018-09-08, 12:12   

Dradiel, Zed Nocear - nie ma słów, które wyraziłyby moją wdzięczność. Po prostu dziękuję za wszystkie rady i sposoby na rozwiązanie moich problemów. Dzięki takim jak Wy nadal nie zrezygnowałem.

W przypadku powyższego problemu z dialogiem kłania się moje czytanie ze zrozumieniem - dotychczas tkwiłem w przekonaniu, że gra nie sprawdza skryptu z usunięciem umiejętności po każdym odpoczynku. Przestawienie tego bloku na sam koniec w pliku .baf rozwiązało problem. Oczywiście popracuję nad tym, aby całkowicie ją usunąć z tego bloku i skorzystać z ApplySpellRES. Dzięki też za dokładne wytłumaczenie "jak to działa" przy odpoczynku oraz za wszystkie dodatkowe uwagi.

Na ten moment pozostały mi do rozwiązania 2 problemy: brak komaptybilności z EET (w tej sprawie napisałem już do K4thosa) oraz dziennik, który nadal nie działa tak, jakbym tego chciał. To już ostatni z moich problemów, a zatem pozwolę sobie spróbować go opisać - może znów dzięki Wam okaże się, że rozwiązanie problemu jest błahe.

Wpisy do dziennika nadal pojawiają się w zakładce typowo "dziennikowej", a nie "questowej". Poza tym przy wpisach brak tytułów. Poniżej przedstawię, jakie warunki umieściłem w poszczególnych rodzajach plików.

W pliku setup.tp2 mam:

ADD_JOURNAL TITLE (@0) @1 @2 @3 USING ~mode\tra\%LANGUAGE%\NPCJ.tra~

W NPCJ.tra mam:

@0 = ~title~
@1 = ~bla bla1~
@2 = ~bla bla2~
@3 = ~bla bla3~

W NPCJ.d mam np:

IF~~THEN BEGIN SIMPLE1
SAY~qwertyyuui~
IF~~THEN DO~SetGlobal("nevermind","GLOBAL",2)~UNSOLVED_JOURNAL @1 EXIT
END

lub np.

IF~~THEN BEGIN SIMPLE2
SAY~qwertyyufdgfghghgghhfui~
IF~~THEN DO~SetGlobal("neverminddfsdfgfg","GLOBAL",4) EraseJournalEntry(@1)~SOLVED_JOURNAL @3 EXIT
END

Dodam, że w celu sprawdzenia poprawności działania dziennika, zawsze instaluję swój mod na czystym BGEE. Próbowałem już przenieść wszystkie wpisy z dziennika do jednego pliku, a mianowicie do setup.tra, ale to również nie zdało egzaminu. Dodam, że tak przekodowałem pliki, aby wszystkie wpisy do dziennika zawsze pochodziły z jego pliku - w przypadku każdego NPC jest to plik dialogu NPCJ.d.

EDIT: dziennik działa :) jego poprawność działania testowałem w prologu (poprzez przywołanie postaci, przez co dziennik nie działał... natomiast od 1. rozdziału już wszystko ładnie śmiga)
_________________
BGEE 10 NPC PROJECT: NOWE POSTACI, NOWE ROMANSE, NOWE PRZYGODY!
  
Podziękuj autorowi tego posta
 
 
Ruffle_truffle 


Wiek: 30
Posty: 877
Podziękowania: 28/80
Skąd: Podkarpacie
Wysłany: 2018-09-23, 18:02   

To bardziej prośba o poradę. Oprócz npców, których jest od groma, mam w planach podklasy. Jedna z dziwniejszych - muni, zakłada, że od 2. Poziomu nałożony zostaje efekt ciszy. Zdolność milcząca mowa zezwala na komunikację. I tu są lekkie schody. W teorii wydaje się to być proste - nałożyć podklasie "pas cnoty" za pomocą disable Button active_p. Dać też stałe ugłosowienie i zdolność, jaka uruchamia przycisk. Jednak przydałaby się dla pewności cisza, choć to bardzo ogranicza. W postaci zwierzęcej nie można zainicjować dialogu, lecz można chyba być zaczepionym i mówić. Z kolei Cure: silence działa jak vocalize, ale nie wiem, czy wpływa na inne dźwięki czy mowę właśnie. Gdyby ograniczyć milczenie do braku możliwości inicjowania dialogu (stałe disable button), to można by dać krótszy czas enable talk button. W każdym razie Cure: silence (vocalize) ma jakieś dziwne obostrzenia jeśli chodzi o duration i nie wiem, czy nie jest to jak state: vocalize i nie wpływa na mowę.

Tu, oprócz porady co do technicznych aspektów, chciałbym poznać opinię co do fabularnych. Disable talk button i enable byłoby najprostsze, lecz wtedy muni za dużo by chyba gadał. Z drugiej strony, umożliwiłoby to grę w warunkach fabularnego BG. I wymagało wzmianki o używaniu milczącej mowy w przypadku zaczepienia przez kogoś - wtedy zdolność trwałaby krócej. W grę wchodzą też języki migowe. Istnieje chyba wspólny migowy, ale nie każdy go zna?
_________________
Yakman gadał, gadał, cały czas gadał...
Podziękuj autorowi tego posta
 
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  
Powered by phpBB modified by Przemo © 2003 phpBB Group