// Evol scripts.
// Author:
// Travolta
// Jesusalva
// Description:
// NPC to use shovel (dig, bury etc)
- script Shovel -1,{
function CheckDigLocation {
getmapxy(.@map$, .@x, .@y, 0);
if (.@map$ != "001-1") {
if (getunits(BL_NPC, .@units, 1, .@map$, .@x - 1, .@y, .@x + 1, .@y + 1))
{
dispbottom(l("You cannot bury under a NPC!"));
return false;
}
}
// TODO: we should have a way to check for GROUNDTOP collisions too
for (.@i = 0; .@i < getarraysize(.WorldDigRect_Map$); .@i++)
{
if (!strcmp(.WorldDigRect_Map$[.@i], .@map$) &&
.WorldDigRect_x1[.@i] <= .@x &&
.WorldDigRect_x2[.@i] >= .@x &&
.WorldDigRect_y1[.@i] <= .@y &&
.WorldDigRect_y2[.@i] >= .@y)
{
return true;
}
}
dispbottom(l("You can't use the shovel here."));
return false;
}
function AddDigRect {
if (getargcount() < 5)
{
consolemes(CONSOLEMES_ERROR, "usage: AddDigRect(map$,x1,y1,x2,y2)");
return 0;
}
.@map$ = str(getarg(0));
.@x1 = getarg(1);
.@y1 = getarg(2);
.@x2 = getarg(3);
.@y2 = getarg(4);
.@size = getarraysize(.WorldDigRect_Map$);
.WorldDigRect_Map$[.@size] = .@map$;
.WorldDigRect_x1[.@size] = .@x1;
.WorldDigRect_y1[.@size] = .@y1;
.WorldDigRect_x2[.@size] = .@x2;
.WorldDigRect_y2[.@size] = .@y2;
return 1;
}
function AddMapDigRect {
.@m$=getarg(0);
.@x=getmapinfo(MAPINFO_SIZE_X, .@m$)-20;
.@y=getmapinfo(MAPINFO_SIZE_Y, .@m$)-20;
return AddDigRect(.@m$, 20, 20, .@x, .@y);
}
function PlayerIsTired {
if (is_evtc())
return false; // event coordinators are never tired
.@tick = gettimetick(1);
.@playertick = .PlayerTiredTime - readparam(bStr);
if (@ShovelLastUsed + max(4, .@playertick) > .@tick)
{
narrator S_FIRST_BLANK_LINE,
l("You are exhausted, you should rest a bit.");
return true;
}
@ShovelLastUsed = .@tick;
return false;
}
function Dig {
getmapxy(.@map$, .@x, .@y, 0);
for (.@i = 0; .@i < getarraysize($WorldBuriedTreasures_id); .@i++)
{
if (!strcmp($WorldBuriedTreasures_map$[.@i], .@map$) &&
$WorldBuriedTreasures_x[.@i] == .@x &&
$WorldBuriedTreasures_y[.@i] == .@y)
{
.@id = $WorldBuriedTreasures_id[.@i];
.@amount = $WorldBuriedTreasures_amount[.@i];
deletearray $WorldBuriedTreasures_id[.@i], 1;
deletearray $WorldBuriedTreasures_amount[.@i], 1;
deletearray $WorldBuriedTreasures_map$[.@i], 1;
deletearray $WorldBuriedTreasures_x[.@i], 1;
deletearray $WorldBuriedTreasures_y[.@i], 1;
getitem .@id, .@amount;
narrator S_FIRST_BLANK_LINE,
l("You found something!"),
l("It's @@ @@.", .@amount, getitemname(.@id));
return 1;
}
}
narrator S_FIRST_BLANK_LINE, l("Sadly, you found nothing but dirt.");
return 0;
}
function Bury {
narrator S_FIRST_BLANK_LINE | S_LAST_BLANK_LINE, l("What would you like to bury?");
.@items$ = "";
mes "##B" + l("Drag and drop an item from your inventory.") + "##b";
.@id = requestitem();
// If ID is invalid, there's not enough items, it is an Iron Shovel, it is bound = Cannot bury
// NOBODY bypass notrade check. (ITR_NONE is 0)
if (.@id < 1) close;
if (.@id < 1 || countitem(.@id) < 1 || .@id == IronShovel || checkbound(.@id) ||
(!getiteminfo(.@id, ITEMINFO_TRADE))
) {
@ShovelLastUsed = 0;
if (.@id == IronShovel || .@id == SteelShovel || checkbound(.@id))
mesc l("You cannot bury this item!");
else if (!getiteminfo(.@id, ITEMINFO_TRADE))
mesc l("This item is too precious, you cannot part with it!");
else
mesc l("You give up.");
close;
return;
}
.@amount = 1;
if (countitem(.@id) > 1)
{
narrator S_FIRST_BLANK_LINE | S_LAST_BLANK_LINE, l("Amount?");
input .@amount, 1, countitem(.@id);
}
getmapxy(.@map$, .@x, .@y, 0);
delitem .@id, .@amount;
.@wtc = getarraysize($WorldBuriedTreasures_id);
$WorldBuriedTreasures_id[.@wtc] = .@id;
$WorldBuriedTreasures_amount[.@wtc] = .@amount;
$WorldBuriedTreasures_map$[.@wtc] = .@map$;
$WorldBuriedTreasures_x[.@wtc] = .@x;
$WorldBuriedTreasures_y[.@wtc] = .@y;
narrator S_FIRST_BLANK_LINE, l("You buried @@ @@.", .@amount, getitemname(.@id));
return true;
}
function ShovelQuests {
getmapxy(.@map$, .@x, .@y, 0);
for (.@i = 0; .@i < getarraysize(ShovelQuests_func$); .@i++)
{
if (!strcmp(ShovelQuests_map$[.@i], .@map$) &&
ShovelQuests_x[.@i] == .@x &&
ShovelQuests_y[.@i] == .@y)
{
.@func$ = ShovelQuests_func$[.@i];
deletearray ShovelQuests_func$[.@i], 1;
deletearray ShovelQuests_map$[.@i], 1;
deletearray ShovelQuests_x[.@i], 1;
deletearray ShovelQuests_y[.@i], 1;
callfunc(.@func$);
return 1;
}
}
return 0;
}
OnUse:
if (!CheckDigLocation())
end;
narrator S_LAST_BLANK_LINE,
l("You hold the shovel in your hands."),
l("What are you going to do?");
.@action = select(
l("Dig."),
l("Bury."),
l("Nothing."));
switch(.@action)
{
case 1:
if (PlayerIsTired())
close;
if (!ShovelQuests())
Dig();
break;
case 2:
if (PlayerIsTired())
close;
Bury();
break;
case 3:
narrator S_FIRST_BLANK_LINE, l("You hide your shovel.");
break;
}
close;
OnHour00:
if (playerattached())
@ShovelLastUsed = 0;
end;
OnInit:
.PlayerTiredTime = 20;
// Partial maps
AddDigRect("001-1", 172, 26, 200, 48);
AddDigRect("001-1", 198, 60, 201, 63);
AddDigRect("008-1-1", 32, 42, 46, 88);
AddDigRect("008-1-2", 40, 52, 114, 146);
AddDigRect("012-1", 44, 21, 139, 47);
// Whole maps
AddMapDigRect("008-1");
AddMapDigRect("008-3-5");
AddMapDigRect("012-3-1");
end;
}
function script shovel_addquest {
if (getargcount() < 4)
{
consolemes(CONSOLEMES_ERROR, "usage: shovel_addquest(map$,x,y,func$)");
return 0;
}
.@map$ = str(getarg(0));
.@x = getarg(1);
.@y = getarg(2);
.@func$ = str(getarg(3));
.@size = getarraysize(ShovelQuests_func$);
ShovelQuests_func$[.@size] = .@func$;
ShovelQuests_map$[.@size] = .@map$;
ShovelQuests_x[.@size] = .@x;
ShovelQuests_y[.@size] = .@y;
return 1;
}
function script shovel_adddigrect {
if (getargcount() < 5)
{
consolemes(CONSOLEMES_ERROR, "usage: shovel_adddigrect(map$,x1,y1,x2,y2)");
return 0;
}
.@map$ = str(getarg(0));
.@x1 = getarg(1);
.@y1 = getarg(2);
.@x2 = getarg(3);
.@y2 = getarg(4);
.@size = getarraysize(getvariableofnpc(.WorldDigRect_Map$, strnpcinfo(3)));
set getvariableofnpc(.WorldDigRect_Map$[.@size], strnpcinfo(3)), .@map$;
set getvariableofnpc(.WorldDigRect_x1[.@size], strnpcinfo(3)), .@x1;
set getvariableofnpc(.WorldDigRect_y1[.@size], strnpcinfo(3)), .@y1;
set getvariableofnpc(.WorldDigRect_x2[.@size], strnpcinfo(3)), .@x2;
set getvariableofnpc(.WorldDigRect_y2[.@size], strnpcinfo(3)), .@y2;
return 1;
}
// [Treasure Map] functions
function script shovel_getcity {
.@a$=getarg(0);
// else is not required (return prevails)
if (.@a$ == "001-1")
return l("Artis East Beach");
if (.@a$ == "008-1")
return l("East Woodlands");
if (.@a$ == "008-1-1")
return l("West Woodland Beach");
if (.@a$ == "008-1-2")
return l("Swamps");
if (.@a$ == "008-3-5")
return l("Hurnscald Bandit Cave");
if (.@a$ == "012-1")
return l("Candor North");
if (.@a$ == "012-3-1")
return l("Candor Main Cave");
return .@a$;
}
function script shovel_randomtreasure {
.@id=any(TreasureKey,CoinBag,CoinBag,CoinBag,Coal,
Diamond,Ruby,Emerald,Sapphire,Topaz,Amethyst,
CrudeDiamond,CrudeRuby,CrudeEmerald,
CrudeSapphire,CrudeTopaz,CrudeAmethyst,
MaggotSlimePotion, LargeMana, LargeHealing);
delitem TreasureMap, 1;
.@amount=any(1,1,2);
// Very Commons
if (.@id == CoinBag || .@id == MaggotSlimePotion || .@id == TreasureKey)
.@amount+=any(0,1,0,1,2);
// Super commons
if (.@id == LargeMana || .@id == LargeHealing)
.@amount+=rand2(0,8);
// Rares
if (.@id == Coal)
.@amount=1;
getitem .@id, .@amount;
ShovelQuests_AssignedMAP$="";
ShovelQuests_AssignedX=0;
ShovelQuests_AssignedY=0;
mesn strcharinfo(0);
mesc l("You found something!");
mesc l("It's %d %s.", .@amount, getitemlink(.@id));
next;
closeclientdialog;
return;
}
function script shovel_genrandtreasure {
.@m$=any("008-1", "008-1-1", "008-1-2", "008-3-5",
"012-1", "012-3-1");
// Prepare good defaults
.@x1=.@y1=20;
.@x2=getmapinfo(MAPINFO_SIZE_X, .@m$)-20;
.@y2=getmapinfo(MAPINFO_SIZE_Y, .@m$)-20;
// Default overrides
if (.@m$ == "008-1-1") {
// West Woodland Beach
.@x1=32; .@y1=42;
.@x2=46; .@y2=88;
} else if (.@m$ == "008-1-2") {
// Swamps
.@x1=40; .@y1=52;
.@x2=114; .@y2=146;
} else if (.@m$ == "012-1") {
// Candor North
.@x1=44; .@y1=139;
.@x2=21; .@y2=47;
}
// Dangerous, but I never had issues with this
do {
.@x=rand2(.@x1, .@x2);
.@y=rand2(.@y1, .@y2);
} while (!checkcell(.@m$, .@x, .@y, cell_chkpass));
// Success
if (checkcell(.@m$, .@x, .@y, cell_chkpass)) {
shovel_addquest(.@m$, .@x, .@y, "shovel_randomtreasure");
ShovelQuests_AssignedMAP$=shovel_getcity(.@m$);
ShovelQuests_AssignedX=.@x;
ShovelQuests_AssignedY=.@y;
}
return;
}