Files
dsrc/sku.0/sys.server/compiled/game/script/systems/tcg/barn_beast.script
T

363 lines
9.8 KiB
Plaintext

include library.ai_lib;
include library.beast_lib;
include library.callable;
include library.pet_lib;
include library.prose;
include library.target_dummy;
include library.tcg;
include library.utils;
trigger OnAttach()
{
ai_lib.setDefaultCalmBehavior(self, ai_lib.BEHAVIOR_LOITER);
return SCRIPT_CONTINUE;
}
trigger OnObjectMenuRequest(obj_id player, menu_info mi)
{
obj_id barn = utils.getObjIdScriptVar(self, "barnId");
if ( isIdValid(barn) )
{
obj_id owner = getOwner(barn);
if ( isIdValid(owner) && owner == player )
{
int menuPlacement = mi.addRootMenu (menu_info_types.SERVER_MENU1, new string_id(pet_lib.MENU_FILE, "menu_store"));
}
}
return SCRIPT_CONTINUE;
}
trigger OnObjectMenuSelect(obj_id player, int item)
{
if ( item == menu_info_types.SERVER_MENU1 )
{
obj_id barn = utils.getObjIdScriptVar(self, "barnId");
if ( isIdValid(barn) )
{
obj_id owner = getOwner(barn);
if ( isIdValid(owner) && owner == player )
{
string storageSlot = utils.getStringScriptVar(self, "barnSlot");
utils.removeScriptVar(barn, storageSlot);
string beastName = beast_lib.getBeastLocalizedName(self);
if ( beastName == null || beastName.length() < 1 )
{
beastName = "Unknown";
}
if ( hasObjVar(barn, "barnStorage."+storageSlot+".beast.beastName") )
{
beastName = getStringObjVar(barn, "barnStorage."+storageSlot+".beast.beastName");
}
else if ( hasObjVar(barn, "barnStorage."+storageSlot+".tempName") )
{
beastName = getStringObjVar(barn, "barnStorage."+storageSlot+".tempName");
}
string_id message = new string_id ("tcg","barn_beast_display_stored");
if ( tcg.isBarnLiteDevice(barn) )
{
message = new string_id ("tcg","barn_lite_beast_display_stored");
}
prose_package pp = prose.getPackage(message, player, player);
prose.setTO(pp, beastName);
sendSystemMessageProse(player, pp);
removeObjVar(barn, "barnStorage."+storageSlot+"."+tcg.BEAST_ROAMING);
destroyObject(self);
}
}
}
return SCRIPT_CONTINUE;
}
messageHandler OnPack()
{
if(!isIdValid(self))
{
return SCRIPT_CONTINUE;
}
obj_id barn = utils.getObjIdScriptVar(self, "barnId");
if ( isIdValid(barn) )
{
string storageSlot = utils.getStringScriptVar(self, "barnSlot");
if ( utils.hasScriptVar(barn, storageSlot) )
{
utils.removeScriptVar(barn, storageSlot);
}
removeObjVar(barn, "barnStorage."+storageSlot+"."+tcg.BEAST_ROAMING);
}
destroyObject(self);
return SCRIPT_CONTINUE;
}
trigger OnDestroy()
{
target_dummy.removeTargetDummyFromPermissions(self);
return SCRIPT_CONTINUE;
}
trigger OnGetAttributes(obj_id player, string[] names, string[] attribs)
{
if(!isMob(self))
{
return SCRIPT_CONTINUE;
}
int idx = utils.getValidAttributeIndex(names);
obj_id barn = utils.getObjIdScriptVar(self, "barnId");
if ( !isIdValid(barn) )
{
return SCRIPT_CONTINUE;
}
string storageSlot = utils.getStringScriptVar(self, "barnSlot");
if( hasObjVar(barn, "barnStorage."+storageSlot+"."+beast_lib.OBJVAR_BEAST_ENGINEER) )
{
string creatorName = getStringObjVar(barn, "barnStorage."+storageSlot+"."+beast_lib.OBJVAR_BEAST_ENGINEER);
names[idx] = "bm_creator";
attribs[idx] = creatorName;
idx++;
if (idx >= names.length)
return SCRIPT_CONTINUE;
}
names[idx] = "health";
attribs[idx] = " " + (int)getMaxAttrib(self, HEALTH);
idx++;
int level = getLevel(self);
if(level < 90)
{
dictionary beastStatsNextLevel = utils.dataTableGetRow(beast_lib.BEASTS_STATS, level - 1);
int experienceLastLevel = 0;
int experienceNextLevel = 0;
// You cannot get a previous level of a beast, if it is level 1 (no such thing as 0 level)
if(level > 1)
{
dictionary beastStatsLastLevel = utils.dataTableGetRow(beast_lib.BEASTS_STATS, level - 2);
if(beastStatsLastLevel == null || beastStatsLastLevel.size() <= 0)
{
return SCRIPT_CONTINUE;
}
experienceLastLevel = beastStatsLastLevel.getInt("XP");
}
if(beastStatsNextLevel == null || beastStatsNextLevel.size() <= 0)
{
return SCRIPT_CONTINUE;
}
experienceNextLevel = beastStatsNextLevel.getInt("XP");
int beastExperience = beast_lib.getBeastExperience(self);
// A beast has progressed towards its next level by an amount, which is equal to its current experience minus the
// experience that was required for the previous level.
int experienceProgress = beastExperience - experienceLastLevel;
// This level requires an amount of experience equal to the next level's experience requirement minus the last level's
// experience requirement.
int experienceNeeded = experienceNextLevel - experienceLastLevel;
int experiencePercentage = 0;
// No division by zero.
if(experienceProgress > 0)
{
// The percentage needed to level is equal to the total amount of experience needed for the level divided by the progress
// the beast has made.
experiencePercentage = (int)(((float)experienceProgress / (float)experienceNeeded) * 100);
}
names[idx] = "level_progress";
attribs[idx] = "" + experiencePercentage + "%";
idx++;
}
if(beast_lib.getBeastCanLevel(self))
{
names[idx] = "exp_on";
attribs[idx] = "true";
idx++;
}
else
{
names[idx] = "exp_off";
attribs[idx] = "true";
idx++;
}
names[idx] = beast_lib.BEAST_MOOD_TITLE;
int currentHappiness = 0;
if ( hasObjVar(barn, "barnStorage."+storageSlot+"."+beast_lib.OBJVAR_BEAST_HAPPINESS) )
{
currentHappiness = getIntObjVar(barn, "barnStorage."+storageSlot+"."+beast_lib.OBJVAR_BEAST_HAPPINESS);
}
string currentHappinessString = utils.packStringId (beast_lib.convertHappinessString(currentHappiness));
if(currentHappinessString != null)
{
attribs[idx] = "" + currentHappinessString;
idx++;
if (idx >= names.length)
return SCRIPT_CONTINUE;
}
names[idx] = beast_lib.BEAST_LOYALTY_TITLE;
int currentLoyalty = 0;
if ( hasObjVar(barn, "barnStorage."+storageSlot+"."+beast_lib.PET_LOYALTY_LEVEL_OBJVAR) )
{
currentLoyalty = getIntObjVar(barn, "barnStorage."+storageSlot+"."+beast_lib.PET_LOYALTY_LEVEL_OBJVAR);
}
string currentLoyaltyString = utils.packStringId (beast_lib.convertLoyaltyString(currentLoyalty));
if(currentLoyaltyString != null)
{
attribs[idx] = "" + currentLoyaltyString;
idx++;
if (idx >= names.length)
return SCRIPT_CONTINUE;
}
names[idx] = "armorhpmax";
attribs[idx] = "" + (utils.getIntScriptVar(self, "beast.display.armor") + getEnhancedSkillStatisticModifier(self, "private_armor_bonus"));
idx++;
obj_id beastWeapon = getCurrentWeapon(self);
if(isIdValid(beastWeapon))
{
int minDamage = getWeaponMinDamage(beastWeapon);
int maxDamage = getWeaponMaxDamage(beastWeapon);
int expertiseDamageBonus = getEnhancedSkillStatisticModifierUncapped(self, "expertise_damage_all");
minDamage = (int)(minDamage * (1.0f + ((float)expertiseDamageBonus / 100.0f)));
maxDamage = (int)(maxDamage * (1.0f + ((float)expertiseDamageBonus / 100.0f)));
float weaponSpeed = getWeaponAttackSpeed(beastWeapon);
names[idx] = "damage";
attribs[idx] = "" + minDamage + " - " + maxDamage;
idx++;
names[idx] = "attackspeed";
attribs[idx] = "" + weaponSpeed;
idx++;
float beastDPS = utils.roundFloatByDecimal((minDamage + maxDamage) / weaponSpeed / 2);
names[idx] = "basedps";
attribs[idx] = ""+beastDPS;
idx++;
}
else
{
obj_id defaultWeapon = getDefaultWeapon(self);
if(isIdValid(defaultWeapon))
{
int minDamage = getWeaponMinDamage(defaultWeapon);
int maxDamage = getWeaponMaxDamage(defaultWeapon);
float weaponSpeed = getWeaponAttackSpeed(defaultWeapon);
int expertiseDamageBonus = getEnhancedSkillStatisticModifierUncapped(self, "expertise_damage_all");
minDamage = (int)(minDamage * (1.0f + ((float)expertiseDamageBonus / 100.0f)));
maxDamage = (int)(maxDamage * (1.0f + ((float)expertiseDamageBonus / 100.0f)));
names[idx] = "damage";
attribs[idx] = "" + minDamage + " - " + maxDamage;
idx++;
names[idx] = "attackspeed";
attribs[idx] = "" + weaponSpeed;
idx++;
float beastDPS = utils.roundFloatByDecimal((minDamage + maxDamage) / weaponSpeed / 2);
names[idx] = "basedps";
attribs[idx] = ""+beastDPS;
idx++;
}
}
if(beast_lib.DISPLAY_NAMES.length == beast_lib.ARRAY_BEAST_INCUBATION_STATS.length &&
beast_lib.DISPLAY_NAMES.length == beast_lib.DISPLAY_CONVERSION_RATES.length)
{
for(int i = 0; i < beast_lib.DISPLAY_NAMES.length; ++i)
{
string name = beast_lib.DISPLAY_NAMES[i];
if(name.indexOf("_skill") < 0)
{
if(!name.equals("block_value_bonus"))
{
names[idx] = beast_lib.DISPLAY_NAMES[i];
attribs[idx] = "" + utils.roundFloatByDecimal((utils.getFloatScriptVar(self, beast_lib.ARRAY_BEAST_INCUBATION_STATS[i]) * beast_lib.DISPLAY_CONVERSION_RATES[i])) + "%";
idx++;
}
else
{
names[idx] = beast_lib.DISPLAY_NAMES[i];
attribs[idx] = "" + utils.roundFloatByDecimal(utils.getFloatScriptVar(self, beast_lib.ARRAY_BEAST_INCUBATION_STATS[i]));
idx++;
}
continue;
}
else
{
names[idx] = beast_lib.DISPLAY_NAMES[i];
attribs[idx] = "" + utils.roundFloatByDecimal(utils.getFloatScriptVar(self, beast_lib.ARRAY_BEAST_INCUBATION_STATS[i]));
idx++;
continue;
}
}
}
float glanceReduct = beast_lib.getBeastModGlancingReduction(self);
if(glanceReduct > 0)
{
names[idx] = "bm_glance_reduct";
attribs[idx] = "" + glanceReduct + "%";
idx++;
if (idx >= names.length)
return SCRIPT_CONTINUE;
}
float damageReduct = beast_lib.getBeastModDamageReduction(self);
if(damageReduct > 0)
{
names[idx] = "bm_damage_reduct";
attribs[idx] = "" + damageReduct + "%";
idx++;
if (idx >= names.length)
return SCRIPT_CONTINUE;
}
float punishReduct = beast_lib.getBeastModPunishingReduction(self);
if(punishReduct > 0)
{
names[idx] = "bm_punish_reduct";
attribs[idx] = "" + punishReduct + "%";
idx++;
if (idx >= names.length)
return SCRIPT_CONTINUE;
}
return SCRIPT_CONTINUE;
}