Problem z zwracaniem zmiennych 5080 7

O temacie

Autor Tasilvar

Zaczęty 22.05.2011 roku

Wyświetleń 5080

Odpowiedzi 7

Tasilvar

Tasilvar

Użytkownicy
zwykły user
posty264
Propsy17
ProfesjaSkrypter
  • Użytkownicy
  • zwykły user
Witam. Podczas tworzenia kowalstwa pojawił mi się problem z zwracaniem zmiennych. Mianowicie, kiedy hero ulepszy przy kowadle broń to posiada jej pierwotne właściwości. Efekt jest jedynie widoczny przy wywołaniu za pomocą kodu żądanej broni. Próbowałem użyć funkcji B_GiveInvItems(); i AI_RemoveInvItems(); ale niestety podczas kucia broni wywalało mnie wtedy z gry ;/

wszelkie oparacje jakie podjąłem przy pisaniu skryptu:

//****************************
// PC_Smithabit
//****************************

func void Smith (var int wybor)
{
const string ulepszyles_itm ="Ulepszyłeś przedmiot!";
const string brak_itm="Aktualnie nie nosisz tego typu przedmiotu!";
const string brak_skl="Brak składników!";

AI_StopProcessInfos(self);
self.aivar[AIV_INVINCIBLE]=FALSE;

var C_ITEM weap_zwarcie; weap_zwarcie = Npc_GetEquippedMeleeWeapon(hero);
var c_item weap_dystans; weap_dystans = Npc_GetEquippedRangedWeapon(hero);
var c_item armor; armor = Npc_GetEquippedArmor(hero);

if(kowalstwo == true) {

if(wybor == 1) {
if((Npc_HasEquippedMeleeWeapon(hero)) && (Npc_HasItems(hero, ItMiNugget) >= 150) && (Npc_HasItems(hero, ItAt_Teeth_01) >= 2)) {
AI_EquipBestMeleeWeapon (hero);
PrintScreen(ulepszyles_itm,-1,50,"font_old_10_white.tga",3);
obrazenia = weap_zwarcie.damageTotal + 10;
wymagania = weap_zwarcie.cond_value[2] + 5;
koszt = weap_zwarcie.value + 20;
B_GiveInvItems (hero,NULL, ItMiNugget, 150);
B_GiveInvItems (hero,NULL, ItAt_Teeth_01, 2);
CreateInvItem (hero,weap_zwarcie);
// B_GiveInvItems (NULL,hero, weap_zwarcie, 1); // kiedy wyrzucę komentarz podczas kucia mnie wywali
// Npc_RemoveInvItem   (hero,weap_zwarcie);
}
else if ((Npc_HasItems(hero, ItMiNugget) < 150) && (Npc_HasItems(hero, ItAt_Teeth_01) < 2)) {
PrintScreen(brak_skl,-1,50,"font_old_10_white.tga",3);
}
else {
PrintScreen(brak_itm,-1,50,"font_old_10_white.tga",3);
};
};
if (wybor == 2) {
if((Npc_HasEquippedRangedWeapon(hero)) && (Npc_HasItems(hero, ItMiNugget) >= 250) && (Npc_HasItems(hero, ItAt_Bloodfly_02) >= 4))
{
AI_EquipBestRangedWeapon (hero);
PrintScreen(ulepszyles_itm,-1,50,"font_old_10_white.tga",3);
obrazenia = weap_dystans.damageTotal + 10;
wymagania = weap_dystans.cond_value[2] + 5;
koszt = weap_dystans.value + 20;
B_GiveInvItems (hero,NULL, ItMiNugget, 150);
B_GiveInvItems (hero,NULL, ItAt_Teeth_01, 2);
CreateInvItem (hero,weap_dystans);
// B_GiveInvItems (NULL,hero, weap_dystans, 1); // kiedy wyrzucę komentarz podczas kucia mnie wywali
Npc_RemoveInvItem   (hero,weap_dystans);
}
else if ((Npc_HasItems(hero, ItMiNugget) < 250) && (Npc_HasItems(hero, ItAt_Bloodfly_02) < 4)) {
PrintScreen(brak_skl,-1,50,"font_old_10_white.tga",3);
}
else {
PrintScreen(brak_itm,-1,50,"font_old_10_white.tga",3);
};

};
if(wybor == 3) {
if((Npc_HasEquippedArmor(hero)) && (Npc_HasItems(hero, ItMiNugget) >= 500) && (Npc_HasItems(hero, ItAt_Swampshark_01) >= 1)) {
AI_EquipBestArmor (hero);
PrintScreen(ulepszyles_itm,-1,50,"font_old_10_white.tga",3);
obrona_bron_ostra = armor.protection [PROT_EDGE] + 5;
obrona_bron_nieostra = armor.protection [PROT_BLUNT] + 5;
obrona_pociski = armor.protection [PROT_POINT] +  2;
obrona_ogien = armor.protection [PROT_FIRE] + 1;
obrona_magia = armor.protection [PROT_MAGIC] + 1;
koszt = armor.value + 50;
B_GiveInvItems (hero,NULL, ItMiNugget, 150);
B_GiveInvItems (hero,NULL, ItAt_Teeth_01, 2);
CreateInvItem (hero,armor);
// B_GiveInvItems (NULL,hero, armor, 1); // kiedy wyrzucę komentarz podczas kucia mnie wywali
Npc_RemoveInvItem   (hero,armor);
}
else if ((Npc_HasItems(hero, ItMiNugget) < 500) && (Npc_HasItems(hero, ItAt_Swampshark_01) < 1)) {
PrintScreen(brak_skl,-1,50,"font_old_10_white.tga",3);
}
else {
PrintScreen(brak_itm,-1,50,"font_old_10_white.tga",3);
};

};
};
};

