Monologi 44115 4

O temacie

Autor

Zaczęty 20.01.2008 roku

Wyświetleń 44115

Odpowiedzi 4

Kazzmir
  • Gość
Cytat: Zysk link=topic=99.msg364#msg364 date=Jul 31 2006, 17:15\'
Po pierwsze to musimy przygotować plik spania, mianowicie zmieniamy funkcję SLEEPABIT_S1:
var int monolog;
const int m_sleep=0;
func void sleepabit_s1()
{
 if(Npc_IsPlayer(self))
 {
  monolog=m_sleep;
  self.aivar[AIV_INVINCIBLE]=TRUE;
  Ai_ProcessInfos(self);
 };
};
Zaś wszystkie condition opcji spania zmieniamy na ism_sleep:
func int ism_sleep()
{
 return (monolog==m_sleep);
};
Teraz jak chcemy, aby było również w innych sytuacjach niż spanie to przedstawię na przykładzie gotowania (a jak!). Wszystkim kotłom ustawiamy w Spacerze OnStateFunction na COOKABIT i definiujemy funkcję:
const int m_cook=1;//inny niż sleep i inne monologi
func void cookabit_s1()
{
 if(Npc_IsPlayer(self))
 {
  monolog=m_cook;
  self.aivar[AIV_INVINCIBLE]=TRUE;
  Ai_StartProcessInfo(self);
 };
};
func int ism_cook()
{
 return (monolog==m_sleep);
};
I teraz definiujemy odpowiednie dialogi:
INSTANCE PC_NoCook (c_Info) //Warto pamiętać o końcu rozmowy :D
{
npc    = PC_Hero; // Ważne
nr    = 999;
condition  = ism_cook;
information  = PC_NoCook_Info;
important  = 0;
permanent  = 1;
description  = DIALOG_ENDE;
};
func VOID PC_NoCook_Info()
{
// W przypadku alchemii przydałoby się zwrócić flaszkę potrzebną do rozpoczęcia pracy
AI_StopProcessInfos (self);
self.aivar[AIV_INVINCIBLE]=FALSE;

};
INSTANCE PC_CookMineCrawlerSoup (c_Info) //Warto pamiętać o końcu rozmowy :D
{
npc    = PC_Hero; // Ważne
condition  = PC_CookMineCrawlerSoup_Condition;
information  = PC_CookMineCrawlerSoup_Info;
important  = 0;
permanent  = 1;
description  = "Gotuj pełzaczaną";
};
func int PC_CookMineCrawlerSoup_Condition()
{
 return(ism_cook()&&umiem); //umiem jest ustawione na tak jeżeli nas ktoś tego nauczy
};
func VOID PC_NoCook_Info()
{
 if(mam_skladniki()) //oczywiście nie trzeba wszystkiego robić w oddzielnych funkcjach
 {
  usun_skladniki();
  dodaj_zupe();
  zabulgaj();
 }
 else
 {
  Print("Zupę pełzaczaną robi się z pełzacza, skombinuj sobie najpierw jakiegoś");
 };
};
 

Jurigag

Jurigag

Użytkownicy
posty869
Propsy285
ProfesjaSkrypter
  • Użytkownicy

Jurigag

Monologi
#1 2009-05-21, 15:50(Ostatnia zmiana: 2009-07-11, 15:08)
Uznałem iż temat, który znajduje się aktualnie na forum ciężko jest ogarnąć, bo jest wszystko niedokładnie napisane. Opiszę tu ładniej.

1. Pierwsze co należy zrobić to zdefiniować w STORY_GLOBALS 2 stałe(jeśli chcecie dodać jeden monolog) oraz 1 zmienną:

const int m_ore=2;To do Monologa jakiego chcecie dodać. Oczywiście m_ore może być zupełnie inny tekst.(w naszym przypadku taki)
const int m_sleep=1;To od Spania. Może być również inny. Ważny aby również było.
var int monolog;To zmienna monolog, w zależności od jej wartości taki będziemy mieli monolog.

