#include "ENGINE.hpp" /// This is the row that all commands from the internal server exe is included. We dont have the source for them. Like getObjType, getNumTarget, systemMessage, getCompileFlag and so on.
#include "sk_table.h" // this loads the header of sk_table with includes the global file.
TRIGGER( message , "canUseSkill" )(obj sender, list args) // check if we can use the stealing skill.
{
return(0x00);
}
TRIGGER( callback , 0x4D )() // remove stealing flag if we have one
{
detachScript(this, "stealing");
return(0x00);
}
FUNCTION int Q4ZF(obj item) // is the object a game bord or spellbook?
{
if(getObjType(item) == 0x0FA6)
{
return(0x01);
}
if(isSpellbook(item))
{
return(0x01);
}
return(0x00);
}
TRIGGER( message , "useSkill" )(obj sender, list args) // steal skill is used.
{
callback(this, 0x0A, 0x4D); // this is two trigger call (0x0a is to check if the thief is standing on a human (that fail stealing (trigger is in human script.)) and 0x4D does remove the stealing flag.)
int Q477;
Q477 = getNumTargets(this); // if we are a target we will be in combat and cant steal.
if(Q477 > 0x00)
{
systemMessage(this, "You cannot attempt to steal in the heat of combat!");
return(0x00);
}
systemMessage(this, "Which item will you attempt to steal?");
targetObj(this, this); // call stealing trigger
return(0x00); // we are done.
}
TRIGGER( oortargetobj )(obj user, obj usedon) // start stealing (target) (the player stealing, the item)
{
if(usedon == NULL()) // if no item found exit
{
return(0x00);
}
if(isDead(this)) // if thief is dead exit.
{
return(0x00);
}
obj Q63P = getTopmostContainer(usedon); // get the top comntainer of the object we are trying to steal.
int Q5F2 = getDistanceInTiles(getLocation(usedon), getLocation(this)); // get distance to the container.
if(getDistanceInTiles(getLocation(usedon), getLocation(this)) > 0x01) // if we are more then 1 tile from then exit.
{
systemMessage(this, "You must be standing next to an item to steal it.");
return(0x00);
}
/// all this have to do with random steal by target mob instead of item.
obj owner = NULL(); // no one owns the container.
if(Q63P == NULL()) // if top container is NULL check if we target a mobile.
{
if(isMobile(usedon)) // if top container have a mob then set the owner to the mob.
{
owner = usedon;
}
}
else
{
if(isMobile(Q63P))
{
owner = Q63P; // if top container have a mob then set the owner to the mob.
}
}
///
obj Q5H6;
if(owner != NULL()) // check if the item is on a container or on a mob.
{
if(owner == this) // you can't steal from your own bag.
{
barkTo(this, this, "You catch yourself red-handed.");
return(0x00);
}
if(isPlayer(owner))
{
if(isEditing(owner) || isGameMaster(owner) || isCounselor(owner)) // thief cant steal from Worldbuilders, GMs and Conselors
{
systemMessage(this, "You can't steal from this.");
return(0x00);
}
}
if(hasScript(owner, "vendor")) // players vendors cant be stolen from.
{
systemMessage(this, "You can't steal from vendors.");
return(0x00);
}
Q5H6 = getBackpack(owner);
if(Q5H6 == NULL()) // if the mob dont have a backpack thief cant steal from it.
{
systemMessage(user, "You can't steal that.");
return(0x00);
}
}
int Q5YS = 0x01; // chance go the spotted while stealing.
if(owner != NULL()) // if container dont have any owner it's normal chance to get spotted.
{
if(owner == usedon) // if this is true we are going a random stealing by target a mob.
{
list Q4YL; // create a list for items
clearList(Q4YL); // reset the list
getContents(Q4YL, Q5H6); // get all items in the backpack
int Q538 = numInList(Q4YL); // get number of items in list.
if(Q538 == 0x00) // no items found the bag is empty so exit.
{
systemMessage(this, "You reach into " + getName(owner) + "'s backpack... but find it's empty.");
return(0x00);
}
usedon = Q4YL[random(0x00, Q538 - 0x01)]; // get a random item.
systemMessage(this, "You reach into " + getName(owner) + "'s backpack... and try to take something.");
}
else
{
////// look for the container to steal the item from in a loop.
obj Q5Z4 = containedBy(usedon);
while(Q5Z4 != Q5H6)
{
if(Q5Z4 == NULL())
{
systemMessage(user, "You can't steal that.");
return(0x00);
}
Q5Z4 = containedBy(Q5Z4);
}
//////
Q5YS = 0x03; // 3x times easier to get spotted if we are target a item in a container and try to steal it.
}
}
if(!isMoveable(usedon, this)) // if the item cant be moved it cant be stolen. this is the standard lock down flag that all items in the world uses.
{
systemMessage(this, "You could not carry this item.");
return(0x00);
}
if(!canHold(this, usedon)) // check if thief can hold the item in his backpack of not he cant steal it.
{
systemMessage(this, "You could not carry this item.");
return(0x00);
}
if(getValue(usedon) == 0x00) // if the value if the item is zero then cant steal it.
{
systemMessage(this, "This item has no value to you.");
return(0x00);
}
if(!isFreelyViewable(usedon, user)) // cant be a wall between the box and thief
{
systemMessage(user, "You can't steal that.");
return(0x00);
}
if(Q4ZF(usedon)) // you cant steal inside game boards (chess pieses) or spellbooks.
{
systemMessage(user, "You can't steal that.");
return(0x00);
}
if(containedBy(usedon) != NULL()) // this is actually a bugfix from early days then players could steal scrolls and chess peses from spellbosk and game bords. Q4ZF(usedon) didnt work 100% in some situations
{
if(Q4ZF(usedon))
{
systemMessage(user, "You can't steal that.");
return(0x00);
}
}
int Q68B = getWeight(usedon); // get the weight of the item(s) we are stealing.
int quantity = getQuantity(usedon); // and how many there is.
if((Q68B > 0x0A) && (quantity <= 0x01) && (owner != NULL())) // if the item is a single item and weight over 10 stones and we have a owner thief cant take it it. (this leaves all boxes in shops open for stealing)
{
systemMessage(this, "This item is too heavy to steal from someone's backpack.");
return(0x00);
}
// if item is over 10 stones set it to 10 stones in this calculation.
int Q569 = Q68B;
if(Q569 > 0x0A)
{
Q569 = 0x0A;
}
list Q57W; // what is this ???? it seems like a left from something before T2A? Many NPC might been able to see you before then we didnt have insta hits?? Just a guess?
int Q5TF = 0x64 + getSkillLevelReal(this, 0x21); // SKILL% = 100 + real Skill level. (1000 = 100%)
int Q4IB = Q569 * Q5YS * 0x1388 / Q5TF; // RANGE = Weight * hard to steal (1 or 3) * 5000 / SKILL%
int Q691 = witnessCrime(getLocation(usedon), this, owner, getName(usedon), Q4IB, (getValue(usedon) + 0x04) / 0x05, 0x01); // Can anyone see you?
///// witnessCrime (Location(XYZ), thief, owner (usedon), name, RANGE, Value of item + 4 / 5, 1)
// we dont have info on witnessCrime function :(
// it is also used in the provo script.
changeKarma(this, 0x00 - 0x1388); // Karma - 5000 for each time steeling? Seems hash
if(!getCompileFlag(0x01)) // I have no ide what this is.
{
criminalActAdvanced(this, owner, 0x01, 0x06, 0x18 * 0x02, 0x00);
}
if(Q691 > 0x00) // was someone around
{
if(!getCompileFlag(0x01)) // did someone see you?
{
setCriminal(this, 0x01E0); // 0x01E0 = duration 8 min
}
///// give skill points only if someone can see you
Q4IB = Q569 * Q5YS * 0x1E + 0x64;
if(testAndLearnSkill(this, 0x21, Q4IB, 0x32) <= 0x00)
{
systemMessage(this, "You fail to steal the item.");
return(0x00);
}
//////
}
////// ITEM IS STOLEN ////
systemMessage(this, "You successfully steal the item.");
if(owner == NULL())
{
setCriminal(this, 0x01E0); //0x01E0 = duration 8 min
}
else
{
if(!canBeFreelyAggressedBy(owner, this)) // owner can always attack the thief if they wish.
{
int Q4Q1 = addToObjVarListSet(this, "crimeVictimList", owner);
}
}
int Q64H = 0x01; // items to steel
if(quantity > 0x01) // is the item a pile or single item
{
int Q64I = random(0x01, 0x0A); // get a random number between 1 and 10
if(Q64I > Q68B) // if random is over weight of a pile of items.
{
Q64H = quantity; // all will be stolen.
}
else
{
Q64H = (quantity * Q64I) / Q68B; // take as manyitem we can based on quantity / weight
if(Q64H < 0x01) // if less then one take one item from the pile.
{
Q64H = 0x01;
}
}
}
obj Q59G = getBackpack(this);
if(Q64H < quantity)
{
// transfer some items from the container to thief.
obj Q4EV = createNoResObjectIn(getObjType(usedon), Q59G);
transferGeneric(Q4EV, usedon, Q64H);
return(0x01);
}
// take all items.
int Q4EL = putObjContainer(usedon, Q59G);
return(0x01);
}