func void SMITHABIT_S1 ()
{

if(Npc_IsPlayer(self))
{
self.aivar[AIV_INVINCIBLE]=TRUE;
Ai_ProcessInfos (hero);
};
};

//-------------------- Odejdź od kowadła -------------------------

INSTANCE PC_NoSMITH (c_Info)

{
npc = PC_Hero;
nr = 999;
condition = PC_NoSMITH_Condition;
information = PC_NoSMITH_Info;
important = 0;
permanent = 1;
description = DIALOG_ENDE;
};

FUNC INT PC_NoSMITH_Condition()
{
return 1;
};

func VOID PC_NoSMITH_Info()
{
AI_StopProcessInfos (self);
self.aivar[AIV_INVINCIBLE]=FALSE;
};

//---------------------- Broń w zwarciu --------------------------------------

INSTANCE SMITH_SWORD (C_INFO)
{
npc = PC_Hero;
condition = SMITH_SWORD_Condition;
information = SMITH_SWORD_Info;
important = 0;
permanent = 1;
description = "Ulepsz broń do walki w zwarciu (150 bryłek rudy, 2x kły)";
};

FUNC INT SMITH_SWORD_Condition()
{
return 1;
};

func void SMITH_SWORD_Info ()
{
Smith (1);
};

//---------------------- Broń dystansowa --------------------------------------

INSTANCE SMITH_BOW (C_INFO)
{
npc = PC_Hero;
condition = SMITH_BOW_Condition;
information = SMITH_BOW_Info;
important = 0;
permanent = 1;
description = "Ulepsz broń dystansową (250 bryłek rudy, 4x żądła)";
};

FUNC INT SMITH_BOW_Condition()
{
return 1;
};

func void SMITH_BOW_Info ()
{
Smith (2);
};

//---------------------- Pancerze --------------------------------------

INSTANCE SMITH_ARMOR (C_INFO)
{
npc = PC_Hero;
condition = SMITH_ARMOR_Condition;
information = SMITH_ARMOR_Info;
important = 0;
permanent = 1;
description = "Ulepsz pancerz (500 bryłek rudy, 1x skóra błotnego węża)";
};

FUNC INT SMITH_ARMOR_Condition()
{
return 1;
};

func void SMITH_ARMOR_Info ()
{
Smith (3);
};

no i ofc deklaracje zmiennych w Stroy_Globals.
Tak krótko reasumując - chcę aby poprzez ten monolog ulepszało nam broń/pancerz który aktualnie mamy na sobie założony ;)

Ps. W jaki sposób zmienić warunek skorzystania z np. kowadła (aby zamiast rozgrzanej stali wymagałoby był np. tylko młot kowalski, bo nie mogłem tego nigdzie wyszukać.)
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
może zamiast usuwać broń i tworzyć nową to spróbuj ją zdjąć i założyć

a grę wywala ci dlatego bo usuwasz z ekwipunku założony przedmiot najpierw go ściągnij a potem ewentualnie usuwaj