2. Teraz należy zmienić skrypt spania.
 a)func void PC_Sleep (var int t)
{
AI_StopProcessInfos(self); // [SK] ->muss hier stehen um das update zu gewährleisten
self.aivar[AIV_INVINCIBLE]=FALSE;
if (Wld_IsTime(00,00,t,00))
{
Wld_SetTime (t,00);
}
else
{
t = t + 24;
Wld_SetTime (t,00);
};

PrintScreen ("Sen dobrze ci zrobił.", -1,-1,"font_old_20_white.tga",3);
hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS_MAX];
hero.attribute[ATR_MANA] = hero.attribute[ATR_MANA_MAX];

//-------- AssessEnterRoom-Wahrnehmung versenden --------
PrintGlobals (PD_ITEM_MOBSI);
Npc_SendPassivePerc (hero, PERC_ASSESSENTERROOM, NULL, hero); //...damit der Spieler dieses Feature nicht zum Hütteplündern ausnutzt!
};

Najpierw to. Nad
Cytuj
AI_StopProcessInfos(self);
dodajemy MONOLOG=0.

b)func void SLEEPABIT_S1 ()
{
var C_NPC her; her = Hlp_GetNpc(PC_Hero);
var C_NPC rock; rock = Hlp_GetNpc(PC_Rockefeller);

//***ALT** if (Hlp_GetInstanceID (self)== Hlp_GetInstanceID (Hero)) // MH: geändert, damit kontrollierte NSCs nicht schlafen können!
if ( (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))||(Hlp_GetInstanceID(self)==Hlp
_GetInstanceID(rock)) )
{
self.aivar[AIV_INVINCIBLE]=TRUE;
Ai_ProcessInfos (her);
};
};

Następnie tutaj nad linią
Cytuj
var C_NPC her;    her = Hlp_GetNpc(PC_Hero);
dodajemy MONOLOG=M_SLEEP;

c)teraz ostatni krok ze spaniem - zmieniamy każdy warunek (condition) każdej instancji, dodając zamiast {
return 1;
};

Następujący warunek:

if (MONOLOG == M_SLEEP)
{
return 1;
};

Po prostu jeśli zmienna MONOLOG == M_SLEEP to dialog zostanie pokazany, a jeśli nie to nie.
Zmieniamy tak każdy warunek każdego dialogu i idziemy dalej. Tym razem dodajemy już do naszego skryptu.

3.Nasz Skrypt
 a)Przykładem będzie tu prosty skrypt kopania rudy(można go wykorzystać jakby co)
func void oreabit_s1()
{
MONOLOG=M_ORE;
self.aivar[AIV_INVINCIBLE]=TRUE;
Ai_ProcessInfos(self);
};

Na początku tworzymy naszą funkcję oreabit_s1. Zmienia on zmienną monolog na m_ore
b)
func void ore()
{
self.aivar[AIV_INVINCIBLE] = FALSE;
if (a == 0)
{
PrintScreen("Udało ci się wydobyć 5 bryłek rudy!.",-1,-1,"font_old_20_white.tga",3);
}
else
{
PrintScreen("Udało ci się wydobyć 10 bryłek rudy!.",-1,-1,"font_old_20_white.tga",3);
};
MONOLOG=0;
AI_StopProcessInfos (self);
};

func void no_ore()
{
self.aivar[AIV_INVINCIBLE] = FALSE;
PrintScreen("Nie udało ci się nic wydobyć!.",-1,-1,"font_old_20_white.tga",3);
MONOLOG=0;
AI_StopProcessInfos (self);

};

instance noore1(C_Info)
{
npc = PC_Hero;
nr = 999;
condition = noore1_condition;
information = noore1_info;
important = 0;
permanent = 1;
description = "Nie potrafisz wydobywać rudy!.";
};

