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


Wiek: 49
Posty: 2042
Podziękowania: 253/49
Skąd: gród Vratislavia
Wysłany: 2018-09-06, 05: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: 330
Podziękowania: 11/63
Skąd: Warszawa
Wysłany: 2018-09-06, 19: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: 1650
Podziękowania: 774/110
Wysłany: 2018-09-07, 04: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: 330
Podziękowania: 11/63
Skąd: Warszawa
Wysłany: 2018-09-07, 21: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: 1650
Podziękowania: 774/110
Wysłany: 2018-09-08, 06: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: 330
Podziękowania: 11/63
Skąd: Warszawa
Wysłany: 2018-09-08, 11: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: 918
Podziękowania: 27/80
Skąd: Podkarpacie
Wysłany: 2018-09-23, 17: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
 
 
 
sajok 
Przyjaciel Klanu

Wiek: 45
Posty: 269
Podziękowania: 30/52
Skąd: Wrocław
Wysłany: 2018-10-28, 11:15   

Mam takie pytanie czysto teoretyczne dla ekspertów. Czy teoretycznie silnik infinity umożliwiłby stworzenie prostego moda na głód i pragnienie? Coś na zasadzie hardcora w Fallout NV lub nawet starych Eye of Beholer. Nie mam pojęcie o modowaniu infinity, ale trochę moduję w nowych Falloutach, więc zastanawiam się czy nie spróbować swoich sił w Baldursach. Nie interesują mnie mody fabularne, bo jest ich od groma, ale właśnie taki prosty mod, który dodał by taki survivalowy aspekt w BG.
Podziękuj autorowi tego posta
 
 
greegarak 

Wiek: 34
Posty: 395
Podziękowania: 35/48
Wysłany: 2018-10-28, 22:06   

sajok napisał/a:
Czy teoretycznie silnik infinity umożliwiłby stworzenie prostego moda na głód i pragnienie?Coś na zasadzie hardcora w Fallout NV lub nawet starych Eye of Beholer.

NIe znam się na możliwościach silnika (a w powyższe gry nie grałem), ale może:
- głód (też i pragnienie) mógłby być utożsamiany z obniżaniem się cech siły i konstytucji. Siła spadała by szybciej.
A to na pewno można dodać do głównego skryptu BALDUR.bcs, gdzie można przypisać licznik czasowy od ostatniego (8-mio h ) snu. Do zaspokajania głodu mogłyby wtedy posłużyć przedmioty, które cofałyby ten licznik.
Podziękuj autorowi tego posta
 
 
Więcej szczegółów
Za tę wypowiedź podziękowali:
sajok
sajok 
Przyjaciel Klanu

Wiek: 45
Posty: 269
Podziękowania: 30/52
Skąd: Wrocław
Wysłany: 2018-10-28, 23:20   

Właśnie o coś takiego mi chodziło. A mógłbyś mi jeszcze ewentualnie wskazać w którym skrypcie zawarte jest zmęczenie/sen, bo chciałbym się przyjrzeć temu skryptowi jak jest "zbudowany". Chyba właśnie mechanika głodu/pragnienia powinna działać na tej samej zasadzie co zmęczenia i snu. Tyle, że kolejna moja myśl jest taka, żeby tego raczej nie umieszczać w głównym skrypcie tylko w osobnym małym pliku skryptowym o ile tak się w infinity da. Moje skromne doświadczenie jest bowiem takie, żeby raczej nie mieszać i nie wrzucać nic do już istniejących plików a o ile to możliwe robić to osobno.
Podziękuj autorowi tego posta
 
 
greegarak 

Wiek: 34
Posty: 395
Podziękowania: 35/48
Wysłany: 2018-10-29, 19:41   

Za zmęczenie nie skrypt odpowiada a format plików 2da, czyli tabelarne wartości. I w tym zakresie nie da się chyba rozbudować silnik BG.
Zmęczenie (https://gibberlings3.github.io/iesdp/files/2da/2da_tob/fatigmod.htm) ma chyba współczynnik czasowy, choć nie wiem po jakim czasie jest pierwsza kara do szczęścia (czyli efekt zmęczenia).

Może więcej napiszę co miałem na myśli w poprzednim poście.
O śnie myślałem tylko dla tego że przyjąłem to jako czas gdy nie odczuwa się głodu a także go zaspokaja(ale tylko pełny sen - 8h, nikt nie chodzi spać głodny). Czyli, żeby nie umrzeć z głodu to można by spać w tawernie i nie martwić (jedyne ograniczenie to pieniądze) się jedzeniem. I tu nie ma survivalu (ale jest odprężenie). Survival zaczynał by się przy przechodzeniu między lokacjami, maratonami dni i nocy po których podróż trwająca więcej niż dzień odbierałaby siły.
I to jest jest możliwe tylko w skrypcie głównym, bo tylko on odmierzałby czas drużyny. Czyli dopisanie zmiennej, która by odejmowała Siłę i kondycję, przy warunkach czasowych i byłaby resetowana podczas pełnego snu(tawerna) bądź ewentualnie przez przedmioty redukowana.
sajok napisał/a:
ale właśnie taki prosty mod, który dodał by taki survivalowy aspekt w BG.

Czy byłby to prosty mod?. Nie wiem ,sam bym się za to nie zabrał. Szkoda zachodu.Aczkolwiek faublarnie , można by wtedy dodawać bantery o jedzeniu i stanach głodu i pragnienia.
Podziękuj autorowi tego posta
 
 
sajok 
Przyjaciel Klanu

Wiek: 45
Posty: 269
Podziękowania: 30/52
Skąd: Wrocław
Wysłany: 2018-10-29, 23:28   

Muszę skończyć swój mod do FNV, ale potem rzeczywiście pomyślę nad takim modem w BG, bo tchnąłeś szanowny greegaraku mi jakiś kierunek myślenia. Nie wiem czy coś z tego wyjdzie, ale pożyjemy, zobaczymy... W każdym razie jeszcze raz dzięki ;)
Podziękuj autorowi tego posta
 
 
Więcej szczegółów
Za tę wypowiedź podziękowali:
greegarak
nowus777 
Uczeń Gonda


Wiek: 29
Posty: 330
Podziękowania: 11/63
Skąd: Warszawa
Wysłany: 2018-10-30, 09:42   

sajok napisał/a:
Muszę skończyć swój mod do FNV, ale potem rzeczywiście pomyślę nad takim modem w BG, bo tchnąłeś szanowny greegaraku mi jakiś kierunek myślenia. Nie wiem czy coś z tego wyjdzie, ale pożyjemy, zobaczymy... W każdym razie jeszcze raz dzięki ;)


To ja tylko napiszę, że chętnie bym z takim modem zagrał. Trzymam kciuki Sajok!
_________________
BGEE 10 NPC PROJECT: NOWE POSTACI, NOWE ROMANSE, NOWE PRZYGODY!
Podziękuj autorowi tego posta
 
 
Więcej szczegółów
Za tę wypowiedź podziękowali:
sajok
Ruffle_truffle 


Wiek: 30
Posty: 918
Podziękowania: 27/80
Skąd: Podkarpacie
Wysłany: 2018-11-01, 18:05   

Da się czarownikowi zablokować pewne czary? Poczytajcie to:

Elfi dualista na poltergeist d&d. Klasa @Zireael, ale to nie jej pomysł. To z drugiej edycji d&d.

Taki specjalista, ale ma do wyboru dwie przeciwne szkoły. Np. nekromancję i iluzję. Mag to by nie był, ale jako czarownik?

Taki kit pack z elfimi czarownikami, myślę. Ale na razie myślę tylko.
_________________
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