|
// Events related to all players
EventsPlayer=e_your_event
EventsPlayer=e_binekozellik.xshow events yazıp Class_undeclared scripti buldum altına yapıştırdım şimdide çantayı açıyor bineğe binmiyor.
//****************************************************************************
// SPHERE by : Menasoft ©1997-2015
// www.sphereserver.net
// All SPHERE script files and formats are copyright Menasoft & Partners.
// This file may be freely edited for personal use, but may not be distributed
// in whole or in part, in any format without express written permission from
// Menasoft & Partners. All donations and contributions
// become the property of Menasoft & Partners.
//****************************************************************************
// FILE LAST UPDATED: Friday, Jan 16, 2015
//
VERSION=0.56c
[EVENTS e_combat_system]
ON=@HitCheck
call f_combat_hit <src>
src.f_combat_gethit=<local.dam>,<argn2>
[function f_combat_hit] // We get the hit state.
if (<src.IsItem>) // This should not happen, but I cannot hit items.
return -1
endif
if !(<src> || <src>==<uid> ) // I cannot hit the 'air' or myself.
return -1
endif
// I cannot damage if I'm dead, stoned, freezed or sleeping, same if the target is dead, invul o stoned or has less than 1 hit point (this last should not happen ... just a safecheck).
serv.log combat_hit <name>
if ( (<flags>&statf_dead) || (<flags>&statf_stone) || (<flags>&statf_freeze) || (<flags>&statf_sleeping) || (<src.flags>&statf_dead) || (<src.flags>&statf_invul) || (<src.flags>&statf_stone ) || <src.hits> < 1 ) )
return -1
endif
if (<region.safe> || <src.region.safe>) // I cannot hit if my region is safe or the target is on a safe region...
return -1
endif
if (<region.nopvp> || <src.region.nopvp>) // ... same for nopvp regions.
if ((<memoryfindtype.memory_ipet.link.isplayer> || <isplayer>) && (<src.memoryfindtype.memory_ipet.link.isplayer> || <src.isplayer>) )
return -1
endif
endif
local.dist=<src.distance> // Storing the distance between me and my target.
if (<local.dist>> 31) // if Distance > Radar view distance.
if (<serv.CombatFlags>&0200 || <Swing>!=SWING_SWINGING) // 0200 = COMBAT_STAYINRANGE.
return -1 // If Combat_StayInRange is not set and our swing state != preparing. Stop.
endif
endif
if (!<serv.CombatFlags>&040 && <region.flags>®ion_flag_ship) // 040 = AllowHitFromShip. If not Combat_AllowHitFromShip and my region is a ship.
if (<region.uid>!=<src.region.uid>) // and target's region is not mine ( hence i'm hitting outside the ship)...
sysmessage <defmsg.COMBAT_OUTSIDESHIP> // Stop.
return -1
endif
endif
if (<CanSee <src>>) // If I can see my target.
// And my target is being ridden (should not happen) or ! CanSeeLos (Ignoring windows if i'm shooting).
if ( (<src.brain> && <src.flags>&statf_ridden) || !<CanSeeLosFlag <src>,<qval ( <Action>==archery || <action>==throwing )? LOS_NB_WINDOWS : 0>>)
if ( !<serv.CombatFlags>&200 || <Swing>!=SWING_SWINGING) // I'm going to stop (unless i'm preparing to hit and Combat_StayInRange is not set).
argn1 SWING_READY
return 1
endif
argn1 SWING_EQUIPPING
return 1
endif
else
if ( !<serv.CombatFlags>&200 || <Swing>!=SWING_SWINGING) // same here but without LOS check.
argn1 SWING_READY
return 1
endif
argn1 SWING_EQUIPPING
return 1
endif
if ( (<brain>==brain_guard) && (<src.flags>&statf_conjured) ) // I'm a Guard, don't waste my time with stupid summons!!!
src.remove
argn1 SWING_EQUIPPING
return 1
endif
if ( (<serv.CombatFlags>&02) && <isplayer>) // 02 = COMBAT_FACECOMBAT. If I must face in combat and I'm a player (so NPCS doesn't have to face).
local.dir=<dir <src>>
if ( <local.dir> != <dir> && <local.dir> != (<dir>-1) && <local.dir> !=(<dir>+1) ) // Check if I'm looking to the target or dir = dir +1 || dir -1 ( Vision angle ).
argn1 SWING_READY
return 1
endif
endif
argn2=dam_physical // Creating argn2: dam_flags
if (<weapon>)
if (<weapon.tag0.override.damagetype>) // IF my weapon has special dmg flags ...
argn2 = <weapon.tag.override.damagetype> // I use them.
elseif ( <weapon.type>==t_weapon_sword || <weapon.type>==t_weapon_axe || <weapon.type>==t_weapon_throwing )
argn2 |=dam_slash // Setting flag for these weapons
elseif ( <weapon.type>==t_weapon_fence || <weapon.type>==t_weapon_bow || <weapon.type>==t_weapon_xbow )
argn2 |=dam_pierce // Same here
endif
if (<IsSkillRanged <action>>) // If my action is a ranged one ( Archery or Throwing ).
local.mindist=<qval <weapon.rangel> ? <weapon.rangel> : -1 > // Storing the min possible distance.
local.maxdist=<qval <weapon.rangeh> ? <weapon.rangeh> : -1 > // Storing the max possible distance.
if (<local.mindist> < 0) // If stored distance doesn't meet a min required we use the default's standard.
local.mindist = <serv.ArcheryMinDist>
endif
if (<local.maxdist> < 1 ) // Same for max distance.
local.maxdist = <serv.ArcheryMaxDist>
endif
if ( <local.dist> > <local.maxdist ) // If my target is far than my weapon's max distance...
if ( !<serv.CombatFlags>&200 || <Swing>!=SWING_SWINGING) // and I'm not preparing to hit or not Combat_StayInRange
argn1 SWING_READY
return 1
endif
argn1 SWING_EQUIPPING
return 1
endif
if (<flags>&statf_hasshield) // This should never happen, just a safecheck.
sysmessage=<defmsg.ITEMUSE_BOW_SHIELD>
action=0
argn1 -1
return 1
endif
if ( <local.dist> < <local.mindist> )
sysmessage=<defmsg.COMBAT_ARCH_TOOCLOSE> // I am so close to shoot a hit, stop.
anim=9
argn1 SWING_EQUIPPING
return 1
endif
if !(<isgm>)
reveal -1 // I reveal myself if i'm not GM.
endif
if !(<serv.CombatFlags>&01) // COMBAT_NODIRCHANGE
face <src> // If no COMBAT_NoDirChange I face the enemy.
endif
local.ammotype = <qval <weapon.ammotype> ? <weapon.ammotype> : <fixedid <tdata3>> // Setting the ammo id we are going to use, if the weapon doesn't have one specified with AmmoType we use TDATA3
if (<def0.<local.ammotype>>) // If arrow exist then we perform checks, if not ... weapon doesn't require ammo.
local.cont=<qval <weapon.ammocont> ? <weapon.ammocont> : <uid> > // AmmoCont is used here to set the container for the ammo.
ref200=<findcont.<local.cont>.findid.<local.ammotype>> // Store the ammo UID if any.
if (!<ref200>) // Check if there's ammo
if (<isplayer>) // If I'm a player and I don't have ammo: stop
sysmessage=<defmsg.COMBAT_ARCH_NOAMMO>
action=0
return -1
// else // Uncommenting these 2 lines will make npcs stop using ranged skills if they don't have ammo.
// return -1
endif
endif
endif
if ( <argn1> == SWING_READY )
if ( <local.dist> > <local.maxdist> )
argn1 SWING_READY
return 1
endif
if !(<IsGM>)
reveal
endif
if !(<serv.CombatFlags>&01) //COMBAT_NoDirChange
face <src>
endif
local.time = <GetWeaponSwingTimer>
argn1=<local.time>
FullTrigger @HitTry // I force the trigger and using call will make sure that code is stopped if there's a return in the trigger.
if (<local.return> == 1)
return -1
endif
local.time = <argn1>
argn1 = SWING_SWINGING
tag.fight_moved=0
if (<serv.CombatFlags>&04) //Combat_PreHit
tag.lasthit = <local.time> + <serv.time>
anim 9
timerd = 1
else
timerd = <local.time> / 2
anim 9 // ,<local.time>/10
endif
return 1
endif
//BEGIN HIT
local.color=<qval <weapon.ammoanimhue> ? <weapon.ammoanimhue> : <ref200.color> > // I use color stored in weapon, if any, or the ammo one.
local.anim=<qval <weapon.ammoanim> ? <weapon.ammoanim> : <weapon.tdata4> > // I use the animation of weapon.AmmoAnim or the default in TDATA4.
local.render=<qval <weapon.ammoanimrender> ? <weapon.ammoanimrender> ? 0 > // If my weapon have some special AmmoAnimRender I use it.
if (<local.ammotype>) // If I had ammo to use...
serv.newdupe <ref200>
new.attr |= attr_invis
new.timerf 20,remove
new.cont=<findlayer.21>
local.arrow=<new>
consume 1 <ref200.baseid> // I consume it.
endif
src.effect 0,<local.anim>,5,16,0,<local.color>,<local.render> // I shoot the 'arrow'
argn1 SWING_EQUIPPING
return 0
else // Not ranged skill
if ( <serv.CombatFlags>&04 && <Swing>==SWING_READY )
local.diff = <tag0.lasthit> - <serv.time>
if (<local.diff> > 0)
local.diff = <qval <local.diff> > 50 ? 50 : <local.diff> >
timerd = <local.diff>
argn1 SWING_READY
return 1
endif
endif
local.mindist = <weapon.rangel>
local.maxdist = <max <range>,<weapon.rangeh>>
if ( <local.dist> < <local.mindist> || <local.dist> > <local.maxdist> )
if ( !<serv.CombatFlags>&0200 || <swing>!=SWING_SWINGING )
argn1 SWING_READY
return 1
endif
argn1 SWING_EQUIPPING
return 1
endif
if ( <swing> == SWING_READY )
if ( <local.dist> > <local.maxdist> )
argn1 SWING_READY
return 1
endif
if !(<IsGM>)
reveal
endif
if !(<serv.CombatFlags>&01) //COMBAT_NoDirChange
face <src>
endif
local.time = <GetWeaponSwingTimer>
argn1=<local.time>
FullTrigger @HitTry // I force the trigger and using call will make sure that code is stopped if there's a return in the trigger.
if (<local.return>==1)
return -1
endif
local.time = <argn1>
swing = SWING_SWINGING
tag.fight_moved=0
if (<serv.CombatFlags>&04) //Combat_PreHit
tag.lasthit = <local.time> + <serv.time>
anim 9
timerd = 1
else
timerd = <local.time> / 2
anim 9 // ,<local.time>/10
endif
return 1
endif
if !(<serv.CombatFlags>&01) // COMBAT_NODIRCHANGE
face <src> // If no COMBAT_NoDirChange I face the enemy.
endif
if !(<IsGM>)
reveal
endif
endif
swing = SWING_SWINGING
tag.fight_moved = 0
local.time = <getswingtimer>
timerd = <local.time> / 2
local.weight = <min <qval <weapon> ? <weapon.weight> : 1 >, 10 >
stam -=<local.weight>
if ( <ActDiff> < 0 )
local.sound_miss = <qval <weapon.tag0.override.sound_miss> ? <weapon.tag.override.sound_miss> : 0 >
argo = <weapon>
FullTrigger @HitMiss
if (<local.return>==1)
return -1
endif
endif
if ( <ActDiff> < 0 ) // Calling it again in case the trigger had change it.
if ( <IsSkillRanged <action> > )
local.sound = <qval <local.sound> ? <local.sound> : <qval <r0,1>==1 ? 0233 : 0238 > >
sound = <local.sound>
if ( <local.arrow> )
ref10=<local.arrow>
if ( <r5> )
ref10.attr &=~attr_invis
ref10.p=<src.p>
else
ref10.remove
endif
endif
argn1 SWING_EQUIPPING
return 1
endif
local.sound = <qval <local.sound> ? <local.sound> : <eval { 0238 1, 0239 1, 023a 1} > >
sound = <local.sound>
if (<detail>)
sysmessagef="<defmsg.COMBAT_MISSS>",<src.name>
endif
if (<src.detail>)
src.sysmessagef="<defmsg.COMBAT_MISSO>",<name>
endif
argn1 SWING_EQUIPPING
return 1
endif
if ( <src.action> == healing )
src.action -1
src.sysmessage=<defmsg.HEALING_INTERRUPT>
endif
local.dam=<CalcDamage 0>
local.swing=<argn1>
argn1=<action>
FullTrigger @SkillSuccess
//SkillTrigger @Success
argn1=<local.dam>
fulltrigger @Hit
argn2 |=DAM_FIXED // Damage has been properly set, no need of default checks so DAM_FIXED make Sphere skip internal checks.
if (<local.return>==1)
return -1
endif
if ( <local.arrow> && <r2> ) // Small chance for the arrow to be placed in backpack instead of the ground
src.bounce <local.arrow>
endif
if ( !<src.region.nopvp> && !<IsPlayer> && ! <src.IsPlayer> )
SkillUseQuick <action>
endif
if ( <local.sound> > 0 )
sound = <local.sound>
endif
if ( <weapon> )
if ( <weapon.morex> == 20 ) // Poisoned weapon
if ( <r100> < <weapon.morez> )
local.poison = <r<weapon.morez>>
src.SetPoison <eval <local.poison> * 10 >,<eval <local.poison> / 5>, <uid>
weapon.more -= <local.poison>
weapon.resendtooltip
endif
weapon.damage=<eval <local.dam> / 4 >,<src>
endif
else
if ( <brain> == BRAIN_MONSTER && <poisoning> > 30.0 && <r100> < <poisoning> )
src.SetPoison <r<poisoning>>, <r<poisoning>/50>,<uid>
endif
endif
src.skillgain <argn1>,<actdiff>
endif
[function GetWeaponSwingTimer]
if ( <weapon> )
local.speed=<qval <tag0.override.speed> ? <tag.override.speed> : <weapon.speed> >
if ( <local.speed> )
local.waittime = <eval (<serv.SpeedScaleFactor> * 10 ) / (<max <dex>+100,1> * <local.speed>)>
return <qval <local.waittime> > 5 ?5:<dlocal.waittime>>
endif
endif
if (<brain>==brain_guard)
return 1
endif
// Base speed is just your DEX range=40 to 0
local.waittime = <muldiv (100-<dex>),40,100>
if ( <local.waittime> < 5 ) // no-one needs to be this fast.
local.waittime = 5
else
local.waittime +=5 // why this 'free' increase of wait time?
endif
// Speed also effected by strength
// This is only reached if weapon.speed = 0 and !weapon.tag.override.speed, correct?
if (<weapon>)
local.weaponwait = (<weapon.weight>*10) / 40
if (<weapon.twohands>)// 2 handed is slower
local.weaponwait += <local.waittime>/2
endif
else
local.waittime +=2
endif
return <dlocal.waittime>
[function SetPoison]
// argn1 = Poison strenght
// argn2 = duration
// argn3 = src
if ( <flags>&statf_conjured ) // No poison for conjured creatures.
return 0
endif
if ( <flags>&statf_poisoned ) // If already poisoned, charges get updated (but not strenght)
findid.i_rune_poison.more2 += <argv2>
return 0
endif
sysmessage=<defmsg.JUST_BEEN_POISONED>
if ( <flags>&statf_freeze )
flags &=~statf_freeze
endif
spelleffect s_poison,<argv1>,<argv3>
new.more2=<argv2>
return 1
[function f_combat_gethit] // GetHit
if (<flags>&statf_invul)
effect 3,14265,9,30
return 1
elseif (<flags>&statf_stone)
effect 3,14265,9,30
return 1
elseif (<region.safe>)
effect 3,14265,9,30
return 1
elseif ( (<region.nopvp>) && ((<src.IsPlayer>) || (<src.memoryfindtype.memory_ipet.link.isplayer>)) )
effect 3,14265,9,30
return 1
elseif (<flags>&statf_dead)
return 1
endif
local.dam=<argn1>
if (<serv.CombatFlags>&00008) // Combat_Use_Resistance
if (<argn2>&dam_physical)
local.damcount ++
endif
if (<argn2>&dam_pierce)
local.damcount ++
endif
if (<argn2>&dam_slash)
local.damcount ++
endif
if (<argn2>&dam_poison)
local.damcount ++
local.temppoison ++
endif
if (<argn2>&dam_energy)
local.damcount ++
local.tempenergy ++
endif
if (<argn2>&dam_cold)
local.damcount ++
local.tempcold ++
endif
if (<argn2>&dam_fire)
//if (<serv.chardef.<baseid>.can>&mt_fire_immune) // Old check, can is also stored in dynamic characters, not only chardef.
if ( <can>&mt_fire_immune )
if !( <argn2>& DAM_PHYSICAL || <argn2>& DAM_PIERCE || <argn2>& DAM_SLASH || <argn2>& DAM_POISON || <argn2>& DAM_ENERGY || <argn2>& DAM_COLD ) // if the damage type is fire only
return 1 // no dmg
endif
// local.dmg /=2 // this is the default code
local.tmpfire = 0 // but this makes more sense.
else
local.damcount ++
local.tempfire ++
endif
endif
if (<local.damcount>==7) // if all damages are present, bonus dmg.
local.damcount ++
endif
local.temppoison *= <argn> / <local.damcount>
local.tempfire *= <argn> / <local.damcount>
local.tempcold *= <argn> / <local.damcount>
local.tempenergy *= <argn> / <local.damcount>
if ( (<local.temppoison>+<local.tempfire>+<local.tempcold>+<local.tempenergy>) < <local.dam> )
local.dam -= (<local.temppoison>+<local.tempfire>+<local.tempcold>+<local.tempenergy>)
else
local.dam = 0
endif
local.fire +=<local.tempfire>
local.cold +=<local.tempcold>
local.energy +=<local.tempenergy>
local.poison +=<local.temppoison>
endif
local.fire -= <muldiv <local.fire>,<resfire>,100>
local.cold -= <muldiv <local.cold>,<rescold>,100>
local.energy -= <muldiv <local.energy>,<resenergy>,100>
local.poison -= <muldiv <local.poison>,<respoison>,100>
if (<local.dam> < 0 && <local.fire> < 0 && <local.cold> < 0 && <local.energy>< 0 && <local.poison>< 0 )
return 1
endif
if ( <src.Weapon> && <serv.CombatFlags>&00080 && (<argn2>&DAM_PHYSICAL || <argn2>&DAM_PIERCE || <argn2>&DAM_SLASH)) ) // COMBAT_OSIDAMAGEMOD
local.mod = 0
local.modtemp = 0
// Begin bonus section
if ( <src.weapon.type>==t_weapon_axe || <weapon.type>==t_weapon_sword )
local.modtemp = <src.lumberjacking>/50
if (<src.lumberjacking> > 100.0)
local.modtemp +=10
endif
endif
local.mod +=<local.modtemp>
local.modtemp=<src.tactics>/16
if (<src.tactics>> 100.0)
local.modtemp +=6
endif
local.mod +=<local.modtemp>
local.modtemp=<src.anatomy>/16
if (<src.anatomy>> 100.0)
local.modtemp +=5
endif
local.mod += <local.modtemp>
local.modtemp=<src.str>/3
if (<src.str> > 100 )
local.modtemp += 5
endif
local.mod += <local.modtemp>
local.dam += <local.dam> * (<local.mod>/100) // local.dam += <local.dam> * current bonus /100
// End bonus section
endif
local.dam = <local.dam> + <local.fire> + <local.energy> + <local.cold> + <local.poison>
argn1=<local.dam>
FullTrigger @GetHit
if (<local.return> == 1)
return 1
endif
if ( (<argn2>&dam_energy || <argn2>&dam_physical || <argn2>&dam_fire || <argn2>&dam_pierce || <argn2>&dam_slash || <argn2>&dam_magic ) && !(<argn2>&dam_nounparalyze))
if (<flags>&statf_freeze)
findid.i_rune_paralyze.remove
endif
endif
if ( <argn2>&dam_physical || <argn2>&dam_pierce || <argn2>&dam_slash) )
if (<flags>&statf_hidden)
flags &= ~statf_hidden
endif
if ( (<flags>&statf_reactive) && !(<argn2>&dam_god) )
if !( (<src> == <uid>) || (<src.brain>==brain_guard) || (<distance> > 2) ) // We shouldn't reflect dmg to ourselves or guards or targets with distance > 2
local.effect=<f_value_getlinear <magery>,100.0,<serv.spell.s_reactive_armor.effect>> // We asume max magery skill = 100.0
endif
local.effect=<medium <0,<local.effect>,(<local.dam>-1)>
// make sure the reflected damage is between 0 and local.Dam-1 or else
// 2 reactive armour users could get caught in an infinite loop of
// reflecting damage
if (<local.effect> > 0)
local.dam -=<local.effect>
src.damage <local.effect>,<uid>,<argn2>
TRYSRC <src> effect 3,14154,9,6
endif
endif
//armor calculations
if !(<argn2>&dam_god)
if !(<argn2>&dam_general)
local.armor=<r<max (<armor>+<modar>),0>>
local.dmg=<OnTakeDmg <local.dam>,<src>,<argn2>> // fixme iDmg = OnTakeDamageHitPoint( iDmg, pSrc, uType );
if (<serv.MagicFlags>&04) // MAGICF_IGNOREAR
local.armor = 0
else
local.armor /=2
endif
local.dmg -= <local.armor>
elseif !(<serv.MagicFlags>&04 || <argn2>&dam_magic)
local.dmg -=<r<<armor>+<serv.chardef.<baseid>.armor>>>
endif
endif
endif
//FixMe
// from here i'll add DAM_FIXED so the sphere itself handles the rest of code, which not all can be scriptable right now (the parts with FIXME)
// FIXME src.AttackedBy <uid>
// local.id=<attacker.id <src>>
// if !( <local.id>)
// attacker.add <src>
// local.id=<attacker.id <src>>
// endif
// attacker.<dlocal.id>.dam += <local.dam>
// attacker.<dlocal.id>.elapsed = 0
// attacker.<dlocal.id>.threat += <local.dam>
// if (<local.dam> > 10 )
// local.blood=<r4650,4655>
// elseif (<r<local.dam>> > 5)
// local.blood=5701
// endif
// if ( (<local.blood> && (<argn2>&dam_pierce || <argn2>&dam_slash) && !(<flags>&statf_conjured) )
// serv.newitem=<local.blood>
// new.attr=attr_decay|attr_move_never
// new.timer=7
// endif
// hits -= <local.dam>
// anim = 20
//fixme add/remove/update memorys
//fixme [url=u-death-9220.html]@death[/url]/@DeathCorpse + @Kill triggers
// return 1
argn2 |=dam_fixed
[function OnTakeDmg]
// This function is called when every check is already done, the damage is calculated and the dam is going to come.
// The body part which is going to be hit is checked in this function.
// Deflect some damage with shield or weapon ?
if !( <argv2>&DAM_GENERAL )
return <argv0>
endif
local.dam=<argv0>
if ( ( <flags>&STATF_HASSHIELD ) && ( ( <argv2>&DAM_PHYSICAL ) || ( <argv2>&DAM_PIERCE ) || ( <argv2>&DAM_SLASH ) ) && !( ( <argv2>&DAM_GOD ) || ( <argv2>&DAM_ENERGY ) ) )
ref1=<findlayer.2>
if ( <ref1.type>==t_shield && <SkillUseQuick Parrying,<r<qval <src>!=<uid>? <src.tactics>/10:100>>> )
local.def=<r<ref1.Armor_GetDefense>/2>
local.hitscur=<ref1.hits>
ref1.damage=<min <local.dam>,<local.def>>,<argv1>,<argv2>
if ( <hits> < <local.hitscur> )
sysmessage = <defmsg.COMBAT_PARRY>
endif
local.dam -= <local.def>
endif
endif
if ( <can>&MT_NONHUM )
return <dlocal.dam>
endif
// Where was the hit ?
local.HitRoll = <r100> // determine area of body hit
local.HitArea = 0 // 0 = HEAD
local.HitPref = <qval <src.tag0.HitPreference> ?<src.tag.HitPreference>:0>
local.HitPrefChance = <qval <src.tag0.HitPreference_Chance>?<src.tag.HitPreference_Chance>:<src.tactics>>
local.HitPrefPenalty = <qval <src.tag0.HitPreference_Penalty>?<src.tag0.HitPreference_Penalty>:30> // Percent
local.HitPrefBonus = <qval <src.tag0.HitPreference_Bonus>?<src.tag0.HitPreference_Bonus>:30> // Percent
if ( ( <serv.CombatFlags>&02000 ) && ( <local.HitPref>!=0 ) && ( ( <argv2>&DAM_PHYSICAL ) || ( <argv2>&DAM_PIERCE ) || ( <argv2>&DAM_SLASH ) ) && !( ( <argv2>&DAM_GOD ) || ( <argv2>&DAM_ENERGY ) ) )
if (<r1100> < <local.HitPrefChance> )
while ( <local.HitPref> > 7 ) // Here the default body parts are used, if you are planing to extend it ... place a check for bodies, ie: if body == dragon, must be higher than 7 and lower than 14?
local.HitPref -= 7 // We lower it until we get a useable value.
end
local.HitArea=<local.HitPref>-1
local.dam += (<local.dam>*<local.HitPrefBonus>)/100
else
local.dam += (<local.dam>*<local.HitPrefPenalty>)/100
src.sysmessage=<defmsg.COMBAT_TARGET_MISSED>
while ( <local.hitarea> <= 7 && <local.hitroll> > 0 )
local.HitRoll -= <Armor_GetCoverageZone <local.hitarea>>
local.hitarea ++
end
endif
else
while ( <local.hitarea> <= 7 && <local.hitroll> > 0 )
local.HitRoll -= <Armor_GetCoverageZone <local.hitarea>>
local.hitarea ++
end
endif
if ( ( ( <argv2>&DAM_PHYSICAL ) || ( <argv2>&DAM_PIERCE ) || ( <argv2>&DAM_SLASH ) ) && !( ( <argv2>&DAM_GOD ) || ( <argv2>&DAM_ENERGY ) ) )
if ( <detail> || <src.detail> )
local.rMsg=<r3>
doswitch <local.hitarea>
local.tMsg=combat_hit_head
local.tMsg=combat_hit_neck
local.tMsg=combat_hit_back
local.tMsg=combat_hit_chest
local.tMsg=combat_hit_arms
local.tMsg=combat_hit_hands
local.tMsg=combat_hit_legs
local.tMsg=combat_hit_feet
enddo
if ( <argv0> > 10 && ( <local.hitarea>==ARMOR_HEAD || <local.hitarea>==ARMOR_CHEST ) )
local.rMsg +=3
endif
local.selfmsg=<local.tMsg><dlocal.rMsg>o
local.targmsg=<local.tMsg><dlocal.rMsg>s
if (<detail>)
sysmessagef=<defmsg.<local.selfmsg>>,<src.name>
endif
if (<src.detail>)
src.sysmessagef=<defmsg.<local.targmsg>>,<name>
endif
endif
endif
if ( ( <serv.MagicFlags>&04 ) && ( <argv2>&DAM_MAGIC ) ) //MAGICF_IGNOREAR. No need to check the following if we don't need it.
return <dlocal.dam>
endif
local.maxcoverage=0
for 0 24
ref1=<findlayer.<local._for>>
if (<ref1>)
if (<ref1.morex>)
if (<ref1.morex> == s_SteelSkin || <ref1.morex> == s_StoneSkin || <ref1.morex> == s_Arch_Prot || <ref1.morex> == s_Protection )
local.maxcoverage <max <local.maxcoverage>,<f_value_getlinear <morez>,<serv.skillclass.skillclass_undeclared.magery>,<serv.spell.<ref1.morex>.effect>> >
endif
endif
for zone 0 7
if (<ref1.armor_IsCoverageZone <local.zone>>)
if ( <serv.CombatFlags>&01000 ) // COMBAT_STACKARMOR
local.maxcoverage +=<ref1.armor_getdefense>
else
local.maxcoverage = <max <local.maxcoverage>,<ref1.armor_getdefense> >
endif
ref1.damage=<local.dam>,<argv1>,<argv2>
endif
endfor
endif
endfor
local.dam -=<r<local.maxcoverage>>
return <dlocal.dam>
[DEFNAME body_parts]
// These are the current hit parts.
ARMOR_HEAD = 0
ARMOR_NECK = 1
ARMOR_BACK = 2
ARMOR_CHEST = 3 // or thorax
ARMOR_ARMS = 4
ARMOR_HANDS = 5
ARMOR_LEGS = 6
ARMOR_FEET = 7
// Following ones are not being used, but can give some ideas for extending the actual hit system.
// BODYPART_LEGS2 =8 // Alternate set of legs (spider)
// BODYPART_TAIL =9 // Dragon, Snake, Alligator, etc. (tail attack?)
// BODYPART_WINGS =10 // Dragon, Mongbat, Gargoyle
// BODYPART_CLAWS =11 // can't wear any gloves here!
// BODYPART_HOOVES =12 // No shoes
// BODYPART_HORNS =13 // Bull, Daemon
// BODYPART_STALKS =14 // Gazer or Corpser
// BODYPART_BRANCHES =15 // Reaper.
// BODYPART_TRUNK =16 // Reaper.
// BODYPART_PSEUDOPOD =17 // Slime
// BODYPART_ABDOMEN =18 // Spider or insect. asusme throax and chest are the same.
[function Armor_GetCoverageZone]
if ( <argn>==ARMOR_BACK )
return <max <Armor_GetCoverageLayer LAYER_SHIRT,<argn>>,<Armor_GetCoverageLayer LAYER_CHEST,<argn>>,<Armor_GetCoverageLayer LAYER_TUNIC,<argn>>,<Armor_GetCoverageLayer LAYER_CAPE,<argn>>,<Armor_GetCoverageLayer LAYER_ROBE,<argn>>>
elseif ( <args> == ARMOR_FEET )
return <max <Armor_GetCoverageLayer LAYER_SHOES,<argn>>,<Armor_GetCoverageLayer LAYER_LEGS,<argn>>>
elseif ( <args> == ARMOR_LEGS )
return <max <Armor_GetCoverageLayer LAYER_PANTS,<argn>>,<Armor_GetCoverageLayer LAYER_SKIRT,<argn>>,<Armor_GetCoverageLayer LAYER_HALF_APRON,<argn>>,<Armor_GetCoverageLayer LAYER_ROBE,<argn>>,<Armor_GetCoverageLayer LAYER_LEGS,<argn>>>
elseif ( <args> == ARMOR_CHEST )
return <max <Armor_GetCoverageLayer LAYER_SHIRT,<argn>>,<Armor_GetCoverageLayer LAYER_CHEST,<argn>>,<Armor_GetCoverageLayer LAYER_TUNIC,<argn>>,<Armor_GetCoverageLayer LAYER_ROBE,<argn>>>
elseif ( <args> == ARMOR_NECK )
return <Armor_GetCoverageLayer LAYER_COLLAR,<argn>>
elseif ( <args> == ARMOR_ARMS )
return <max <Armor_GetCoverageLayer LAYER_ARMS,<argn>>,<Armor_GetCoverageLayer LAYER_ROBE,<argn>>,<Armor_GetCoverageLayer LAYER_CAPE,<argn>>>
elseif ( <args> == ARMOR_HANDS )
return <Armor_GetCoverageLayer LAYER_GLOVES,<argn>>
elseif ( <args> == ARMOR_HEAD )
return <Armor_GetCoverageLayer LAYER_HELM,<argn>>
endif
return 0
[function Armor_IsCoverageZone]
if ( <args> == ARMOR_BACK )
return <eval ( (<layer>==LAYER_SHIRT) || (<layer>==LAYER_CHEST) || (<layer>==LAYER_TUNIC) || (<layer>==LAYER_CAPE) || (<layer>==LAYER_ROBE))>
elseif ( <args> == ARMOR_FEET )
return <eval (<layer>==LAYER_SHOES || <layer>==LAYER_LEGS )>
elseif ( <args> == ARMOR_LEGS )
return <eval (<layer>==LAYER_PANTS || <layer>==LAYER_SKIRT || <layer>==LAYER_HALF_APRON || <layer>==LAYER_ROBE || <layer>==LAYER_LEGS)>
elseif ( <args> == ARMOR_CHEST )
return <eval (<layer>==LAYER_SHIRT || <layer>==LAYER_CHEST || <layer>==LAYER_TUNIC || <layer>==LAYER_ROBE )>
elseif ( <args> == ARMOR_NECK )
return <eval (<layer>==LAYER_COLLAR )>
elseif ( <args> == ARMOR_ARMS )
return <eval (<layer>==LAYER_ARMS || <layer>==LAYER_ROBE || <layer>==LAYER_CAPE )>
elseif ( <args> == ARMOR_HANDS )
return <eval (<layer>==LAYER_GLOVES )>
elseif ( <args> == ARMOR_HEAD )
return <eval (<layer>==LAYER_HELM )>
endif
return 0
[function Armor_GetCoverageLayer]
// Uncommenting the first line will make the system calc the percentaje of armor for armor + modar*GetcoveragePercent (body area),100 (Old Style) instead of ResPhysical when hitting body parts.
return <eval <findlayer.<argv0>.armor> +<findlayer.<argv0>.modar>>
// Here we have the % of armor coverage for each body zone
[function Armor_GetCoveragePercent]
if ( <argn>==ARMOR_BACK )
return <ddef.coverage_layer_back>
elseif ( <argn>==ARMOR_HEAD )
return <ddef.coverage_layer_head>
elseif ( <argn>==ARMOR_NECK )
return <ddef.coverage_layer_collar>
elseif ( <argn>==ARMOR_CHEST )
return <ddef.coverage_layer_chest>
elseif ( <argn>==ARMOR_ARMS )
return <ddef.coverage_layer_arms>
elseif ( <argn>==ARMOR_HANDS )
return <ddef.coverage_layer_gloves>
elseif ( <argn>==ARMOR_LEGS )
return <ddef.coverage_layer_legs>
elseif ( <argn>==ARMOR_FEET )
return <ddef.coverage_layer_feet>
endif
[DEFNAME armor_coverages]
coverage_layer_head=10
coverage_layer_neck=5
coverage_layer_back=10
coverage_layer_chest=30
coverage_layer_arms=10
coverage_layer_hands=10
coverage_layer_legs=20
coverage_layer_feet=5
[function Armor_GetDefense]
if !( <IsArmor> )
return 0
endif
local.val = <armor> + <modar>
local.repair = <GetRepairPercent>
local.val = <muldiv <local.val>,<local.repair>,100>
if ( <attr>&ATTR_MAGIC )
local.repair = <f_value_getlinear <morey>,<serv.skillclass.skillclass_undeclared.magery>,<serv.spell.s_enchant.effect>
local.val += <local.repair>
if ( <local.val> < 0 )
local.val = 0
endif
endif
return <dlocal.val>
[function medium]
return <qval <argv0>><argv1> ? <argv0> : <qval <argv2>< <argv1> ? <argv2> : <argv1>>>
[function f_value_getlinear]
// arg0 = actual value
// arg1 = max posible value
// arg2-5 = values to calculate
// example: <f_Value_GetLinear <magery>,<serv.skillclass.<skillclass>.magery>,<serv.spell.s_reactive_armor.effect>> will return the current value for your magery skill at this spell.
local.SegSize=0
local.LoIdx=0
local.skill=<argv0>
args=<streat <args>>
local.max=<argv0>
args=<streat <args>>
local.Qty = <argv>
doswitch <local.Qty>
return 0 // no values defined !
return <eval (<args>*<local.skill>)/<local.max>>
local.SegSize=1000
begin
if ( <local.skill> >= 500 )
local.LoIdx = 1
local.skill -= 500
endif
local.SegSize = 500
end
enddo
if (<local.qty>>3)
local.LoIdx = <MULDIV <local.skill>, <local.Qty>, 1000 >
local.Qty --
if ( <local.LoIdx> >= <local.Qty> )
local.LoIdx = <local.Qty> - 1
endif
iSegSize = 1000 / <local.Qty>
local.skill -= ( <local.LoIdx> * <local.SegSize> )
endif
local.LoVal = <argv<dlocal.LoIdx>>
local.HiVal = <argv<eval <local.LoIdx>+1>>
if (<local.HiVal> < <local.LoVal>)
local.HiVal = <local.LoVal>
endif
local.Chance = <local.LoVal> + <MULDIV <eval <local.HiVal> - <local.LoVal>>, <local.skill>, <local.SegSize> >
if ( <local.Chance> <= 0 )
return 0 // less than no chance ?
endif
return <dlocal.Chance>
[function CalcDamage]
// argn1 = 0 = normal damage.
// argn1 = 1 = random damage.
if ( <brain> == BRAIN_GUARD && <serv.GuardsInstantKill> )
return <src.maxhits> + 10000
endif
local.ret=1
if ( <serv.CombatFlags>&080 ) // Combat_OsiDamageMod
if ( <IsSkillRanged <action> > )
local.ret += <qval <argn1> == 1 ? <r<dex>> : <dex> > / 10
else
local.ret += <qval <argn1> == 1 ? <r<str>> : <str> > / 10
endif
endif
if ( <weapon> )
local.ret += <weapon.WeaponCalcDamage <argn1>>
else
local.ret += <dam.lo>
local.ret += <qval <argn1> == 1 ? <r<dam.hi>> : <dam.hi> >
endif
if ( <local.ret> < 0 )
local.ret = 0
endif
return <dlocal.ret>
[function WeaponCalcDamage]
local.ret=<dam.lo> + <modar>
local.ret += <qval <argn1> == 1 ? <r<dam.hi>> : <dam.hi> >
local.ret = <muldiv <local.ret>,<GetRepairPercent>,100>
if ( <attr>&attr_magic && !<type>==t_wand )
local.ret += <f_Value_GetLinear <more2>,<serv.skillclass.0.magery>,<serv.spell.s_enchant.effect>>
endif
if ( <local.ret> < 0 )
local.ret = 0
endif
return <dlocal.ret>
[function GetRepairPercent]
if ( !<MaxHits> || ( <MaxHits> < <Hits> ) )
return 100
endif
return <muldiv <hits>,100,<MaxHits> >
[function fixedid]
local.flags=<tdata3>
local.flags &=~0ffffffff9c000000
return <local.flags>
[function IsSkillRanged]
if !(<def0.<args>>)
return 0
endif
return <qval <args>==archery ? 1 : <qval <args>==throwing ? 1 : 0>>
[EOF]//****************************************************************************
// SPHERE by : Menasoft ©1997-2020
// www.sphereserver.net
// All SPHERE script files and formats are copyright Menasoft & Partners.
// This file may be freely edited for personal use, but may not be distributed
// in whole or in part, in any format without express written permission from
// Menasoft & Partners. All donations and contributions
// become the property of Menasoft & Partners.
//****************************************************************************
// FILE LAST UPDATED: Sunday, Apr 20, 2020
//
VERSION=0.56d
[ADVANCE]
// Generic advance rates for stats
STR=10000,4000,600
INT=10000,4000,600
DEX=10000,4000,600
[COMMENT SKILL x]
ADV_RATE=10.0,200.0,800.0
// 10.0 successes at 0% to gain .1,
// 800.0 successes at 100% to gain .1,
// 200.0 successes at 50% to gain .1
GAINRADIUS=100.0
// Skillgain will only be calculated if the current skill is less than the
// actual difficulty + GAINRADIUS. Used to prohibit skillgain by
// performing way too easy tasks. Set to 100.0 for original behaviour.
VALUES=0,100
// The amount of value an item created with the skill gets at skill levels.
EFFECT=0,100
// Healing: Effect of bandages
// Crafting Skills: Percentage of resources lost on failure.
STAT_STR=80
// You will tend toward these stat vals if you use this skill a lot.
BONUS_STATS=0
// What percent of the skill success is based on stat levels. = 10%.
BONUS_STR=80
// % of each stat toward success at skill.
[SKILL 0]
DEFNAME=Skill_Alchemy
KEY=Alchemy
TITLE=Alchemist
FLAGS=skf_craft
DELAY=1.2 //Old value=3.0,1.0 // per stroke.
STAT_STR=5
STAT_DEX=40
STAT_INT=75
BONUS_STR=0
BONUS_DEX=20
BONUS_INT=80
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
VALUES=1,20,100
ON=@Fail
SRC.SYSMESSAGE You toss the failed mixture from the mortar, unable to create a potion from it.
ON=@Abort
SRC.SYSMESSAGE You fail to complete the potion.
[SKILL 1]
DEFNAME=Skill_Anatomy
KEY=Anatomy
TITLE=Biologist
PROMPT_MSG=Whom shall I examine?
DELAY=1.0
STAT_STR=15
STAT_DEX=15
STAT_INT=70
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
RANGE=8
ON=@Fail
SRC.SYSMESSAGE You cannot quite get a sense of their physical characteristics.
ON=@Abort
SRC.SYSMESSAGE You fail to examine the creature fully.
[SKILL 2]
DEFNAME=Skill_Animal_Lore
KEY=AnimalLore
TITLE=Naturalist
PROMPT_MSG=What animal should I look at?
DELAY=1.0
STAT_STR=0
STAT_DEX=0
STAT_INT=70
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
RANGE=12
ON=@Fail
SRC.SYSMESSAGE You can't think of anything you know offhand.
ON=@Abort
SRC.SYSMESSAGE You stop trying to understand the creature.
[SKILL 3]
DEFNAME=Skill_Appraise
KEY=ItemID
TITLE=Merchant
PROMPT_MSG=What do you wish to appraise and identify?
DELAY=1.0
STAT_STR=0
STAT_DEX=0
STAT_INT=85
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
RANGE=3
ON=@Fail
SRC.SYSMESSAGE You have no idea how much it might be worth.
ON=@Abort
SRC.SYSMESSAGE You can't concentrate enough to come up with a good estimate.
[SKILL 4]
DEFNAME=Skill_ArmsLore
KEY=ArmsLore
TITLE=Weapon Master
PROMPT_MSG=What item do you wish to get information about?
DELAY=1.0
STAT_STR=10
STAT_DEX=15
STAT_INT=50
BONUS_STR=33
BONUS_DEX=33
BONUS_INT=34
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
RANGE=3
ON=@Fail
SRC.SYSMESSAGE You are not certain...
ON=@Abort
SRC.SYSMESSAGE You stop trying to evaluate the item.
[SKILL 5]
DEFNAME=Skill_Parrying
KEY=Parrying
TITLE=Duelist
FLAGS=skf_fight
STAT_STR=75
STAT_DEX=25
STAT_INT=15
BONUS_STR=50
BONUS_DEX=50
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=10.0,150.0,600.0
ON=@UseQuick
IF (<ARGN3>)
SRC.EFFECT 3,i_fx_glow,10,16
ENDIF
[SKILL 6]
DEFNAME=Skill_Begging
KEY=Begging
TITLE=Beggar
PROMPT_MSG=To whom do you wish to grovel?
DELAY=2.0
STAT_STR=5
STAT_DEX=25
STAT_INT=55
BONUS_STR=0
BONUS_DEX=50
BONUS_INT=50
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@Abort
SRC.SYSMESSAGE You fail utterly in your attempt to grovel.
[SKILL 7]
DEFNAME=Skill_Blacksmith
KEY=Blacksmithing
TITLE=Blacksmith
FLAGS=skf_craft
DELAY=1.2 //Old value=1.7
STAT_STR=95
STAT_DEX=25
STAT_INT=15
BONUS_STR=75
BONUS_DEX=20
BONUS_INT=5
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
VALUES=1,20,100
ON=@Fail
SRC.SYSMESSAGE You have failed to make anything
ON=@Abort
SRC.SYSMESSAGE You fail to complete the item.
[SKILL 8]
DEFNAME=Skill_Bowcraft
KEY=Bowcraft
TITLE=Bowyer
FLAGS=skf_craft
DELAY=1.2 //Old value=1.7
STAT_STR=40
STAT_DEX=70
STAT_INT=45
BONUS_STR=15
BONUS_DEX=70
BONUS_INT=15
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
VALUES=1,30,200
ON=@Fail
SRC.SYSMESSAGE You fail to create the item
ON=@Abort
SRC.SYSMESSAGE You fail to complete the item.
[SKILL 9]
DEFNAME=Skill_Peacemaking
KEY=Peacemaking
TITLE=Pacifier
DELAY=2.0
STAT_STR=0
STAT_DEX=70
STAT_INT=70
BONUS_STR=0
BONUS_DEX=50
BONUS_INT=50
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@Fail
SRC.SYSMESSAGE You attempt to calm everyone, but fail.
ON=@Abort
SRC.SYSMESSAGE You fail to complete the song.
[SKILL 10]
DEFNAME=Skill_Camping
KEY=Camping
TITLE=Explorer
DELAY=6.0
STAT_STR=30
STAT_DEX=30
STAT_INT=30
BONUS_STR=33
BONUS_DEX=33
BONUS_INT=34
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@Fail
SRC.SYSMESSAGE You fail to ignite the campfire.
ON=@Abort
SRC.SYSMESSAGE You give up trying to light the campfire.
[SKILL 11]
DEFNAME=Skill_Carpentry
KEY=Carpentry
TITLE=Carpenter
FLAGS=skf_craft
DELAY=1.2 //Old value=3.0
STAT_STR=60
STAT_DEX=30
STAT_INT=40
BONUS_STR=50
BONUS_DEX=30
BONUS_INT=20
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
VALUES=1,20,80
ON=@Fail
SRC.SYSMESSAGE You fail to create the item
ON=@Abort
SRC.SYSMESSAGE You fail to complete the item.
[SKILL 12]
DEFNAME=Skill_Cartography
KEY=Cartography
TITLE=Cartographer
FLAGS=skf_craft
DELAY=3.0
STAT_STR=15
STAT_DEX=20
STAT_INT=70
BONUS_STR=0
BONUS_DEX=20
BONUS_INT=80
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
VALUES=1,20,80
ON=@Select
SRC.SYSMESSAGE This skill cannot be used directly.
return 1
ON=@Fail
SRC.SYSMESSAGE Thy trembling hand results in an unusable map.
ON=@Abort
SRC.SYSMESSAGE You fail to complete the map.
[SKILL 13]
DEFNAME=Skill_Cooking
KEY=Cooking
TITLE=Chef
PROMPT_MSG=What would you like to cook?
FLAGS=skf_craft
DELAY=1.2 //Old value=1.5
STAT_STR=25
STAT_DEX=20
STAT_INT=45
BONUS_STR=0
BONUS_DEX=40
BONUS_INT=60
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
VALUES=1,20,80
ON=@Fail
SRC.SYSMESSAGE You burn the food to a crisp! It's ruined.
ON=@Abort
SRC.SYSMESSAGE You stop cooking the food.
[SKILL 14]
DEFNAME=Skill_DetectHidden
KEY=DetectingHidden
TITLE=Scout
DELAY=3.0,2.0
STAT_STR=15
STAT_DEX=20
STAT_INT=60
BONUS_STR=0
BONUS_DEX=20
BONUS_INT=80
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@Fail
SRC.SYSMESSAGE You can see nothing hidden there.
ON=@Abort
SRC.SYSMESSAGE You stop looking for anything hidden.
[SKILL 15]
DEFNAME=Skill_Enticement
KEY=Enticement
TITLE=Demoralizer
PROMPT_MSG=Whom do you wish to entice?
DELAY=2.0
STAT_STR=15
STAT_DEX=50
STAT_INT=70
BONUS_STR=0
BONUS_DEX=50
BONUS_INT=50
BONUS_STATS=5
ADV_RATE=2.5,50.0,200.0
ON=@Fail
SRC.SYSMESSAGE Your music fails to attract anyone.
ON=@Abort
SRC.SYSMESSAGE You fail to complete the song.
[SKILL 16]
DEFNAME=Skill_EvalInt
KEY=EvaluatingIntel
TITLE=Scholar
PROMPT_MSG=What would you like to evaluate?
DELAY=1.0
STAT_STR=5
STAT_DEX=10
STAT_INT=60
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
RANGE=8
ON=@Fail
SRC.SYSMESSAGE You cannot quite judge its mental abilities.
ON=@Abort
SRC.SYSMESSAGE You fail to inspect the creature completely.
[SKILL 17]
DEFNAME=Skill_Healing
KEY=Healing
TITLE=Healer
PROMPT_MSG=Who will you use the bandages on?
DELAY=3.0,1.0
EFFECT=2.0,20.0
STAT_STR=10
STAT_DEX=10
STAT_INT=90
BONUS_STR=0
BONUS_DEX=30
BONUS_INT=70
BONUS_STATS=0
ADV_RATE=10.0,100.0,250.0
ON=@Fail
SRC.SYSMESSAGE You apply the bandages, but they barely help.
ON=@Abort
SRC.SYSMESSAGE You stop applying the bandages.
[SKILL 18]
DEFNAME=Skill_Fishing
KEY=Fishing
TITLE=Fisherman
PROMPT_MSG=What water do you want to fish in?
FLAGS=skf_gather
DELAY=8.0
STAT_STR=40
STAT_DEX=40
STAT_INT=30
BONUS_STR=10
BONUS_DEX=90
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
VALUES=1,30,200
RANGE=4
ON=@PreStart
IF (<SRC.FLAGS> & statf_onhorse|statf_hovering)
SRC.SYSMESSAGE You can't fish while riding or flying!
return 1
ENDIF
ON=@Start
ANIM 12
SERV.NEWITEM i_memory_fishing_splash
NEW.LINK=<UID>
NEW.P=<ACT.P>
ON=@Success
ACTARG2=1 // location to drop the created item (0 = ground / 1 = backpack)
REF1=<SRC.FINDLAYER.layer_hand2>
IF (<REF1>)
IF (<REF1.USESCUR> > 0)
REF1.USESCUR --
IF (<REF1.USESCUR> < 1)
REF1.DESTROY 1
ENDIF
ENDIF
ENDIF
ON=@Fail
SRC.SYSMESSAGE You fish a while, but fail to catch anything.
ON=@Abort
SRC.SYSMESSAGE You pull your line back in and stop fishing.
ON=@Stroke
IF (<SRC.FLAGS> & statf_onhorse|statf_hovering)
SRC.SYSMESSAGE You can't fish while riding or flying!
return 1
ENDIF
[ITEMDEF i_memory_fishing_splash]
ID=i_memory
ON=@Create
ATTR=attr_move_never|attr_decay
TIMERD=15
IF (<TIMERD> > <SERV.SKILL.FISHING.DELAY>)
TIMERD=<eval <SERV.SKILL.FISHING.DELAY> / 2>
ENDIF
ON=@Timer
IF (<LINK.ACTION> == skill_fishing)
EFFECT 2,0352d,4,16
SOUND 0364
ENDIF
[SKILL 19]
DEFNAME=Skill_Forensics
KEY=Forensics
TITLE=Detective
PROMPT_MSG=Select what you want to examine.
DELAY=1.0
STAT_STR=10
STAT_DEX=25
STAT_INT=60
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
RANGE=12
ON=@Fail
SRC.SYSMESSAGE You cannot determine anything useful.
ON=@Abort
SRC.SYSMESSAGE You decide you'd rather not look at that.
[SKILL 20]
DEFNAME=Skill_Herding
KEY=Herding
TITLE=Shepherd
DELAY=2.0
STAT_STR=50
STAT_DEX=50
STAT_INT=50
BONUS_STR=25
BONUS_DEX=45
BONUS_INT=30
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@Fail
SRC.SYSMESSAGE You don't seem to be able to persuade that to move.
ON=@Abort
SRC.SYSMESSAGE You give up trying to persuade that to move.
[SKILL 21]
DEFNAME=Skill_Hiding
KEY=Hiding
TITLE=Shade
DELAY=2.0
STAT_STR=20
STAT_DEX=90
STAT_INT=60
BONUS_STR=0
BONUS_DEX=80
BONUS_INT=20
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@Fail
SRC.SYSMESSAGE You can't seem to hide here.
ON=@Abort
SRC.SYSMESSAGE You stop trying to hide.
[SKILL 22]
DEFNAME=Skill_Provocation
KEY=Provocation
TITLE=Rouser
PROMPT_MSG=Whom do you wish to incite?
DELAY=3.0
STAT_STR=20
STAT_DEX=70
STAT_INT=60
BONUS_STR=0
BONUS_DEX=90
BONUS_INT=10
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@Fail
SRC.SYSMESSAGE Your music fails to incite enough anger.
ON=@Abort
SRC.SYSMESSAGE You decide not to incite anything for now.
[SKILL 23]
DEFNAME=Skill_Inscription
KEY=Inscription
TITLE=Scribe
FLAGS=skf_craft
DELAY=1.2 //Old value=3.0
EFFECT=50
STAT_STR=15
STAT_DEX=15
STAT_INT=100
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
VALUES=1,30,200
ON=@Fail
SRC.SYSMESSAGE You fail to inscribe the scroll, and the scroll is ruined.
ON=@Abort
SRC.SYSMESSAGE You scribble on the scroll a bit, but fail to finish it.
[SKILL 24]
DEFNAME=Skill_Lockpick
KEY=Lockpicking
TITLE=Infiltrator
PROMPT_MSG=What do you want to pick?
DELAY=3.0
STAT_STR=20
STAT_DEX=90
STAT_INT=60
BONUS_STR=0
BONUS_DEX=80
BONUS_INT=20
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@Fail
SRC.SYSMESSAGE You are unable to pick the lock.
ON=@Abort
SRC.SYSMESSAGE You stop trying to pick the lock.
[SKILL 25]
DEFNAME=Skill_Magery
KEY=Magery
TITLE=Mage
FLAGS=skf_magic
STAT_STR=20
STAT_DEX=40
STAT_INT=100
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
VALUES=1,20,80
ON=@Abort
SRC.SYSMESSAGE You stop casting the spell.
[SKILL 26]
DEFNAME=Skill_MagicResist
KEY=MagicResistance
TITLE=Warder
EFFECT=0.0,90.0
STAT_STR=40
STAT_DEX=40
STAT_INT=100
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
[SKILL 27]
DEFNAME=Skill_Tactics
KEY=Tactics
TITLE=Tactician
STAT_STR=60
STAT_DEX=70
STAT_INT=40
BONUS_STR=50
BONUS_DEX=50
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=10.0,150.0,600.0
[SKILL 28]
DEFNAME=Skill_Snooping
KEY=Snooping
TITLE=Spy
DELAY=2.0
STAT_STR=30
STAT_DEX=60
STAT_INT=50
BONUS_STR=0
BONUS_DEX=100
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@Fail
SRC.SYSMESSAGE You fail to peek into the container.
ON=@Abort
SRC.SYSMESSAGE You give up trying to peek into the container.
[SKILL 29]
DEFNAME=Skill_Musicianship
KEY=Musicianship
TITLE=Bard
DELAY=2.0
STAT_STR=20
STAT_DEX=70
STAT_INT=50
BONUS_STR=0
BONUS_DEX=80
BONUS_INT=20
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@Fail
SRC.SYSMESSAGE You play poorly, and there is no effect.
ON=@Abort
SRC.SYSMESSAGE You put down your instrument.
[SKILL 30]
DEFNAME=Skill_Poisoning
KEY=Poisoning
TITLE=Assassin
PROMPT_MSG=To what do you wish to apply the poison?
DELAY=2.0
STAT_STR=15
STAT_DEX=40
STAT_INT=40
BONUS_STR=0
BONUS_DEX=20
BONUS_INT=80
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
VALUES=1,30,200
ON=@Fail
SRC.SYSMESSAGE You fail to apply a sufficient dose of poison to it.
ON=@Abort
SRC.SYSMESSAGE You decide not to poison anything for now.
[SKILL 31]
DEFNAME=Skill_Archery
KEY=Archery
TITLE=Archer
FLAGS=skf_fight|skf_ranged
STAT_STR=40
STAT_DEX=70
STAT_INT=30
BONUS_STR=0
BONUS_DEX=95
BONUS_INT=5
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
[SKILL 32]
DEFNAME=Skill_SpiritSpeak
KEY=SpiritSpeak
TITLE=Medium
DELAY=2.0
STAT_STR=20
STAT_DEX=30
STAT_INT=70
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@Fail
SRC.SYSMESSAGE You fail your attempt at contacting the netherworld.
ON=@Abort
SRC.SYSMESSAGE You stop trying to commune with the netherworld.
[SKILL 33]
DEFNAME=Skill_Stealing
KEY=Stealing
TITLE=Pickpocket
PROMPT_MSG=Which item will you attempt to steal?
DELAY=2.5
STAT_STR=40
STAT_DEX=100
STAT_INT=50
BONUS_STR=0
BONUS_DEX=100
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
ON=@Fail
SRC.SYSMESSAGE You fail to steal the item.
ON=@Abort
SRC.SYSMESSAGE You give up trying to steal the item.
[SKILL 34]
DEFNAME=Skill_Tailoring
KEY=Tailoring
TITLE=Tailor
FLAGS=skf_craft
DELAY=1.2 //Old value=4.5
STAT_STR=30
STAT_DEX=60
STAT_INT=30
BONUS_STR=5
BONUS_DEX=75
BONUS_INT=20
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
VALUES=1,20,80
ON=@Fail
SRC.SYSMESSAGE Tailoring failed. Some of the cloth is ruined.
ON=@Abort
SRC.SYSMESSAGE You decide not to sew anymore for now.
[SKILL 35]
DEFNAME=Skill_Taming
KEY=Taming
TITLE=Tamer
PROMPT_MSG=Tame which animal?
DELAY=2.0
STAT_STR=30
STAT_DEX=60
STAT_INT=40
BONUS_STR=30
BONUS_DEX=10
BONUS_INT=60
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
RANGE=7
ON=@Fail
SRC.SYSMESSAGE You fail to tame the creature.
ON=@Abort
SRC.SYSMESSAGE You give up trying to tame the creature.
[SKILL 36]
DEFNAME=Skill_TasteId
KEY=TasteID
TITLE=Praegustator
PROMPT_MSG=What would you like to taste?
DELAY=1.0
STAT_STR=25
STAT_DEX=15
STAT_INT=50
BONUS_STR=20
BONUS_DEX=0
BONUS_INT=80
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
RANGE=1
ON=@Fail
SRC.SYSMESSAGE You cannot discern anything about this substance.
ON=@Abort
SRC.SYSMESSAGE You decide against tasting anything.
[SKILL 37]
DEFNAME=Skill_Tinkering
KEY=Tinkering
TITLE=Tinker
FLAGS=skf_craft
DELAY=1.2 //Old value=3.0
STAT_STR=30
STAT_DEX=50
STAT_INT=100
BONUS_STR=20
BONUS_DEX=20
BONUS_INT=60
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
VALUES=1,20,80
ON=@Fail
SRC.SYSMESSAGE Tinkering failed.
ON=@Abort
SRC.SYSMESSAGE You stop trying to make anything.
[SKILL 38]
DEFNAME=Skill_Tracking
KEY=Tracking
TITLE=Ranger
PROMPT_MSG=What do you wish to track?
DELAY=2.5
STAT_STR=25
STAT_DEX=50
STAT_INT=50
BONUS_STR=0
BONUS_DEX=50
BONUS_INT=50
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@PreStart
IF !(<SRC.ISPLAYER>)
return 1
ENDIF
ON=@Stroke
LOCAL.ModZ=<eval <ACT.P.Z>/-10>
SRC.ARROWQUEST <eval <ACT.P.X>+<LOCAL.ModZ>>,<eval <ACT.P.Y>+<LOCAL.ModZ>>,38
ON=@Fail
SRC.SYSMESSAGE Tracking failed.
ON=@Abort
SRC.SYSMESSAGE You stop tracking.
SRC.ARROWQUEST 0,0,38
[SKILL 39]
DEFNAME=Skill_Vet
KEY=Veterinary
TITLE=Veterinarian
PROMPT_MSG=What animal would you like to heal?
DELAY=2.0
STAT_STR=30
STAT_DEX=40
STAT_INT=50
BONUS_STR=20
BONUS_DEX=20
BONUS_INT=60
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
ON=@Fail
SRC.SYSMESSAGE You apply the bandages, but they barely help.
ON=@Abort
SRC.SYSMESSAGE You stop applying the bandages.
[SKILL 40]
DEFNAME=Skill_Swordsmanship
KEY=Swordsmanship
TITLE=Swordsman
FLAGS=skf_fight
STAT_STR=75
STAT_DEX=75
STAT_INT=40
BONUS_STR=50
BONUS_DEX=50
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=10.0,150.0,600.0
[SKILL 41]
DEFNAME=Skill_Macefighting
KEY=Macefighting
TITLE=Armsman
FLAGS=skf_fight
STAT_STR=100
STAT_DEX=55
STAT_INT=35
BONUS_STR=80
BONUS_DEX=20
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=10.0,150.0,600.0
[SKILL 42]
DEFNAME=Skill_Fencing
KEY=Fencing
TITLE=Fencer
FLAGS=skf_fight
STAT_STR=55
STAT_DEX=95
STAT_INT=60
BONUS_STR=20
BONUS_DEX=80
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=10.0,150.0,600.0
[SKILL 43]
DEFNAME=Skill_Wrestling
KEY=Wrestling
TITLE=Wrestler
FLAGS=skf_fight
STAT_STR=100
STAT_DEX=75
STAT_INT=30
BONUS_STR=50
BONUS_DEX=50
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=8.5,120.0,680.0
[SKILL 44]
DEFNAME=Skill_Lumberjack
KEY=Lumberjacking
TITLE=Lumberjack
FLAGS=skf_gather
DELAY=1.6
STAT_STR=85
STAT_DEX=45
STAT_INT=30
BONUS_STR=90
BONUS_DEX=10
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
VALUES=1,10,50
RANGE=2
ON=@Success
ACTARG2=1 // location to drop the created item (0 = ground / 1 = backpack)
REF1=<SRC.WEAPON>
IF (<REF1>)
IF (<REF1.USESCUR> > 0)
REF1.USESCUR --
IF (<REF1.USESCUR> < 1)
REF1.DESTROY 1
ENDIF
ENDIF
ENDIF
ON=@Fail
SRC.SYSMESSAGE You hack at the tree for a while, but fail to produce any useable wood.
ON=@Abort
SRC.SYSMESSAGE You decide not to chop wood for now.
[SKILL 45]
DEFNAME=Skill_Mining
KEY=Mining
TITLE=Miner
PROMPT_MSG=Where do you wish to dig?
FLAGS=skf_gather
DELAY=1.6
STAT_STR=85
STAT_DEX=45
STAT_INT=30
BONUS_STR=70
BONUS_DEX=30
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
VALUES=1,10,80
RANGE=2
ON=@PreStart
IF (<SRC.FLAGS> & statf_onhorse|statf_hovering)
SRC.SYSMESSAGE You can't dig while riding or flying.
return 1
ELIF (<SRC.FLAGS> & statf_polymorph)
SRC.SYSMESSAGE You can't dig while polymorphed.
return 1
ENDIF
ON=@Success
ACTARG2=1 // location to drop the created item (0 = ground / 1 = backpack)
REF1=<SRC.WEAPON>
IF (<REF1>)
IF (<REF1.USESCUR> > 0)
REF1.USESCUR --
IF (<REF1.USESCUR> < 1)
REF1.DESTROY 1
ENDIF
ENDIF
ENDIF
ON=@Fail
SRC.SYSMESSAGE You loosen some rocks but fail to find any useable ore.
ON=@Abort
SRC.SYSMESSAGE You decide not to mine for now.
ON=@Stroke
IF (<SRC.FLAGS> & statf_onhorse|statf_hovering)
SRC.SYSMESSAGE You can't dig while riding or flying.
return 1
ELIF (<SRC.FLAGS> & statf_polymorph)
SRC.SYSMESSAGE You can't dig while polymorphed.
return 1
ENDIF
[SKILL 46]
DEFNAME=Skill_Meditation
KEY=Meditation
TITLE=Stoic
DELAY=2.0,1.0
STAT_STR=10
STAT_DEX=10
STAT_INT=100
BONUS_STR=5
BONUS_DEX=90
BONUS_INT=5
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
ON=@Fail
//SRC.f_meditation_setup
SRC.SYSMESSAGE You lose your concentration.
ON=@Abort
//SRC.f_meditation_setup
SRC.SYSMESSAGE You stop concentrating.
ON=@Start
//SRC.f_meditation_setup
ON=@Success
//SRC.f_meditation_setup
[FUNCTION f_meditation_setup]
// This enables OSI meditation, providing a passive boost to RegenMana everytime and increasing it when the skill is active instead of the old regen-when-active.
IF (<TAG0.MeditBonus>)
REGENMANA -= <TAG0.MeditBonus> // remove old bonus before apply new one
TAG.MeditBonus=
ENDIF
IF (<TAG0.MeditPenalty>) // no bonus when wearing plate armor
return 0
ENDIF
LOCAL.Bonus = <eval ((<MEDITATION> / 10) * 3) + <INT>>
IF (<MEDITATION> >= 1000)
LOCAL.Bonus += <MULDIV <LOCAL.Bonus>,10,100>
ENDIF
TAG.MeditBonus = <eval 2 + <LOCAL.Bonus> / 40>
IF (<ACTION> == skill_meditation) // double bonus if already meditating
TAG.MeditBonus *= 2
ENDIF
REGENMANA += <TAG0.MeditBonus>
[SKILL 47]
DEFNAME=Skill_Stealth
KEY=Stealth
TITLE=Rogue
DELAY=2.0
STAT_STR=20
STAT_DEX=90
STAT_INT=60
BONUS_STR=0
BONUS_DEX=80
BONUS_INT=20
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
ON=@PreStart
IF !(<FLAGS> & statf_invisible|statf_hidden)
SYSMESSAGE You must hide first
return 1
ELIF (<FLAGS> & statf_hovering)
SRC.SYSMESSAGE You cannot use this ability while flying.
return 1
ELIF (<HIDING> < 80.0)
SYSMESSAGE You are not hidden well enough. Become better at hiding.
REVEAL
return 1
ELIF (<GetCharArmorRating> >= 42)
SYSMESSAGE You could not hope to move quietly wearing this much armor.
REVEAL
return 1
ENDIF
ON=@Success
STEPSTEALTH = <eval <STEALTH>/50>
SYSMESSAGE You begin to move quietly.
ON=@Fail
SYSMESSAGE You fail in your attempt to move unnoticed.
REVEAL
ON=@Abort
SYSMESSAGE You give up trying to hide here.
[FUNCTION GetCharArmorRating]
ARGS=4,6,7,10,13,19
WHILE (<dARGS>)
IF !(<FINDLAYER.<ARGV0>.MageArmor>)
LOCAL.AR += <DEF0.ArmorRating.<FINDLAYER.<ARGV0>.GetArmorMaterial>.Layer<ARGV0>>
ENDIF
ARGS=<STREAT <ARGS>>
ENDWHILE
return <LOCAL.AR>
[FUNCTION GetArmorMaterial]
IF (<DISPIDDEC> >= 5061) && (<DISPIDDEC> <= 5075)
return Leather
ELIF (<DISPIDDEC> >= 5076) && (<DISPIDDEC> <= 5090)
return Studded
ELIF (<DISPIDDEC> >= 5198) && (<DISPIDDEC> <= 5207)
return Bone
ELIF (<DISPIDDEC> >= 5093) && (<DISPIDDEC> <= 5106)
return Ring
ELIF (<DISPIDDEC> >= 5051) && (<DISPIDDEC> <= 5060)
return Chain
ELIF (<DISPIDDEC> >= 5128) && (<DISPIDDEC> <= 5146)
return Plate
ELIF (<DISPIDDEC> >= 9793) && (<DISPIDDEC> <= 9800)
return Dragon
ENDIF
[DEFNAME ArmorRating]
ArmorRating.Studded.Layer4 6
ArmorRating.Studded.Layer7 2
ArmorRating.Studded.Layer10 2
ArmorRating.Studded.Layer13 10
ArmorRating.Studded.Layer19 4
ArmorRating.Bone.Layer4 15
ArmorRating.Bone.Layer6 10
ArmorRating.Bone.Layer7 5
ArmorRating.Bone.Layer13 25
ArmorRating.Bone.Layer19 10
ArmorRating.Ring.Layer4 15
ArmorRating.Ring.Layer7 5
ArmorRating.Ring.Layer13 25
ArmorRating.Ring.Layer19 10
ArmorRating.Chain.Layer4 15
ArmorRating.Chain.Layer6 10
ArmorRating.Chain.Layer13 25
ArmorRating.Plate.Layer4 15
ArmorRating.Plate.Layer6 10
ArmorRating.Plate.Layer7 5
ArmorRating.Plate.Layer10 5
ArmorRating.Plate.Layer13 25
ArmorRating.Plate.Layer19 10
ArmorRating.Dragon.Layer4 15
ArmorRating.Dragon.Layer6 10
ArmorRating.Dragon.Layer7 5
ArmorRating.Dragon.Layer13 25
ArmorRating.Dragon.Layer19 10
[SKILL 48]
DEFNAME=Skill_Remove_Trap
KEY=RemoveTrap
TITLE=Trap Specialist
PROMPT_MSG=Select the trap to disarm
DELAY=7.0,3.0,2.0
STAT_STR=20
STAT_DEX=90
STAT_INT=60
BONUS_STR=0
BONUS_DEX=80
BONUS_INT=20
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
ON=@Fail
SRC.SYSMESSAGE You fail to disarm the trap.
ON=@Abort
SRC.SYSMESSAGE You give up trying to disarm the trap.
[SKILL 49]
DEFNAME=Skill_Necromancy
KEY=Necromancy
TITLE=Necromancer
FLAGS=skf_magic
STAT_STR=20
STAT_DEX=40
STAT_INT=100
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
ON=@Fail
SRC.SYSMESSAGE The spell fizzles.
ON=@Abort
SRC.SYSMESSAGE You stop casting the spell.
[SKILL 50]
DEFNAME=Skill_Focus
KEY=Focus
TITLE=Driven
STAT_STR=10
STAT_DEX=10
STAT_INT=100
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
[SKILL 51]
DEFNAME=Skill_Chivalry
KEY=Chivalry
TITLE=Paladin
FLAGS=skf_magic
STAT_STR=100
STAT_DEX=55
STAT_INT=35
BONUS_STR=80
BONUS_DEX=20
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=10.0,150.0,600.0
[SKILL 52]
DEFNAME=Skill_Bushido
KEY=Bushido
TITLE=Samurai
FLAGS=skf_fight
STAT_STR=55
STAT_DEX=95
STAT_INT=60
BONUS_STR=20
BONUS_DEX=80
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=10.0,150.0,600.0
[SKILL 53]
DEFNAME=Skill_Ninjitsu
KEY=Ninjitsu
TITLE=Ninja
FLAGS=skf_fight
STAT_STR=55
STAT_DEX=95
STAT_INT=60
BONUS_STR=20
BONUS_DEX=80
BONUS_INT=0
BONUS_STATS=0
ADV_RATE=10.0,150.0,600.0
[SKILL 54]
DEFNAME=Skill_Spellweaving
KEY=Spellweaving
TITLE=Arcanist
FLAGS=skf_magic
STAT_STR=20
STAT_DEX=30
STAT_INT=70
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
[SKILL 55]
DEFNAME=Skill_Mysticism
KEY=Mysticism
TITLE=Mystic
FLAGS=skf_magic
STAT_STR=20
STAT_DEX=30
STAT_INT=70
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=2.5,50.0,200.0
[SKILL 56]
DEFNAME=Skill_Imbuing
KEY=Imbuing
TITLE=Artificer
DELAY=3.0
STAT_STR=15
STAT_DEX=15
STAT_INT=100
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
VALUES=1,30,200
[SKILL 57]
DEFNAME=Skill_Throwing
KEY=Throwing
TITLE=Bladeweaver
FLAGS=skf_fight|skf_ranged
STAT_STR=40
STAT_DEX=70
STAT_INT=30
BONUS_STR=0
BONUS_DEX=95
BONUS_INT=5
BONUS_STATS=0
ADV_RATE=10.0,200.0,800.0
[SKILLCLASS 0]
// undeclared class.
// max skills for players of this skill class.
DEFNAME=Class_Undeclared
NAME=undeclared
// EVENTS=e_ClassUndeclared
STATSUM=225
SKILLSUM=700.0
STR=100
INT=100
DEX=100
Alchemy=100.0
Anatomy=100.0
AnimalLore=100.0
ItemId=100.0
ArmsLore=100.0
Parrying=100.0
Begging=100.0
Blacksmithing=100.0
Bowcraft=100.0
Peacemaking=0.0
Camping=100.0
Carpentry=100.0
Cartography=100.0
Cooking=100.0
DetectingHidden=100.0
Enticement=100.0
EvaluatingIntel=100.0
Healing=100.0
Fishing=100.0
Forensics=100.0
Herding=100.0
Hiding=100.0
Provocation=100.0
Inscription=100.0
LockPicking=100.0
Magery=100.0
MagicResistance=0.0
Tactics=100.0
Snooping=100.0
Musicianship=100.0
Poisoning=100.0
Archery=100.0
SpiritSpeak=100.0
Stealing=100.0
Tailoring=100.0
Taming=100.0
TasteId=100.0
Tinkering=100.0
Tracking=100.0
Veterinary=100.0
Swordsmanship=100.0
Macefighting=100.0
Fencing=100.0
Wrestling=100.0
Lumberjacking=100.0
Mining=100.0
Meditation=100.0
Stealth=100.0
RemoveTrap=100.0
Necromancy=100.0
Focus=100.0
Chivalry=100.0
Bushido=100.0
Ninjitsu=100.0
Spellweaving=100.0
Mysticism=100.0
Imbuing=100.0
Throwing=100.0
ON=@Login
IF !(<isempty <ACCOUNT.TAG.GMPage.Response>>)
SDIALOG d_gmpage_response
ENDIF
ON=@ItemEquip
IF (<ACT.TYPE> == t_armor) && !(<ACT.MageArmor>)
TAG0.MeditPenalty ++
f_meditation_setup
ENDIF
ON=@ItemUnequip
IF (<ACT.TYPE> == t_armor) && !(<ACT.MageArmor>)
TAG0.MeditPenalty --
f_meditation_setup
ENDIF
////
On=@Mount
if (<argo.baseid>==c_steed_silver)
SRC.MODAR +=50
return 1
endif
On=@DisMount
if (<argo.baseid>==c_steed_silver)
SRC.MODAR -=50
return 1
endif
[EOF]
On=@Mount
if (<argo.baseid>==c_steed_silver)
SRC.MODAR +=50
endif
On=@DisMount
if (<argo.baseid>==c_steed_silver)
SRC.MODAR -=50
endif
Nioble :binekten in ve .modar 0 yap
Evet Return ile alakalıymış peki bug oluştu şuanda binemediğim için armor devamlı arttı bunu nasıl düzeltebilirim. Eventslerimi silmem gerekiyor. Bir de mesela her binek için devamlı böyle yapmam gerekiyor o zaman hem bineği oluşturucam hem class bölümüne eklemem gerekiyor.
|
|
| Konu | Kategori | Son cevap | Son yazan | Mesaj | Görüntüleme | |
|---|---|---|---|---|---|---|
|
|
4x ve üzeri binek ekleme - bodyconv ve mobtypes
Son cevap: 14-07 02:06 · Son yazan: Turkgamer · Mesaj: 1 · Görüntü: 1993
|
Grafik Araçları | 14-07 02:06 | 1 | 1993 | |
|
|
LBR binek ekleme sorunu
Son cevap: 02-03 19:03 · Son yazan: manyaqq · Mesaj: 1 · Görüntü: 2358
|
Muls ve Mul Editing | 02-03 19:03 | 1 | 2358 | |
|
|
Pack bineklere binme şartı
Son cevap: 28-01 14:30 · Son yazan: manyaqq · Mesaj: 3 · Görüntü: 2283
|
NPC Script Yardımı | 28-01 14:30 | 3 | 2283 | |
|
|
Multi Evlere İtem Ekleme
Son cevap: 08-07 02:22 · Son yazan: mahsuni · Mesaj: 5 · Görüntü: 2716
|
Grafik Araçları | 08-07 02:22 | 5 | 2716 | |
|
|
4x ve üzeri Clientlere Binek Ekleme
Son cevap: 03-10 00:08 · Son yazan: Rowall · Mesaj: 38 · Görüntü: 16941
|
Grafik Araçları | 03-10 00:08 | 38 | 16941 |