func int noore1_condition()
{
if (MONOLOG == M_ORE) && (ORE_LERNED == FALSE)
{
return 1;
};
};

func void noore1_info()
{
MONOLOG=0;
AI_StopProcessInfos (self);
self.aivar[AIV_INVINCIBLE] = FALSE;
};

instance ore1(C_Info)
{
npc = PC_Hero;
condition = ore1_condition;
information = ore1_info;
important = 0;
permanent = 1;
description = "Wydobywaj rudę.";
};

func int ore1_condition()
{
if (MONOLOG == M_ORE) && (ORE_LERNED == TRUE)
{
return 1;
};
};

func int ore1_info()
{
var int ORE_SUC;
ORE_SUC = Hlp_Random(3)
if (ORE_SUC <= 1)//
{
 ORE_Y = Hlp_Random(2);//
 a = ORE_Y;
if (ORE_Y == 0)
{
CreateInvItems(hero,ItMiNugget,5);
}
else
{
CreateInvItems(hero,ItMiNugget,10);
};
 ore();
}
else
{
no_ore();
};
};

O to reszta skryptu. Nie będę wszystkiego komentował. Dodam jedynie tyle, że można z niego korzystać. Nad
Cytuj
AI_StopProcessInfos (self);
zawsze musi być
Cytuj
MONOLOG=0
oraz w każdej sekcji condition każdego dialogu należy dodać odpowiedni warunek. Można z tego korzystać jak co. 66% na wydobycie i maks. 10 bryłek rudy.

4.Na koniec dodajemy do każdej Bryłki Rudy w Spacerze, tam gdzie w Objects OnStateFunc wpisujemy OREABIT. Mam nadzieję iż tutek się przyda bo zanim ogarnąłem ten co się znajduje tutaj na forum minęło z 5 godzin.....
 
Skrypter/Tester - Szukasz testera/skryptera - Pisz !

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy
Zobaczymy czy ktoś mi tu odpowie. :D
Gdzie zdefiniowane są zmienne a i ORE_Y. W sumie to ORE_Y jest definiowane przez a tutaj:
Cytuj
ORE_Y = Hlp_Random(2);//
 a = ORE_Y;
Ale zmienna a już nigdzie zdefiniowana nie jest. Czy dodanie na samej górze
Cytuj
var int a;
załatwi sprawę?
 

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy

Ebhodini

Monologi
#3 2019-12-01, 10:30(Ostatnia zmiana: 2019-12-02, 09:10)
Po wejściu do kopalni każdy kopacz, który wydobywa rudę automatycznie próbuje rozpocząć ze mną dialog nieważne jak daleko stoję, np jestem koło Drakea a dialog nawązuje się z Glen bo jako pierwszy zaczął kopać jak wyłączę dialog to od razu "woła" minie Grimes chociaż jest parę pięter niżej itd. Tak jakby ten skrypt był początkiem dialogu z graczem, a nie monologiem z rudą.

Edit. Już wszystko działa dodałem na górze skryptu, że wykonuje się tylko jeśli Npc_IsPlayer. :D
 

Othello

Othello

Użytkownicy
posty20
Propsy2
ProfesjaLvl designer
  • Użytkownicy

Othello

Monologi
#4 2020-06-19, 17:09(Ostatnia zmiana: 2020-07-02, 21:23)
Nie działa ani pierwszy sposob ani drugi :D + monolog = 0; zzabrakło srednika
func void cookabit_s1()
{
 if(Npc_IsPlayer(self))
  {
MONOLOG = m_cook;
self.aivar[AIV_INVINCIBLE]=TRUE;
Ai_ProcessInfos(self);
  };
};
Na poczatku kazdego nowego monologu (gotowanie, kowalstwo etc) dać ten warunek, aby korzystający NPC nie triggerowali obiektu, który wchodził w dialog z naszą postacią, dokładnie chodzi o

if(Npc_IsPlayer(self))
{

}