EDIT:ale czekaj nie ogarniam tego skryptu co to daje ???

               obrazenia = weap_zwarcie.damageTotal + 10;
                wymagania = weap_zwarcie.cond_value[2] + 5;
                koszt = weap_zwarcie.value + 20;

nie powinno być przypadkiem tak

               eap_zwarcie.damageTotal = weap_zwarcie.damageTotal + 10;
                weap_zwarcie.cond_value[2] = weap_zwarcie.cond_value[2] + 5;
                weap_zwarcie.value = weap_zwarcie.value + 20;

przecież musisz zmieniać zmienne miecza a nie jakąś zmienną obrażenia


a co do stali to w spacerze musisz zmienić ustawienia każdego kowadła tam jest taki parametr CośTamItems: i tam dajesz wymagany item

Tasilvar

Tasilvar

Użytkownicy
zwykły user
posty264
Propsy17
ProfesjaSkrypter
  • Użytkownicy
  • zwykły user
hm, tylko nie wiem czy istnieje funkcja zdjęcia przedmiotu który aktualnie nosi npc. W każdym razie ja nie znam.

Cytuj
              obrazenia = weap_zwarcie.damageTotal + 10;
                wymagania = weap_zwarcie.cond_value[2] + 5;
                koszt = weap_zwarcie.value + 20;
nie powinno być przypadkiem tak

                eap_zwarcie.damageTotal = weap_zwarcie.damageTotal + 10;
                weap_zwarcie.cond_value[2] = weap_zwarcie.cond_value[2] + 5;
                weap_zwarcie.value = weap_zwarcie.value + 20;


przecież musisz zmieniać zmienne miecza a nie jakąś zmienną obrażenia
tylko że  te zmienne:
obrazenia
wymagania
koszt to zmienne globalne które mają się odnosić do wszystkich broni a nie do konkretnej
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Cytuj
obrazenia = weap_zwarcie.damageTotal + 10;
                wymagania = weap_zwarcie.cond_value[2] + 5;
Po co coś takiego? Nie lepiej po prostu:
Cytuj
weap_zwarcie.damageTotal += 10;
                weap_zwarcie.cond_value[2] += 5;
?

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
to zmienne globalne które mają się odnosić do wszystkich broni a nie do konkretnej

no właśnie zmieniasz wartość zmiennym globalnym
a broni ich w ogóle nie zmieniasz o to właśnie chodzi

a i takie dodatkowe pytanie co rozumiesz przez zwracanie zmiennych bo ja przez to rozumiem używanie instrukcji return ;d

Tasilvar

Tasilvar

Użytkownicy
zwykły user
posty264
Propsy17
ProfesjaSkrypter
  • Użytkownicy
  • zwykły user
Po co coś takiego? Nie lepiej po prostu:
?

użyłem i niestety nie działało, jedynie kiedy przypisze im zmienne globalne

no właśnie zmieniasz wartość zmiennym globalnym
a broni ich w ogóle nie zmieniasz o to właśnie chodzi

a i takie dodatkowe pytanie co rozumiesz przez zwracanie zmiennych bo ja przez to rozumiem używanie instrukcji return ;d

sęk w tym że po wykonaniu funkcji nie ma zmian (w tym przypadku wzrostu obrażeń czy wartości).
Cały problem tkwi w tym że powyższy kod który podałem w pierszym poście działa tylko kiedy tę samą broń która nosi hero przywołam kodem. Tylko w tym przypadku widać efekt ulepszenia broni.

edit. Chyba mam pomysł na rozwiązanie problemu, sęk w tym że nie wiem w jakis sposób pobrać do zmiennej instance przedmiotu który aktualnie nosi hero.

edit.2 Udało się! wystarczyło stworzyć jeszcze 3 zmienne które będą pobierały odpowiednio instance dowolnych pancerzy, łuków i kusz oraz broni. Imo dzięki za wskazówki ;) temat w sumie do zakmnięcia .
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
A nie lepiej dać AI_RemoveWeapon (hero);, Npc_RemoveInvItems (hero, przedmiot, 1); i potem CreateInvItems (hero, przedmiot, 1); ? W tym przypadku NPC odłoży i wykasuje broń i pojawi mu się inna i nie będzie żadnych "crashów".
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

EdekSumo

EdekSumo

Wyspa Khorinis
posty1739
Propsy925
ProfesjaLvl designer
  • Wyspa Khorinis
Jaki odkop :ok:
ps ostatni post napisano 22 05 2011 - 11:48
 


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