Эх, жалко, поиграть сейчас не могу, 1.67 весит аж 80мб...
Про работу я давно предлагал, да вот только идей достойных нет (поди-убей X монстров - нее, это совершенно не то, что хотелось бы видеть).
Вот единственное, что пришло в голову:
Есть в Галиции заведение под гордым названием "Портовый Магазин", в нем продают различный хлам, и вот что можно туда всунуть:
-- [ Приветствие NPC ]
---- [ Торговля ]
---- "Ух, я погляжу у вас не только магазин, но и склад здесь... Может быть найдется и какая-нибудь работенка для отчаяного приключенца?"
------ "Отчего ж не найтись, недавно прибыла крупная партия оружия из Халфилфера, а я договорился снабжать одного из торговцев в Даск Тауне, но вот беда, с появлением в окресностях гоблинов никто не соглашается работать курьером."
-------- "Фи, эта работа не для меня."
-------- "Ну так я не из трусливых, могу и помочь!"
---------- "Хорошо, сделаем так: вот ящик с грузом, я отдам его тебе за [ цена ~1500 ], отнеси его продавцу оружием на торговой площади в Даск Тауне, он тебе за него заплатит [ цена * 3 ]. Идет?"
------------ "По рукам." (Аctions Taken: "Скрипт #1", отбирает золото, дает ящик)
------------ "Нет, у меня найдутся дела поважнее."
---- [ Ох, мне нужно идти ]
Торговцу в Даске тоже добавть ветку
--- "Я принес оружие из Галиции." (Text Appears When... "Скрипт #2", прверяющий наличие ящиков)
------ "Отлично, я давно его жду. Держи оплату." (Actions Taken: "Скрипт #3", забирает ящики, выдает золото)
Осталась техника (чтобы не быть голословным):
- Cоздать тот самый ящик, пусть его ResRef - "am_qx_box", и веса добавить 100, чтобы утащить было трудно больше одного или парочки;
- Скрипт #1
Код
void main()
{
object oPC = GetPCSpeaker();
if (GetGold(oPC) >= 1500)
{
TakeGoldFromCreature(1500, oPC);
CreateItemOnObject("am_qx_box", oPC);
}
else
{
SpeakString("Хм, судя по твоему выражению лица денег у тебя и нет.");
}
}
- Скрипт #2
Код
int Match(string s1, string s2)
{
return (s1 == s2);
}
int GetNumItemsInInventory(object oInventory = OBJECT_SELF, string sTag = "*")
{
int nNum = 0;
object oItem = GetFirstItemInInventory(oInventory);
while (GetIsObjectValid(oItem))
{
if (Match(GetTag(oItem), sTag))
{
nNum += GetItemStackSize(oItem);
}
oItem = GetNextItemInInventory(oInventory);
}
return nNum;
}
int StartingConditional()
{
object oPC = GetPCSpeaker();
return (GetNumItemsInInventory(oPC, "am_qx_box") > 0);
}
- Cкрипт #3
Код
int Match(string s1, string s2)
{
return (s1 == s2);
}
int GetNumItemsInInventory(object oInventory = OBJECT_SELF, string sTag = "*")
{
int nNum = 0;
object oItem = GetFirstItemInInventory(oInventory);
while (GetIsObjectValid(oItem))
{
if (Match(GetTag(oItem), sTag))
{
nNum += GetItemStackSize(oItem);
}
oItem = GetNextItemInInventory(oInventory);
}
return nNum;
}
int RemoveItemsFromInventory(object oInventory = OBJECT_SELF, string sTag = "*", int nNum = -1)
{
int nStack;
object oItem = GetFirstItemInInventory(oInventory);
while (GetIsObjectValid(oItem) && (nNum != 0))
{
if (Match(GetTag(oItem), sTag))
{
if (nNum < 0) DestroyObject(oItem);
else if ((nStack = GetItemStackSize(oItem)) > nNum)
{
SetItemStackSize(oItem, nStack - nNum);
return 0;
}
else
{
DestroyObject(oItem);
nNum -= nStack;
}
}
oItem = GetNextItemInInventory(oInventory);
}
return nNum;
}
void main()
{
object oPC = GetPCSpeaker();
int nNum = GetNumItemsInInventory(oPC, "am_qx_box");
if (nNum > 0)
{
RemoveItemsFromInventory(oPC, "am_qx_box");
GiveGoldToCreature(oPC, 4500 * nNum);
}
else
{
SpeakString("Ладно, не дури, давай сюда ящик.");
}
}
зы: Э... э... какие еще хаки?
ззы: Я уже не хочу переходить на НВН2.