Jakby ktoś miał wątpliwość jak powinno to wyglądać, to tutaj macie całość już zmieniona:
func void PC_Sleep(var int t)
{
 if(Npc_IsPlayer(self))
     {
        monolog = 0;
AI_StopProcessInfos(self);
self.aivar[AIV_INVINCIBLE] = FALSE;
     
if(Wld_IsTime(0,0,t,0))
{
Wld_SetTime(t,0);
}
else
{
t = t + 24;
Wld_SetTime(t,0);
};
PrintScreen("Nie spałeś zbyt dobrze...",-1,-1,"font_old_20_white.tga",3);
// hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS_MAX];
// hero.attribute[ATR_MANA] = hero.attribute[ATR_MANA_MAX];
PrintGlobals(PD_ITEM_MOBSI);
Npc_SendPassivePerc(hero,PERC_ASSESSENTERROOM,NULL,hero);
      };
};

func void sleepabit_s1()
{
        monolog = m_sleep;
var C_Npc her;    her = Hlp_GetNpc(PC_Hero);
var C_Npc rock; rock = Hlp_GetNpc(PC_Rockefeller);

if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(her)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(rock)))
{
self.aivar[AIV_INVINCIBLE] = TRUE;
AI_ProcessInfos(her);
};
};

instance PC_NoSleep(C_Info)
{
npc = PC_Hero;
nr = 999;
condition = PC_NoSleep_Condition;
information = PC_NoSleep_Info;
important = 0;
permanent = 1;
description = DIALOG_ENDE;
};

func int PC_NoSleep_Condition()
{
    if (MONOLOG == M_SLEEP)
{
    return 1;
};
};

func void PC_NoSleep_Info()
{
AI_StopProcessInfos(self);
self.aivar[AIV_INVINCIBLE] = FALSE;
};


instance PC_SleepTime_Morning(C_Info)
{
npc = PC_Hero;
condition = PC_SleepTime_Morning_Condition;
information = PC_SleepTime_Morning_Info;
important = 0;
permanent = 1;
description = "Śpij do następnego poranka";
};


func int PC_SleepTime_Morning_Condition()
{
    if (MONOLOG == M_SLEEP)
{
    return 1;
};
};

func void PC_SleepTime_Morning_Info()
{
PC_Sleep(8);
};


instance PC_SleepTime_Noon(C_Info)
{
npc = PC_Hero;
condition = PC_SleepTime_Noon_Condition;
information = PC_SleepTime_Noon_Info;
important = 0;
permanent = 1;
description = "Śpij do południa";
};


func int PC_SleepTime_Noon_Condition()
{
    if (MONOLOG == M_SLEEP)
{
    return 1;
};
};

func void PC_SleepTime_Noon_Info()
{
PC_Sleep(12);
};


instance PC_SleepTime_Evening(C_Info)
{
npc = PC_Hero;
condition = PC_SleepTime_Evening_Condition;
information = PC_SleepTime_Evening_Info;
important = 0;
permanent = 1;
description = "Śpij do następnego wieczora";
};


func int PC_SleepTime_Evening_Condition()
{
    if (MONOLOG == M_SLEEP)
{
    return 1;
};
};

func void PC_SleepTime_Evening_Info()
{
PC_Sleep(19);
};


instance PC_SleepTime_Midnight(C_Info)
{
npc = PC_Hero;
condition = PC_SleepTime_Midnight_Condition;
information = PC_SleepTime_Midnight_Info;
important = 0;
permanent = 1;
description = "Śpij do północy";
};


func int PC_SleepTime_Midnight_Condition()
{
    if (MONOLOG == M_SLEEP)
{
    return 1;
};
};

func int ism_sleep()
{
 return (monolog==m_sleep);
};

func void PC_SleepTime_Midnight_Info()
{
PC_Sleep(0);
};
 
Główny Administrator modyfikacji - Othello mode do Gothic 1


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry