SmithWeapons - jak dodać możliwość wykucia nowego przedmiotu na kowadle 303 4

O temacie

Autor pagi111

Zaczęty 13.01.2021 roku

Wyświetleń 303

Odpowiedzi 4

pagi111

pagi111

Użytkownicy
posty46
Propsy2
Profesjabrak
  • Użytkownicy
Cześć,

Próbuję od kilku godzin dodać  możliwość wykucia nowego przedmiotu na kowadle. Zrobiłem wszystko, co jest opisane w tym wątku: https://themodders.org/index.php?topic=21129.0
Niestety bez efektów. Oto, co zrobiłem:
1) W Constants.d zmieniłem MAX_WEAPONS i dodałem nową stałą dla swojego przedmiotu:
const int WEAPON_ArrowHead = 13;

const int MAX_WEAPONS = 14;

2) dodałem instancję nowego przedmiotu do IT_Melee_Weapons.d:
INSTANCE ItMw_Arrowhead (C_Item)
{
name = "Groty";

mainflag = ITEM_KAT_NF;
flags = ITEM_SWD;
material = MAT_METAL;

value = Value_Common1;

damageTotal = Damage_Common1;
damagetype = DAM_EDGE;
range    Range_Common1;

on_equip = Equip_1H_05;
on_unequip = UnEquip_1H_05;

cond_atr[2]    = ATR_STRENGTH;
cond_value[2]  = Condition_Common1;
visual = "ItMw_030_1h_Common_Sword_01.3DS";

description = name;
TEXT[2] = NAME_Damage; COUNT[2] = damageTotal;
TEXT[3] = NAME_Str_needed; COUNT[3] = cond_value[2];
TEXT[4] = NAME_ADDON_BONUS_1H; COUNT[4] = Waffenbonus_05;
TEXT[5] = NAME_Value; COUNT[5] = value;
};

(na razie tylko na szybko na podstawie byle jakiej innej broni)

3) w SmithWeapons.d dodałem instancję i funkcje dla mojego przedmiotu:
//*********** MOJE - groty do strzal ********************
INSTANCE PC_ItMw_ArrowHead (C_INFO)
{
npc = PC_Hero;
condition = PC_ItMw_ArrowHead_Condition;
information = PC_ItMw_ArrowHead_Info;
permanent = TRUE;
};

FUNC INT PC_ItMw_ArrowHead_Condition()
{
if((PLAYER_MOBSI_PRODUCTION == MOBSI_SMITHWEAPON)
&& (PLAYER_TALENT_SMITH[WEAPON_ArrowHead] == TRUE))
&& (Normalwaffen == TRUE)
{
return TRUE;
};
};

FUNC VOID PC_ItMw_ArrowHead_Info ()
{
CreateInvItems     (hero, ItMw_ArrowHead,  1);
Print (PRINT_SmithSuccess);

B_ENDPRODUCTIONDIALOG ();
Normalwaffen = FALSE;
};

oraz na końcu w funkcji FUNC VOID SMITHWEAPON_S1 () linijkę:
PC_ItMw_ArrowHead.description = "Groty";
4) w dialogu Harada zmieniłem jedną linijkę, tak żeby mnie uczył mojej broni:
func void B_HaradSmithChoices()
{
............
else
//if (PLAYER_TALENT_SMITH[WEAPON_Common] == FALSE)
{
Info_AddChoice (DIA_Harad_TeachSmith, B_BuildLearnString("Ucz sie grotów strzal "    , B_GetLearnCostTalent(other, NPC_TALENT_SMITH, WEAPON_ArrowHead)) ,DIA_Harad_TeachSmith_ArrowHead);
//Info_AddChoice (DIA_Harad_TeachSmith, B_BuildLearnString("Schmieden lernen "    , B_GetLearnCostTalent(other, NPC_TALENT_SMITH, WEAPON_Common)) ,DIA_Harad_TeachSmith_Common);
};
};

5) w TeachPlayerTalentSmith.d dodałem warunek, który uczy postać wykuwania mojego przedmiotu
if (waffe == WEAPON_ArrowHead) { PLAYER_TALENT_SMITH[WEAPON_ArrowHead] = TRUE;
B_LogEntry (TOPIC_TalentSmith,"cos tam cos tam."); };

Efekt:
U Harada pojawia się dialog do nauki, po nauczeniu dostaję wpis w dzienniku ("coś tam cos tam" :D), niestety na kowadle w ogóle nie ma opcji wykucia grotów strzał. Autor wątku, do którego dałem linka pisał o tym, że ma puste miejsce w monologu kowadła, ale może wykuć przedmiot - u mnie się nie da, nie ma ani opcji do wyboru, ani pustego miesjca.

Pomóżcie, bo już mnie coś trafia. Pół dnia spędziłem nad prostą w sumie rzeczą, a i tak dalej nie działa  -_-
 

Cruc

Cruc

Użytkownicy
posty654
Propsy221
Profesjabrak
  • Użytkownicy
Nie blokuje Cię przypadkiem ten warunek?
&& (Normalwaffen == TRUE)
 
while (!success) try{...}

pagi111

pagi111

Użytkownicy
posty46
Propsy2
Profesjabrak
  • Użytkownicy
Ale to jest w każdym innym przedmiocie w tym pliku. I o ile dobrze rozumiem, to oznacza, że opcja pojawia się gdy klikniemy w "kucie zwykłych broni" a nie "broni z rudy".
 

Patrix9999

Patrix9999

Użytkownicy
posty123
Propsy32
Profesjabrak
  • Użytkownicy
Może na czas tymczasowy zrób tak warunek, by dialog zawsze się pokazywał?
Wtedy potwierdzisz, że to wina if'a.

Post połączony: 2021-01-14, 12:25
Rzadko to robię, ale postanowiłem sam przetestować twój skrypt.
W poście nie dołączyłeś dialogu, który odpowiadał za naukę grotów.

Ogólnie też nie wspomniałeś nic o funkcji, w której masz wypisane wymogi, co ile kosztuje:
B_GetLearnCostTalent.

Jak to mawia klasyk: u mnie działa, proponuje zacząć na twoim miejscu grę na nowo gdyż pewnie testujesz skrypt poprzez wczytywanie, problem z tą metodą jest taki, że wszystkie zmienne zostaną poddane deserializacji (wczytanie z save'a). To jest na tyle problematyczne, że jeśli wcześniej miałeś jakiegoś buga w kodzie i zmienna jest ustawiona na wartość, na jaką nie powinna, to i tak zostanie to wczytane, dlatego lepiej zawsze zaczynać grę od nowa jak się testuje takie rzeczy.

Poniżej zamieszczam również swoją paczkę skryptów, zdaje się że w niej wszystko działa, nie mniej jednak na pewno przy zapisie dialogów z Haradem spierdoliłem kodowanie bo edytor tekstowy zinterpretował mi plik jakby był otwarty w UTF-8 no i niestety polskie znaki zamieniły się w krzaczki.

Poza tym, powinno wszystko działać:
http://hostuje.net/file.php?id=d117d741bc0d894fcaeaee31b7d2db94
 

pagi111

pagi111

Użytkownicy
posty46
Propsy2
Profesjabrak
  • Użytkownicy
Ok, zaraz spróbuje co i jak. Przede wszystkim, spróbuję nową grę odpalić, może to przez to właśnie.
Rzeczywiście nie wspomniałem o B_GetLearnCostTalent, ale dodałem tam te potrzebne wymogi.

Z dialogiem o nauce też racja. O ile dobrze rozumiem, to ten?
func void DIA_Harad_TeachSmith_ArrowHead()
{
if B_TeachPlayerTalentSmith (self, other, WEAPON_ArrowHead)
{
B_Harad_TeachSmith();
};
};

A żeby dialog się zawsze pokazywał, to próbowałem - usunąłem po prostu linijkę:
&& (PLAYER_TALENT_SMITH[WEAPON_ArrowHead] == TRUE)o ile rozumiem to wtedy powienien się pokazywać zawsze. Ale i tak się nie pokazywał.

EDIT:
Aż się ciśnie na usta ,,ja jebie" - chodziło o to, żeby zacząć nową grę, a nie wczytywać, poza tym skrypt działa... Dzięki za pomoc :)
 


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