2022-12-19 22:22:19 +02:00
//update 11.01.09 by gram
// JavaScript Document
var dresserScriptVersion = 199 ;
var saveSetOnServerUrl = '/dressroom/?action=save&saveset=1&texttosave={0}' ;
var absoluteDressRoomUrl = 'https://new-combats/dresss/' ;
var battleScriptId = 'battleScriptId' ;
var battleProviderUrl = 'http://resources.darkclan.ru/cgi/dresbatl.pl' ;
//var getCharacterInfoUrlFormat = '/cgi/get_ci.pl?nick={0}';
var getCharacterInfoUrlFormat = '/cgi/get_nick.pl?nick={0}' ;
var loadSetDialogParameters = "dialogHeight=326px" ;
var saveSetDialogParameters = "dialogHeight=316px" ;
var dressOptionsCookieName = 'dressOptions' ;
var serializableStateFormatVersion = 1 ;
var helpDivId = "helpDiv" ;
var infoDivId = "infoDiv" ;
var summaryDivId = "summaryDiv" ;
var expTableDivId = "expTableDiv" ;
var healerDivId = "healerDiv" ;
var battlesDivId = "battlesDiv" ;
var builderDivId = 'builderDiv' ;
var favStoreId = "favstore" ;
var historyStoreId = "historystore" ;
var offlineCookieId = "offlinecookie" ;
var menuImageIdPrefix = 'mnudrs_' ;
var hpMeterSuffix = '_HP' ;
var manaMeterSuffix = '_MP' ;
var minSharpLevels = [ 0 , 0 , 0 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 0 , 8 ] ;
var regSharpPrices = [ 0 , 20 , 40 , 80 , 0 , 320 , 640 , 1000 , 2000 , 3000 , 0 , 5000 ] ;
var dblSharpPrices = [ 0 , 40 , 80 , 160 , 320 , 640 , 1280 , 2000 , 4000 , 6000 , 0 , 10000 ] ;
var benderOmsk = {
saveLink : 'benderomsk://save?name={0}&value={1}' ,
loadLink : 'benderomsk://load?name={0}' ,
getInfoLink : 'benderomsk://getinf?login={0}'
} ;
var defaultImageFilter = 'revealtrans(duration = 0.5, transition = 23)' ;
var dressExData = {
exdata : 4 ,
fakes : { } ,
fakeDefs : { }
} ;
var dressOptions = {
showImages : true ,
useAlphaForMenuAndTip : true ,
useTransitionEffects : false ,
preloadImages : false ,
fminlevel : null ,
fmaxlevel : null ,
fshowold : false ,
fshow _com : true ,
fshow _ru : true ,
fshow _artefacts : true ,
ffiltermf : null ,
frewardonly : false ,
captureMouse : false ,
embeddedMode : false ,
hasGetCharInfo : false ,
hasGetDSCharInfo : false ,
showHealer : true ,
showExp : true ,
showBuilder : true ,
newCapEdition : false ,
helpWritten : false ,
currentFilterTab : 0 ,
benderOmskMode : false ,
colorizedDummy : true
} ;
var uiOptions = dressOptions ;
var unusedStateId = 1 ;
var activeState = null ;
var expTableBuilt = false ;
var imagesToBeLoaded = { } ;
var preloadImagesDelay = 1000 ;
var someStatesLoaded = false ;
if ( typeof ( dressItems ) == 'undefined' )
{
dressItems = { } ;
}
if ( typeof ( dressStates ) == 'undefined' )
{
dressStates = { } ;
}
if ( typeof ( droppedDressStates ) == 'undefined' )
{
droppedDressStates = { } ;
}
if ( typeof ( dressSets ) == 'undefined' )
{
dressSets = { } ;
}
if ( typeof ( dressStrengthenings ) == 'undefined' )
{
dressStrengthenings = { } ;
}
if ( typeof ( categories ) == 'undefined' )
{
categories = { } ;
}
if ( typeof ( pets ) == 'undefined' )
{
pets = { } ;
}
if ( typeof ( tricks ) == 'undefined' )
{
tricks = { } ;
}
if ( typeof ( dressExchangePoints ) == 'undefined' )
{
dressExchangePoints = { } ;
}
function informAboutProgress ( msg )
{
document . getElementById ( infoDivId ) . innerHTML = msg ;
}
var filterDialogProps = { } ;
var turnData = { strikes : { } , blockZones : 0 } ;
var menuhash = { } ;
var catselsources = { } ;
var catlistsources = { } ;
function showHelp ( )
{
var helpDiv = document . getElementById ( helpDivId ) ;
helpDiv . style . display = '' ;
if ( ! dressOptions . helpWritten )
{
document . getElementById ( 'helpDivContent' ) . innerHTML = helpChapterHtml ;
dressOptions . helpWritten = true ;
}
helpDiv . scrollIntoView ( ) ;
}
function hideHelp ( )
{
var helpDiv = document . getElementById ( helpDivId ) ;
helpDiv . style . display = 'none' ;
window . scrollTo ( 0 ) ;
}
/* Common utilities */
function areArraysIntersect ( A1 , A2 )
{
for ( var i1 = 0 ; i1 < A1 . length ; i1 ++ )
{
for ( var i2 = 0 ; i2 < A2 . length ; i2 ++ )
{
if ( A1 [ i1 ] == A2 [ i2 ] )
{
return true ;
}
}
}
return false ;
}
function cloneArray ( a )
{
var r = a . concat ( [ ] ) ;
return r ;
}
function cloneObject ( o )
{
var r = { } ;
for ( var pname in o )
{
var v = o [ pname ] ;
if ( ( v != null ) && ( ( typeof v ) == 'object' ) )
{
if ( v instanceof Array )
{
v = cloneArray ( v ) ;
}
else
{
v = cloneObject ( v ) ;
}
}
r [ pname ] = v ;
}
return r ;
}
function combineObjects ( x , y )
{
var r = cloneObject ( x ) ;
for ( var pname in y )
{
var v = y [ pname ] ;
if ( ( v != null ) && ( ( typeof v ) == 'object' ) )
{
if ( v instanceof Array )
{
if ( pname in r )
{
v = r [ pname ] . concat ( v ) ;
}
else
{
v = cloneArray ( v ) ;
}
}
else
{
if ( pname in r )
{
v = combineObjects ( r [ pname ] , v ) ;
}
else
{
v = cloneObject ( v ) ;
}
}
}
r [ pname ] = v ;
}
return r ;
}
// Dresser specific code
function readOptionsCore ( v )
{
if ( v != null )
{
dressOptions . showImages = ( v . length > 0 ) && ( v . charAt ( 0 ) == 'Y' ) ;
dressOptions . useAlphaForMenuAndTip = ( v . length > 1 ) && ( v . charAt ( 1 ) == 'Y' ) ;
dressOptions . useTransitionEffects = ( v . length > 2 ) && ( v . charAt ( 2 ) == 'Y' ) ;
dressOptions . preloadImages = ( v . length > 3 ) && ( v . charAt ( 3 ) == 'Y' ) ;
dressOptions . fminlevel = ( v . length > 4 ) && ( v . charAt ( 4 ) != ' ' ) ? parseInt ( v . charAt ( 4 ) , 26 ) : null ;
dressOptions . fmaxlevel = ( v . length > 5 ) && ( v . charAt ( 5 ) != ' ' ) ? parseInt ( v . charAt ( 5 ) , 26 ) : null ;
dressOptions . fshowold = ( v . length > 6 ) && ( v . charAt ( 6 ) == 'Y' ) ;
dressOptions . captureMouse = ( v . length <= 7 ) || ( v . charAt ( 7 ) == 'Y' ) ;
if ( v . length > 10 && v . charAt ( 8 ) != '_' )
{
dressOptions . ffiltermf = parseInt ( v . substr ( 8 , 3 ) , 16 ) ;
}
dressOptions . fshow _com = ( v . length <= 11 ) || ( v . charAt ( 11 ) == 'Y' ) ;
dressOptions . fshow _ru = ( v . length <= 12 ) || ( v . charAt ( 12 ) == 'Y' ) ;
dressOptions . fshow _artefacts = ( v . length <= 13 ) || ( v . charAt ( 13 ) == 'Y' ) ;
dressOptions . frewardonly = ( v . length > 14 ) && ( v . charAt ( 14 ) == 'Y' ) ;
dressOptions . colorizedDummy = ( v . length <= 15 ) || ( v . charAt ( 15 ) == 'Y' ) ;
if ( dressOptions . preloadImages )
{
preloadImagesWanted ( ) ;
}
// dressOptions.useAlphaForMenuAndTip &= is.ie;
dressOptions . useTransitionEffects &= is . ie ;
dressOptions . captureMouse &= is . ie ;
applyAlphaForMenuAndTipOption ( ) ;
}
}
function onLoadBenderOmskVariable ( name , value )
{
if ( name == dressOptionsCookieName )
{
readOptionsCore ( value ) ;
return ;
}
}
function readOptions ( )
{
var v = null ;
if ( dressOptions . benderOmskMode )
{
window . navigate ( format ( benderOmsk . loadLink , dressOptionsCookieName ) ) ;
return ;
}
if ( isOfflineMode ( ) )
{
v = GetOfflineCookie ( dressOptionsCookieName ) ;
}
else
{
v = GetCookie ( dressOptionsCookieName ) ;
}
readOptionsCore ( v ) ;
}
function saveOptions ( )
{
var v = '' ;
v += dressOptions . showImages ? 'Y' : 'N' ;
v += dressOptions . useAlphaForMenuAndTip ? 'Y' : 'N' ;
v += dressOptions . useTransitionEffects ? 'Y' : 'N' ;
v += dressOptions . preloadImages ? 'Y' : 'N' ;
v += ( dressOptions . fminlevel != null ) ? dressOptions . fminlevel . toString ( 26 ) : ' ' ;
v += ( dressOptions . fmaxlevel != null ) ? dressOptions . fmaxlevel . toString ( 26 ) : ' ' ;
v += dressOptions . fshowold ? 'Y' : 'N' ;
v += dressOptions . captureMouse ? 'Y' : 'N' ;
if ( dressOptions . ffiltermf != null )
{
var av = parseInt ( dressOptions . ffiltermf ) . toString ( 16 ) ;
while ( av . length < 3 )
{
av = '0' + av ;
}
v += av ;
}
else
{
v += '___' ;
}
v += dressOptions . fshow _com ? 'Y' : 'N' ;
v += dressOptions . fshow _ru ? 'Y' : 'N' ;
v += dressOptions . fshow _artefacts ? 'Y' : 'N' ;
v += dressOptions . frewardonly ? 'Y' : 'N' ;
v += dressOptions . colorizedDummy ? 'Y' : 'N' ;
if ( dressOptions . benderOmskMode )
{
window . navigate ( format ( benderOmsk . saveLink , dressOptionsCookieName , v ) ) ;
}
else if ( isOfflineMode ( ) )
{
SetOfflineCookie ( dressOptionsCookieName , v , exp ) ;
}
else
{
SetCookie ( dressOptionsCookieName , v , exp ) ;
}
}
function clearAllStats ( state )
{
state . natural = {
level : 0 ,
levelup : 0 ,
pstat : 0 ,
pskil : 0 ,
strength : 3 ,
dexterity : 3 ,
intuition : 3 ,
endurance : 3 ,
intellect : 0 ,
wisdom : 0 ,
spirituality : 0
} ;
state . statElix = null ;
state . damageElixes = { } ;
state . defElixes = { } ;
state . spellIntel = 0 ;
state . spellHitpoints = 0 ;
state . spellBD = 0 ;
state . spellPowerUps = { } ;
state . combatTricks = { } ;
state . pet = null ;
}
function applyCleanItemsToState ( state )
{
state . fitArmor = false ;
state . w3sharp = 0 ;
state . w10sharp = 0 ;
state . objects = new Array ( slots . length ) ;
state . upgradeSlots = new Array ( slots . length ) ;
state . fitSlots = new Array ( slots . length ) ;
state . charmSlots = new Array ( slots . length ) ;
state . addSlots = new Array ( slots . length ) ;
state . runeSlots = new Array ( slots . length ) ;
state . objCache = new Array ( slots . length ) ;
state . trickSlots = new Array ( 21 ) ;
state . combatSpells = { } ;
state . statElix = null ;
state . damageElixes = { } ;
state . defElixes = { } ;
state . spellIntel = 0 ;
state . spellHitpoints = 0 ;
state . spellBD = 0 ;
state . spellPowerUps = { } ;
state . combatTricks = { } ;
state . pet = null ;
}
function createNewDresserState ( stateid , persName , persImage , persSign )
{
if ( stateid == null )
{
stateid = unusedStateId ;
unusedStateId ++ ;
}
var state = {
id : stateid ,
name : persName || '' ,
align : '0' ,
clan : '' ,
sex : 0 ,
image : persImage || '0' ,
sign : persSign || '' ,
required : { } ,
appliedSets : [ ] ,
appliedStrengthenings : [ ] ,
powerUps : { } ,
modify : { } ,
results : { } ,
battlemf : { } ,
inbattle : { } ,
w3props : { } ,
w10props : { } ,
rendered : false
} ;
clearAllStats ( state ) ;
applyCleanItemsToState ( state ) ;
dressStates [ state . id ] = state ;
return state ;
}
function applyStyle ( style , where , what , how )
{
if ( where . indexOf ( what ) >= 0 )
{
if ( style . length > 0 )
{
style += ', ' ;
}
style += how ;
}
return style ;
}
function getRealImagePath ( objid , slot )
{
return ( ( objid == null ) && ( 'emptyImageHere' in slot ) && slot . emptyImageHere ) ? hereItemImgPath : itemImgPath ;
}
function getRealFilter ( filter )
{
var style = defaultImageFilter ;
if ( dressOptions . colorizedDummy && filter != null && filter != '' )
{
style = applyStyle ( style , filter , 'redshadow' , "shadow(color=red, direction=180, strength=3)" ) ;
style = applyStyle ( style , filter , 'goldshadow' , "shadow(color=gold, direction=90, strength=4)" ) ;
style = applyStyle ( style , filter , 'purpleshadow' , "shadow(color=purple, direction=270, strength=3)" ) ;
style = applyStyle ( style , filter , 'blueshadow' , "shadow(color=blue, direction=180, strength=3)" ) ;
style = applyStyle ( style , filter , 'glow' , 'glow(color=teal, strength=2)' ) ;
style = applyStyle ( style , filter , 'glo2' , 'glow(color=green, strength=2)' ) ;
style = applyStyle ( style , filter , 'blur' , 'blur' ) ;
style = applyStyle ( style , filter , 'alpha' , 'alpha(opacity = 70, style = 3)' ) ;
style = applyStyle ( style , filter , 'wave' , 'wave()' ) ;
}
return style ;
}
function getImageId ( state , slot , isMenu )
{
var imgId = state . id . toString ( ) ;
if ( isMenu )
{
imgId = menuImageIdPrefix + imgId ;
}
imgId += slot . id ;
return imgId ;
}
function getObjectOverText ( state , slot )
{
if ( state == null || slot == null )
{
return '' ;
}
var html = '' ;
if ( slot . id == 'w3' && state . w3sharp > 0 )
{
html += '<img src="' + hereItemImgPath + 'sharpen_all_' + state . w3sharp + '.gif" width="40" height="25" border="0" />' ;
}
if ( slot . id == 'w10' && state . w10sharp > 0 )
{
html += '<img src="' + hereItemImgPath + 'sharpen_all_' + state . w10sharp + '.gif" width="40" height="25" border="0" />' ;
}
return html ;
}
function getPersObjectImageHtml ( state , slot , mode , showImages , xclick , runes )
{
var r = '' ;
var style = 'cursor: hand; filter:' ;
var onclick = '' ;
if ( xclick != null )
{
onclick = xclick ;
}
else if ( mode == null )
{
onclick = format ( "onObjectClick('{0}', '{1}')" , state . id , slot . id ) ;
}
if ( onclick != '' )
{
onclick = format ( ' onclick="{0}" oncontextmenu="{0}"' , onclick ) ;
}
var objid = ( mode == null ) ? state . objects [ slot . index ] : mode ;
var oimg = ( objid == null ) ? slot . id : objid ;
var o = ( mode == null ) ? getObjectByStateSlot ( state , slot ) : getObjectById ( oimg ) ;
var sizeX = ( runes == 1 ) ? o . width : slot . width ;
var sizeY = ( runes == 1 ) ? o . height : slot . height ;
var filter = ( mode == null ) ? getObjectFilter ( state , slot , o ) : '' ;
var imgId = getImageId ( state , slot , ( mode != null ) ) ;
style += getRealFilter ( filter ) ;
if ( xclick == null ) r += '<td valign="top">' ;
if ( showImages == null || showImages )
{
var realItemImgPath = getRealImagePath ( objid , slot ) ;
/ *
if ( mode == null )
{
r += format ( '<div style="position: relative; z-index: 0; left: {0}px; top: 0px; wrap: off">' , slot . width - 40 ) ;
r += getObjectOverText ( state , slot ) ;
r += '</div>' ;
}
* /
r += format (
'<img id="{5}" name="x{1}" src="{0}{1}.gif" width="{2}" height="{3}" style="{4}" border="0"{6} onmouseover="showItemProps(this)" onmouseout="hidePopup()" />' ,
realItemImgPath ,
oimg ,
sizeX ,
sizeY ,
style ,
imgId ,
onclick
) ;
}
else
{
r += format (
'<span id="{1}" name="x{4}" style="{0}" border="0"{2} onmouseover="showItemProps(this)" onmouseout="hidePopup()">{3}</span>' ,
style ,
imgId ,
onclick ,
o . caption ,
oimg
) ;
}
if ( xclick == null ) r += '</td>' ;
return r ;
}
function isImgInSlot ( imgElt )
{
var id = imgElt . id ;
var yes = ( id . indexOf ( menuImageIdPrefix ) !== 0 ) ;
return yes ;
}
function getImgEltState ( imgElt )
{
return activeState ;
}
function getImgEltSlot ( imgElt )
{
var id = imgElt . id ;
if ( id . indexOf ( menuImageIdPrefix ) === 0 )
{
id = id . substr ( menuImageIdPrefix . length , id . length - menuImageIdPrefix . length )
}
id = id . substr ( activeState . id . toString ( ) . length ) ;
return getSlotById ( id ) ;
}
function setMeter ( state , meterSuffix , value )
{
var baseId = format ( '{1}{0}' , state . id , meterSuffix ) ;
if ( document . getElementById ( baseId ) == null )
{
return ;
}
if ( value == null )
{
value = 0 ;
}
var s = value . toString ( ) ;
s = s + '/' + s ;
var w = 240 - ( ( s . length + 2 ) * 7 ) ;
var displayMode = ( value > 0 ) ? '' : 'none' ;
document . getElementById ( baseId ) . style . display = displayMode ;
document . getElementById ( baseId + 'v' ) . innerHTML = s ;
document . getElementById ( baseId + 'i' ) . width = w ;
}
function getPersNickString ( state )
{
if ( state . name == '' )
{
return '' ;
}
var clanimg = '' ;
if ( state . clan != '' )
{
clanimg = format ( '<img src="{1}{0}.gif" width="24" height="15" border="0" alt="{0}" />' , state . clan , clanImgPath ) ;
}
return format ( '<nobr><img src="{4}align{3}.gif" width="12" height="15" border="0" />{5}<b>{0}</b> [{2}]<a target="_blank" href="{6}{1}"><img src="{4}inf.gif" width="12" height="11" border="0" /></a></nobr>' , htmlstring ( state . name ) , state . name , state . natural . level , state . align , baseImgPath , clanimg , charInfoUrlFormat ) ;
}
function showPetProps ( e )
{
var state = activeState ;
if ( state == null || state . pet == null )
{
return ;
}
var pet = pets [ state . pet . n ] ;
var pl = pet . levels [ 'L' + state . pet . level ] ;
var html = '<b>' + pet . caption2 + ' [' + pl . level + ']</b><br />' ;
2023-01-10 18:29:32 +02:00
html += 'Имя: ' + state . pet . name + '<br />' ;
2022-12-19 22:22:19 +02:00
if ( 'skill' in pl )
{
2023-01-10 18:29:32 +02:00
html += '<b>Освоенные навыки</b><br />' ;
2022-12-19 22:22:19 +02:00
html += pl . skill . caption + ' [' + pl . skill . level + ']' ;
}
showPopup ( html ) ;
if ( ! is . ie && e . stopPropagation )
{
e . stopPropagation ( ) ;
}
if ( is . ie )
{
window . event . cancelBubble = true ;
window . event . returnValue = false ;
}
return false ;
}
function showCharPopup ( )
{
showPopup ( localizer . charHint ) ;
}
function getPersImageHtml ( state )
{
var oimg ;
var i ;
var hp = ( 'hitpoints' in state . results ) ? state . results . hitpoints : 0 ;
hp = hp . toString ( ) ;
hp = hp + '/' + hp ;
var r = '' ;
r += '<table border="0" cellspacing="0" cellpadding="0"' ;
if ( state . sign != '' )
{
r += ' style="background-image: url(' ;
r += zodiacImgPath + state . sign ;
r += '.gif); background-repeat: no-repeat; background-position: top right;"' ;
}
r += '>' ;
r += format ( '<tr><td id="{1}{0}" align="center" style="font-size: 12px;">{2}</td></tr>' , state . id , 'nick' , getPersNickString ( state ) ) ;
r += format ( '<tr><td id="{1}{0}" width="240" align="right" nowrap="yes" style="font-size: 10px;">' , state . id , hpMeterSuffix ) ;
r += format ( '<span id="{1}{0}v">{2}</span> ' , state . id , hpMeterSuffix , hp ) ;
var w = 240 - ( ( hp . length + 2 ) * 7 ) ;
r += format ( '<img id="{4}{3}i" src="{0}" width="{2}" height="8" alt="{1} (100%)" border="0" />' , hpMeterGreenImg , getItemPropLabel ( 'hitpoints' ) , w , state . id , hpMeterSuffix ) ;
r += format ( '<img src="{0}herz.gif" width="10" height="9" alt="{1}"/>' , baseImgPath , getItemPropLabel ( 'hitpoints' ) ) ;
var mana = ( 'mana' in state . results ) ? state . results . mana : 0 ;
var manaDisplayMode = ( mana > 0 ) ? '' : 'none' ;
mana = mana . toString ( ) ;
mana = mana + '/' + mana ;
r += format ( '</td></tr><tr><td id="{1}{0}" width="240" align="right" nowrap="yes" style="font-size: 10px; display: {2}">' , state . id , manaMeterSuffix , manaDisplayMode ) ;
r += format ( '<span id="{1}{0}v">{2}</span> ' , state . id , manaMeterSuffix , mana ) ;
w = 240 - ( ( mana . length + 2 ) * 7 ) ;
r += format ( '<img id="{4}{3}i" src="{0}" width="{2}" height="8" alt="{1} (100%)" border="0" />' , manaMeterImg , getItemPropLabel ( 'mana' ) , w , state . id , manaMeterSuffix ) ;
r += format ( '<img src="{0}Mherz.gif" width="10" height="9" alt="{1}"/>' , baseImgPath , getItemPropLabel ( 'mana' ) ) ;
r += '</td></tr><tr height="4"><td height="4"></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="0"><tr>' ;
// w100 - w109
for ( i = 100 ; i < 105 ; i ++ )
{
r += getPersObjectImageHtml ( state , getSlotById ( 'w' + i ) ) ;
}
// this slot is handled as book slot.
r += getPersObjectImageHtml ( state , slot _wbook ) ;
// r += format('<td><img style="filter:alpha(opacity = 40, style = 3)" src="{0}w{1}.gif" width="40" height="25" border="0" /></td>', itemImgPath, 109);
r += '</tr><tr>' ;
for ( i = 105 ; i < 110 ; i ++ )
{
r += getPersObjectImageHtml ( state , getSlotById ( 'w' + i ) ) ;
}
// this slot is handled separately like as BK.
r += format ( '<td><img style="opacity: 0.4; MozOpacity: 0.4; KhtmlOpacity: 0.4; filter:alpha(opacity = 40, style = 3)" src="{0}w{1}.gif" width="40" height="25" border="0" /></td>' , itemImgPath , 109 ) ;
r += '</tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="0"><tr><td width="60"><table width="60" border="0" cellpadding="0" cellspacing="0"><tr>' ;
// w9
r += getPersObjectImageHtml ( state , slot _w9 ) ;
r += '</tr><tr>' ;
// w13
r += getPersObjectImageHtml ( state , slot _w13 ) ;
r += '</tr><tr>' ;
// w3
r += getPersObjectImageHtml ( state , slot _w3 ) ;
r += '</tr><tr>' ;
// w4
r += getPersObjectImageHtml ( state , slot _w4 ) ;
r += '</tr><tr>' ;
// w5
r += getPersObjectImageHtml ( state , slot _w5 ) ;
r += '</tr></table></td>' ;
r += '<td width="120"><table width="120" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="3" width="120" onclick="onPersMenu()" oncontextmenu="onPersMenu()" onmouseover="showCharPopup()" onmouseout="hidePopup()" height="220" align="left" valign="bottom" style="background-image:url(' ;
r += charImgPath + state . sex + '/' + state . image ;
r += '.gif); background-repeat: no-repeat; background-position: center center;">' ;
if ( state . statElix != null )
{
var selix = knownElix [ state . statElix . elixn ] ;
r += '<a onclick="onConcreteElixMenu(' + "'" + state . statElix . elixn + "'" + ')" href="javascript:;">' ;
r += '<img src="' + iconImgPath + selix . id + '.gif" title="' + selix . caption + ' +' + state . statElix . v + '" width="36" height="23" border="0" />' ;
r += '</a>' ;
}
for ( var damageelixn in state . damageElixes )
{
var damageelix = knownDamageElix [ damageelixn ] ;
r += '<a onclick="onApplyConcreteElix(' + "'" + damageelixn + "'" + ', 0)" href="javascript:;">' ;
r += '<img src="' + iconImgPath + damageelix . id + '.gif" title="' + damageelix . caption + '" width="36" height="23" border="0" />' ;
r += '</a>' ;
}
for ( var defelixn in state . defElixes )
{
var defelix = knownDefElix [ defelixn ] ;
r += '<a onclick="onConcreteElixMenu(' + "'" + defelix . id + "'" + ')" href="javascript:;">' ;
r += '<img src="' + iconImgPath + defelix . id + '.gif" title="' + defelix . caption + '" width="36" height="23" border="0" />' ;
r += '</a>' ;
}
if ( state . spellHitpoints != 0 )
{
var spellHitpointsId = 'spellHitpointsUp' ;
var spellHitpointsName = knownApplicableSpells . spellHitpointsUp . id ;
var spellHitpointsCaption = knownApplicableSpells . spellHitpointsUp . caption ;
if ( state . spellHitpoints < 0 )
{
var spellHitpointsId = 'spellHitpointsDown' ;
spellHitpointsName = knownApplicableSpells . spellHitpointsDown . id ;
spellHitpointsCaption = knownApplicableSpells . spellHitpointsDown . caption ;
}
r += '<a onclick="onConcreteElixMenu(' + "'" + spellHitpointsId + "'" + ')" href="javascript:;">' ;
r += '<img src="' + itemImgPath + format ( spellHitpointsName , Math . abs ( state . spellHitpoints ) ) + '.gif" title="' + spellHitpointsCaption + ' ' + state . spellHitpoints + '" width="36" height="23" border="0" />' ;
r += '</a>' ;
}
if ( state . spellIntel > 0 )
{
r += '<a onclick="onConcreteElixMenu(' + "'spellIntel'" + ')" href="javascript:;">' ;
r += '<img src="' + itemImgPath + knownApplicableSpells . spellIntel . id + '.gif" title="' + knownApplicableSpells . spellIntel . caption + ' +' + state . spellIntel + '" width="36" height="23" border="0" />' ;
r += '</a>' ;
}
if ( state . spellBD > 0 )
{
r += '<a onclick="onConcreteElixMenu(' + "'spellBD'" + ')" href="javascript:;">' ;
r += '<img src="' + trickImgPath + knownApplicableSpells . spellBD . id + '.gif" title="' + knownApplicableSpells . spellBD . caption + '" width="36" height="23" border="0" />' ;
r += '</a>' ;
}
if ( state . pet != null )
{
var pet = pets [ state . pet . n ] ;
r += format ( '<br /><img align="right" src="{0}{2}/{1}.gif" alt="" title="" onmouseover="showPetProps()" onmouseout="hidePopup()" width="40" height="73" border="0" />' , charImgPath , pet . image . def , pet . image . sex ) ;
}
r += '</td></tr><tr>' ;
r += getPersObjectImageHtml ( state , slot _w14 ) ;
// w16 is skipped
r += format ( '<td height="20"><img style="opacity: 0.4; MozOpacity: 0.4; KhtmlOpacity: 0.4; filter:alpha(opacity = 40, style = 3)" src="{0}w14.gif" width="40" height="20" border="0" /></td>' , itemImgPath ) ;
r += getPersObjectImageHtml ( state , slot _w15 ) ;
r += '</tr><tr>' ;
r += format ( '<td height="20"><img style="opacity: 0.4; MozOpacity: 0.4; KhtmlOpacity: 0.4; filter:alpha(opacity = 40, style = 3)" src="{0}w20_1.gif" width="40" height="20" border="0" /></td>' , itemImgPath ) ;
r += format ( '<td height="20"><img style="opacity: 0.4; MozOpacity: 0.4; KhtmlOpacity: 0.4; filter:alpha(opacity = 40, style = 3)" src="{0}w20_1.gif" width="40" height="20" border="0" /></td>' , itemImgPath ) ;
r += format ( '<td height="20"><img style="opacity: 0.4; MozOpacity: 0.4; KhtmlOpacity: 0.4; filter:alpha(opacity = 40, style = 3)" src="{0}w20_1.gif" width="40" height="20" border="0" /></td>' , itemImgPath ) ;
r += '</tr></table></td><td width="60"><table width="60" border="0" cellpadding="0" cellspacing="0"><tr>' ;
// w1
r += getPersObjectImageHtml ( state , slot _w1 ) ;
r += '</tr><tr>' ;
// w2
r += getPersObjectImageHtml ( state , slot _w2 ) ;
r += '</tr><tr><td><table border="0" cellspacing="0" cellpadding="0"><tr>' ;
// w6
r += getPersObjectImageHtml ( state , slot _w6 ) ;
// w7
r += getPersObjectImageHtml ( state , slot _w7 ) ;
// w8
r += getPersObjectImageHtml ( state , slot _w8 ) ;
r += '</tr></table></td></tr><tr>' ;
// w11
r += getPersObjectImageHtml ( state , slot _w11 ) ;
r += '</tr><tr>' ;
// w10
r += getPersObjectImageHtml ( state , slot _w10 ) ;
r += '</tr><tr>' ;
// w19
r += getPersObjectImageHtml ( state , slot _w19 ) ;
r += '</tr><tr>' ;
// w12
r += getPersObjectImageHtml ( state , slot _w12 ) ;
r += '</tr></table></td>' ;
r += '<td width="60" valign="bottom"><table width="60" border="0" cellpadding="0" cellspacing="0"><tr>' ;
// w18
r += getPersObjectImageHtml ( state , slot _w18 ) ;
r += '</tr><tr>' ;
// wshirt (w0)
r += getPersObjectImageHtml ( state , slot _w0 ) ;
r += '</tr><tr>' ;
// w17
r += getPersObjectImageHtml ( state , slot _w17 ) ;
r += '</tr></tr></table></td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="0">' ;
for ( var ci = 0 ; ci < 3 ; ci ++ )
{
r += '<tr>' ;
for ( var i = 0 ; i < 7 ; i ++ )
{
// if (ci==2 && i==7) {continue;}
var trickNumber = ( ci * 7 ) + i ;
r += getSingleTrickSlotHtml ( state , trickNumber , state . trickSlots [ trickNumber ] ) ;
}
r += '</tr>' ;
}
r += '</table></td></tr></table>' ;
return r ;
}
function changePersName ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
2023-01-10 18:29:32 +02:00
var name = window . prompt ( 'Введите имя этого персонажа' , state . name ) ;
2022-12-19 22:22:19 +02:00
if ( name == null )
{
return ;
}
state . name = name . toString ( ) ;
hardUpdateDresserState ( state ) ;
}
function changePersAlignTo ( align )
{
var state = activeState ;
if ( state == null )
{
return ;
}
state . align = align ;
hardUpdateDresserState ( state ) ;
}
function changePersAlign ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var menuHtml = '<b>' + localizer . alignments + '</b>' ;
menuHtml += '<table cellspacing="0" cellpadding="0" border="0"><tr><td>' ;
menuHtml += '<table cellspacing="0" cellpadding="0" border="0"><tr>' ;
var groupCount = 0 ;
for ( var ai = 0 ; ai < aligns . length ; ai ++ )
{
var a = aligns [ ai ] ;
if ( 'id' in a )
{
menuHtml += getRowMenuItemHtml ( '<img width="12" height="15" border="0" src="' + baseImgPath + 'align' + a . id + '.gif" /> ' + a . caption , 'changePersAlignTo(' + "'" + a . id + "'" + ')' ) ;
}
else
{
if ( groupCount > 0 )
{
menuHtml += '</table></td>' ;
}
menuHtml += '<td valign="top">' ;
menuHtml += '<table cellspacing="0" cellpadding="0" border="0">' ;
menuHtml += '<tr><td align="center"><small><b>' ;
menuHtml += a . caption ;
menuHtml += '</b></small></td></tr>' ;
groupCount ++ ;
}
}
menuHtml += '</table></td></tr>' ;
menuHtml += '</table></td></tr>' ;
menuHtml += '<tr><td>' ;
menuHtml += '<hr class="dashed" />' ;
menuHtml += '</td></tr>' ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table>' ;
cursorX -= 40 ;
cursorY -= 100 ;
showMenu ( menuHtml ) ;
}
function changePersClan ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
2023-01-10 18:29:32 +02:00
var clan = window . prompt ( 'Введите название клана' , state . clan ) ;
2022-12-19 22:22:19 +02:00
if ( clan == null )
{
return ;
}
state . clan = clan . toString ( ) ;
hardUpdateDresserState ( state ) ;
}
function changePersGender ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
// test nonstandard image
if ( isNaN ( state . image ) )
{
state . image = '0' ;
}
state . sex = 1 - state . sex ;
// test unexistent sex image
if ( maxPersImageNumber [ state . sex ] < parseInt ( state . image ) )
{
state . image = '0' ;
}
for ( var i = 0 ; i < excludePersImageNumbers [ state . sex ] . length ; i ++ )
{
if ( excludePersImageNumbers [ state . sex ] [ i ] == parseInt ( state . image ) )
{
state . image = '0' ;
break ;
}
}
hardUpdateDresserState ( state ) ;
}
function changePersImageTo ( imagestr )
{
var state = activeState ;
if ( state == null )
{
return ;
}
state . image = imagestr . toString ( ) ;
hardUpdateDresserState ( state ) ;
}
function changePersImage ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var cpin = 'cpimag_' + state . sex ;
if ( cpin in menuhash )
{
showMenu ( menuhash [ cpin ] ) ;
return ;
}
// test nonstandard image
if ( isNaN ( state . image ) )
{
state . image = '0' ;
}
var perRow = ( ( 8 * 60 ) / 60 ) ;
var menuHtml = '<b>' + localizer . appearances + '</b>' ;
menuHtml += '<table cellspacing="0" cellpadding="0" border="0"><tr><td>' ;
menuHtml += '<table cellspacing="0" cellpadding="0" border="0"><tr>' ;
var ri = 0 ;
for ( var i = 0 ; i <= maxPersImageNumber [ state . sex ] ; i ++ )
{
var needCont = false ;
for ( var ei = 0 ; ei < excludePersImageNumbers [ state . sex ] . length ; ei ++ )
{
if ( excludePersImageNumbers [ state . sex ] [ ei ] == i )
{
needCont = true ;
break ;
}
}
if ( needCont )
{
continue ;
}
var onclick = format ( "hideMenu(); changePersImageTo('{0}')" , i ) ;
menuHtml += getCellMenuItemHtml ( format ( '<img src="{0}{1}/{2}.gif" width="60" height="110" border="0" />' ,
charImgPath ,
state . sex ,
i ) ,
onclick ) ;
if ( ( ri % perRow ) == ( perRow - 1 ) )
{
menuHtml += '</tr><tr>' ;
}
ri += 1 ;
}
for ( var i = 0 ; i < uniquePersImageNumbers [ state . sex ] . length ; i ++ )
{
var code = uniquePersImageNumbers [ state . sex ] [ i ] ;
var onclick = format ( "hideMenu(); changePersImageTo('{0}')" , code ) ;
menuHtml += getCellMenuItemHtml ( format ( '<img src="{0}{1}/{2}.gif" width="60" height="110" border="0" />' ,
charImgPath ,
state . sex ,
code ) ,
onclick ) ;
if ( ( ri % perRow ) == ( perRow - 1 ) )
{
menuHtml += '</tr><tr>' ;
}
ri += 1 ;
}
menuHtml += '</tr></table>' ;
menuHtml += '</td></tr><tr><td>' ;
menuHtml += '<hr class="dashed" />' ;
menuHtml += '</td></tr>' ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table>' ;
menuhash [ cpin ] = menuHtml ;
showMenu ( menuHtml ) ;
}
function changePersSignTo ( sign )
{
var state = activeState ;
if ( state == null )
{
return ;
}
state . sign = sign ;
hardUpdateDresserState ( state ) ;
}
function changePersSign ( )
{
var menuHtml = '<table width="180px" border="0">' ;
for ( var i = 1 ; i <= 12 ; i ++ )
{
menuHtml += getRowMenuItemHtml ( localizer [ 'zodiac' + i ] , 'changePersSignTo(' + i + ')' ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . zodiac0 , "changePersSignTo('')" ) ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml ) ;
if ( is . ie )
{
window . event . returnValue = false ;
}
return false ;
}
function onPersMenu ( )
{
var menuHtml = '<table width="180px" border="0">' ;
menuHtml += getRowMenuItemHtml ( localizer . changeName , 'changePersName()' ) ;
menuHtml += getRowMenuItemHtml ( localizer . changeGender , 'changePersGender()' ) ;
menuHtml += getRowMenuItemHtml ( localizer . changeSign , 'changePersSign()' ) ;
menuHtml += getRowMenuItemHtml ( localizer . changeImage , 'changePersImage()' ) ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . changeAlign , 'changePersAlign()' ) ;
menuHtml += getRowMenuItemHtml ( localizer . changeClan , 'changePersClan()' ) ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml ) ;
if ( is . ie )
{
window . event . returnValue = false ;
}
return false ;
}
function onSharpeningMenu ( slotid , minlevel , allownew , isstf , isdbl )
{
var state = activeState ;
var slot = getSlotById ( slotid ) ;
if ( state == null || slot == null )
{
return ;
}
var menuHtml = '<table width="360px" border="0"><tr><td valign="middle" align="center"><table width="180px" border="0">' ;
menuHtml += getRowMenuItemHtml ( localizer . noSharpening , format ( "onSharpWeapon('{0}', '{1}', 0)" , state . id , slot . id ) ) ;
if ( allownew == 1 )
{
menuHtml += getRowMenuSeparatorHtml ( ) ;
if ( isstf != 1 ) { menuHtml += getRowMenuItemHtml ( format ( '{0} +1' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 101)" , state . id , slot . id ) ) ; }
if ( isstf != 1 ) { menuHtml += getRowMenuItemHtml ( format ( '{0} +2' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 102)" , state . id , slot . id ) ) ; }
if ( isstf != 1 ) { menuHtml += getRowMenuItemHtml ( format ( '{0} +3' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 103)" , state . id , slot . id ) ) ; }
if ( ( isstf != 1 ) && ( minlevel >= 1 ) && ( isdbl == 1 ) ) { menuHtml += getRowMenuItemHtml ( format ( '{0} +4' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 104)" , state . id , slot . id ) ) ; }
if ( minlevel >= 2 ) { menuHtml += getRowMenuItemHtml ( format ( '{0} +5' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 105)" , state . id , slot . id ) ) ; }
if ( minlevel >= 3 ) { menuHtml += getRowMenuItemHtml ( format ( '{0} +6' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 106)" , state . id , slot . id ) ) ; }
if ( minlevel >= 4 ) { menuHtml += getRowMenuItemHtml ( format ( '{0} +7' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 107)" , state . id , slot . id ) ) ; }
if ( minlevel >= 5 ) { menuHtml += getRowMenuItemHtml ( format ( '{0} +8' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 108)" , state . id , slot . id ) ) ; }
if ( minlevel >= 6 ) { menuHtml += getRowMenuItemHtml ( format ( '{0} +9' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 109)" , state . id , slot . id ) ) ; }
if ( minlevel >= 8 ) { menuHtml += getRowMenuItemHtml ( format ( '{0} +11' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 111)" , state . id , slot . id ) ) ; }
}
menuHtml += '</table></td><td valign="middle" align="center"><table width="180px" border="0">' ;
menuHtml += getRowMenuItemHtml ( format ( '{0} +1 [old]' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 1)" , state . id , slot . id ) ) ;
menuHtml += getRowMenuItemHtml ( format ( '{0} +2 [old]' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 2)" , state . id , slot . id ) ) ;
menuHtml += getRowMenuItemHtml ( format ( '{0} +3 [old]' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 3)" , state . id , slot . id ) ) ;
menuHtml += getRowMenuItemHtml ( format ( '{0} +4 [old]' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 4)" , state . id , slot . id ) ) ;
menuHtml += getRowMenuItemHtml ( format ( '{0} +5 [old]' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 5)" , state . id , slot . id ) ) ;
menuHtml += getRowMenuItemHtml ( format ( '{0} +7 [old]' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 7)" , state . id , slot . id ) ) ;
menuHtml += getRowMenuItemHtml ( format ( '{0} +10 [old]' , localizer . sharpening ) , format ( "onSharpWeapon('{0}', '{1}', 10)" , state . id , slot . id ) ) ;
menuHtml += '</table></td></tr><tr><td colspan="2" align="middle"><table align="center" width="360" border="0">' ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table></td></tr></table>' ;
cursorY -= 200 ;
showMenu ( menuHtml ) ;
if ( is . ie )
{
window . event . returnValue = false ;
}
return false ;
}
function areSameObjectsWeared ( state , slot1 , slot2 )
{
if ( state == null ) return false ;
if ( slot1 == slot2 ) return true ;
if ( slot1 == slot _w3 || slot1 == slot _w10 )
{
if ( ( slot2 != slot _w3 && slot2 != slot _w10 ) || ( state . w3sharp != state . w10sharp ) )
{
return false ;
}
}
var oid1 = state . objects [ slot1 . index ] ;
var oid2 = state . objects [ slot2 . index ] ;
if ( oid1 == null || oid2 == null ) return false ;
return true
&& ( oid1 == oid2 )
&& ( state . upgradeSlots [ slot1 . index ] == state . upgradeSlots [ slot2 . index ] )
&& ( state . fitSlots [ slot1 . index ] == state . fitSlots [ slot2 . index ] )
&& ( state . charmSlots [ slot1 . index ] == state . charmSlots [ slot2 . index ] )
&& ( state . addSlots [ slot1 . index ] == state . addSlots [ slot2 . index ] )
&& ( state . runeSlots [ slot1 . index ] == state . runeSlots [ slot2 . index ] )
;
}
function openObjectData ( slotid )
{
var state = activeState ;
var slot = getSlotById ( slotid ) ;
var o = getObjectByStateSlot ( state , slot ) ;
var html = '' ;
html += '<div style="width: 100%">' ;
html += getDresserInfoPaneTabsHtml ( - 1 ) ;
html += '<table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab-content"><tr><td colspan="2">' ;
html += '<table width="100%" border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;">' ;
html += '<tr><td>' ;
html += getObjectDescHtml ( state , o ) ;
html += '</td></tr>' ;
html += '</table>' ;
html += '</td></tr>' ;
html += '</table>' ;
html += '</td></tr></table>' ;
html += '</div>' ;
document . getElementById ( 'infopane' + state . id ) . innerHTML = html ;
}
function onObjectClick ( stateid , slotid )
{
var i ;
var state = dressStates [ stateid ] ;
var slot = getSlotById ( slotid ) ;
if ( state == null || slot == null )
{
return ;
}
var origin = getObjectById ( state . objects [ slot . index ] ) ;
var o = getObjectByStateSlot ( state , slot ) ;
var menuHtml = '<table width="180px" border="0">' ;
if ( slot . id == 'w6' )
{
var ow7 = getObjectByStateSlot ( state , slot _w7 ) ;
if ( ow7 != null )
{
menuHtml += getRowMenuItemHtml ( localizer . dressSameItem + ' ' + ow7 . caption , format ( "onItemWearFrom('{0}', '{1}')" , slotid , slot _w7 . id ) ) ;
}
var ow8 = getObjectByStateSlot ( state , slot _w8 ) ;
if ( ow8 != ow7 && ow8 != null )
{
menuHtml += getRowMenuItemHtml ( localizer . dressSameItem + ' ' + ow8 . caption , format ( "onItemWearFrom('{0}', '{1}')" , slotid , slot _w8 . id ) ) ;
}
}
if ( slot . id == 'w7' )
{
var ow6 = getObjectByStateSlot ( state , slot _w6 ) ;
if ( ow6 != null )
{
menuHtml += getRowMenuItemHtml ( localizer . dressSameItem + ' ' + ow6 . caption , format ( "onItemWearFrom('{0}', '{1}')" , slotid , slot _w6 . id ) ) ;
}
var ow8 = getObjectByStateSlot ( state , slot _w8 ) ;
if ( ow8 != ow6 && ow8 != null )
{
menuHtml += getRowMenuItemHtml ( localizer . dressSameItem + ' ' + ow8 . caption , format ( "onItemWearFrom('{0}', '{1}')" , slotid , slot _w8 . id ) ) ;
}
}
if ( slot . id == 'w8' )
{
var ow6 = getObjectByStateSlot ( state , slot _w6 ) ;
if ( ow6 != null )
{
menuHtml += getRowMenuItemHtml ( localizer . dressSameItem + ' ' + ow6 . caption , format ( "onItemWearFrom('{0}', '{1}')" , slotid , slot _w6 . id ) ) ;
}
var ow7 = getObjectByStateSlot ( state , slot _w7 ) ;
if ( ow7 != ow6 && ow7 != null )
{
menuHtml += getRowMenuItemHtml ( localizer . dressSameItem + ' ' + ow7 . caption , format ( "onItemWearFrom('{0}', '{1}')" , slotid , slot _w7 . id ) ) ;
}
}
for ( var catid in categories )
{
if ( categories [ catid ] . slot == slotid )
{
menuHtml += getRowMenuItemHtml ( categories [ catid ] . caption , format ( "onCategorySelect('{0}', '{1}', '{2}')" , state . id , slotid , catid ) ) ;
}
}
var isSpellSlot = 0 ;
for ( var SpellFinder = 100 ; SpellFinder <= 109 ; SpellFinder ++ )
{ if ( slot . id == 'w' + SpellFinder ) { isSpellSlot = 1 ; } }
if ( isSpellSlot == 1 )
{
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . dropAllSpells , format ( "DropAllScrolls('{0}')" , state . id ) ) ;
}
if ( o != null && origin != null )
{
var hasExtensions = false ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
if ( ! ( 'fakebase' in origin ) )
{
if ( ( 'upgrade' in o ) || ( 'wasUpgrade' in o ) )
{
hasExtensions = true ;
menuHtml += getRowMenuItemHtml ( localizer . upgradeObject , format ( "onUpgradeObject('{0}', '{1}', '')" , state . id , slot . id ) ) ;
}
}
if ( o . adjustment || ( 'setlinks' in o ) )
{
hasExtensions = true ;
menuHtml += getRowMenuItemHtml ( localizer . fitObject , format ( "onFitObject('{0}', '{1}')" , state . id , slot . id ) ) ;
}
if ( slot . id == 'w4' )
{
hasExtensions = true ;
if ( state . fitArmor )
{
menuHtml += getRowMenuItemHtml ( localizer . unfitArmor , format ( "onFitArmor('{0}', false)" , state . id ) ) ;
}
else
{
menuHtml += getRowMenuItemHtml ( localizer . fitArmor , format ( "onFitArmor('{0}', true)" , state . id ) ) ;
}
}
if ( slot . id == 'w3' || slot . id == 'w10' )
{
var ocat = categories [ o . category ] ;
if ( ( 'canBeSharpen' in ocat ) && ocat . canBeSharpen )
{
hasExtensions = true ;
var minlv = 0 ;
var allowNewSharp = 1 ;
if ( 'required' in o )
{ if ( 'level' in o . required )
{
minlv = o . required . level ;
//if ('artefact' in o) { if (minlv < 10) { allowNewSharp=0; } }
}
}
var isStaff = 0 ;
if ( 'category' in o )
{
if ( o . category == 'staffs' ) { isStaff = 1 ; }
}
var isDouble = 0 ;
if ( 'properties' in o )
{
if ( 'twohandled' in o . properties )
{
isDouble = 1 ;
}
}
menuHtml += getRowMenuItemHtml ( localizer . sharpening , format ( "onSharpeningMenu('{0}','{1}','{2}','{3}','{4}')" , slot . id , minlv , allowNewSharp , isStaff , isDouble ) ) ;
}
}
// if (('canCharm' in slot) && !('artefact' in o))
if ( 'category' in o )
{
if ( 'canRune' in categories [ o . category ] )
{
hasExtensions = true ;
menuHtml += getRowMenuItemHtml ( localizer . rune , format ( "ShowCatRunes('{0}', '{1}', '{2}')" , o . category , state . id , slot . id ) ) ;
//menuHtml += getRowMenuItemHtml(localizer.rune, format("alert('Coming soon...')"));
if ( 'wasRuned' in o )
{
menuHtml += getRowMenuItemHtml ( localizer . unRune , format ( "onUnRuneObject('{0}', '{1}', '')" , state . id , slot . id ) ) ;
}
}
}
if ( ( 'modify' in o ) && ( 'stats' in o . modify ) ) {
hasExtensions = true ;
var ki = o . modify . stats ;
menuHtml += getRowMenuItemHtml ( localizer . addStats , format ( "onaddStats('{0}', '{1}', '{2}')" , state . id , slot . id , ki ) ) ;
if ( 'wasAdded' in o )
{
menuHtml += getRowMenuItemHtml ( localizer . unaddStats , format ( "onUnaddStats('{0}', '{1}', '')" , state . id , slot . id ) ) ;
}
}
if ( 'canCharm' in slot )
{
hasExtensions = true ;
menuHtml += getRowMenuItemHtml ( localizer . charmObject , format ( "onCharmObject('{0}', '{1}', '')" , state . id , slot . id ) ) ;
if ( 'wasCharmed' in o )
{
menuHtml += getRowMenuItemHtml ( localizer . uncharmObject , format ( "onUncharmObject('{0}', '{1}', '')" , state . id , slot . id ) ) ;
}
}
if ( hasExtensions )
{
menuHtml += getRowMenuSeparatorHtml ( ) ;
}
menuHtml += getRowMenuItemHtml ( localizer . dropItem , format ( "onObjectDrop('{0}', '{1}')" , state . id , slotid ) ) ;
}
if ( o != null )
{
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . showObjectData , format ( "openObjectData('{0}')" , slotid ) ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml ) ;
if ( is . ie )
{
window . event . returnValue = false ;
}
return false ;
}
function getItemPropTNMRBHtml ( mf , total , natural , modify , maxv , req , noLabel , battlemf )
{
var html = ( ( noLabel != null ) && noLabel ) ? '' : ( getItemPropLabel ( mf ) + ': ' ) ;
var hint = '' ;
if ( natural !== 0 || modify !== 0 )
{
if ( natural !== 0 )
{
hint += localizer . describeNativeStats + getItemPropFormattedValue ( mf , natural ) ;
}
if ( modify !== 0 )
{
hint += ( modify >= 0 ) ? '+' : '' ;
hint += getItemPropFormattedValue ( mf , modify ) ;
hint += localizer . describeSetStats ;
}
hint += '.' ;
}
html += ' <span' ;
if ( hint != '' )
{
html += ' title="' + hint + '"' ;
}
html += '>' ;
html += getItemPropFormattedValue ( mf , total , maxv ) ;
html += '</span>' ;
if ( battlemf != 0 )
{
2023-01-10 18:29:32 +02:00
html += '<span title="от зверя только в бою">' ;
2022-12-19 22:22:19 +02:00
html += ( battlemf >= 0 ) ? '+' : '' ;
html += getItemPropFormattedValue ( mf , battlemf ) ;
html += '</span>' ;
}
if ( req != null && req > 0 )
{
html += ', <span title="' + localizer . requiredHint + '">' ;
var s = ' [' ;
s += getItemPropFormattedValue ( mf , req ) ;
if ( modify != 0 )
{
var reqnatural = req - modify ;
if ( reqnatural > 0 )
{
s += ' (' ;
s += getItemPropFormattedValue ( mf , reqnatural ) ;
s += ')' ;
}
}
s += ']' ;
if ( req > total )
{
s = s . fontcolor ( 'red' ) ;
}
html += s ;
html += '</span>' ;
}
return html ;
}
function getItemPropAdvWeaponHtml ( mf , vobj , maxv , noLabel )
{
var html = '' ;
if ( noLabel == null || ! noLabel )
{
html += getItemPropLabel ( mf ) + ': ' ;
}
if ( vobj == null )
{
html += '-' ;
return html ;
}
var vsum = vobj . minv + vobj . maxv ;
var fv = getItemPropFormattedValue ( mf , vobj . minv ) ;
fv += '-' ;
fv += getItemPropFormattedValue ( mf , vobj . maxv ) ;
if ( maxv != null && vsum < maxv )
{
fv = fv . fontcolor ( 'blue' ) ;
}
else
{
fv = fv . fontcolor ( 'darkgreen' ) ;
}
html += fv ;
return html ;
}
function getWeaponSkillValueOf ( state , wo , skillname )
{
var skill = 0 ;
if ( skillname in state . results )
{
skill = state . results [ skillname ] ;
}
if ( 'weaponskill' in state . results )
{
skill += state . results . weaponskill ;
}
if ( ( 'properties' in wo ) && ( skillname in wo . properties ) )
{
skill += wo . properties [ skillname ] ;
}
if ( ( 'properties' in wo ) && ( 'weaponskill' in wo . properties ) )
{
skill += wo . properties . weaponskill ;
}
return skill ;
}
function getWeaponSkillData ( state , wslot )
{
var wo = getObjectByStateSlot ( state , wslot ) ;
if ( ( wo == null ) || ( wo . slot != 'w3' ) )
{
return { name : null , value : 0 } ;
}
var skillname = null ;
if ( 'required' in wo )
{
for ( var i = 0 ; i < knownWeaponSkills . length ; i ++ )
{
if ( knownWeaponSkills [ i ] in wo . required )
{
skillname = knownWeaponSkills [ i ] ;
break ;
}
}
}
if ( ( skillname == null ) && ( 'skillname' in categories [ wo . category ] ) )
{
skillname = categories [ wo . category ] . skillname ;
}
if ( skillname == null )
{
return { name : null , value : 0 } ;
}
var v = getWeaponSkillValueOf ( state , wo , skillname ) ;
return { name : skillname , value : v } ;
}
function getWeaponSkillValue ( state , wslot )
{
var d = getWeaponSkillData ( state , wslot ) ;
return d . value ;
}
function hasTwoWeapons ( state )
{
var w3o = getObjectByStateSlot ( state , slot _w3 ) ;
if ( w3o == null )
{
return false ;
}
var w10o = getObjectByStateSlot ( state , slot _w10 ) ;
if ( ( w10o == null ) || ( w10o . slot != slot _w3 . id ) )
{
return false ;
}
return true ;
}
function getDresserInfoPaneWeaponHtml ( state , wslot )
{
var wo = getObjectByStateSlot ( state , wslot ) ;
if ( wo == null && wslot . id != slot _w3 . id )
{
return '' ;
}
var html = '<tr><td colspan="2"><hr size="1" noshade="noshade" /></td></tr>' ;
html += '<tr><td valign="top"><b>' ;
html += localizer . strikeGroup ;
html += '</b></td><td valign="top"><font color="#336699"><b>' ;
var caption = ( wo == null ) ? localizer . fists : wo . caption ;
html += caption ;
html += '</b></font></td></tr>' ;
var chapterHtml = '' ;
for ( var mf in knownAdvWeaponModifiers )
{
if ( ! item _props [ mf ] . view )
{
continue ;
}
var vt = ( mf in state [ wslot . id + 'props' ] ) ? state [ wslot . id + 'props' ] [ mf ] : null ;
var mvt = ( vt != null ) ? ( vt . minv + vt . maxv ) : 0 ;
for ( var staten in dressStates )
{
var astate = dressStates [ staten ] ;
var avt1 = ( mf in astate . w3props ) ? astate . w3props [ mf ] : null ;
var mavt1 = ( avt1 != null ) ? ( avt1 . minv + avt1 . maxv ) : 0 ;
var avt2 = ( mf in astate . w10props ) ? astate . w10props [ mf ] : null ;
var mavt2 = ( avt1 != null ) ? ( avt1 . minv + avt1 . maxv ) : 0 ;
if ( mvt < mavt1 )
{
mvt = mavt1 ;
}
if ( mvt < mavt2 )
{
mvt = mavt2 ;
}
}
if ( mvt != 0 )
{
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += getItemPropLabel ( mf ) ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += getItemPropAdvWeaponHtml ( mf , vt , mvt , true ) ;
chapterHtml += '</td></tr>' ;
}
}
if ( chapterHtml )
{
html += chapterHtml ;
html += '<tr><td><hr class="dashed" /></td><td><a href="#" class="TLink" onclick="showDamagePane(); return false"><small>' + localizer . showDetails + '</small></a></td></tr>' ;
chapterHtml = '' ;
}
for ( var i = 0 ; i < knownWeaponModifiers . length ; i ++ )
{
var mf = knownWeaponModifiers [ i ] ;
if ( mf == '-' )
{
if ( chapterHtml )
{
html += chapterHtml + '<tr><td colspan="2"><hr class="dashed" /></td></tr>' ;
chapterHtml = '' ;
}
continue ;
}
if ( ! item _props [ mf ] . view )
{
continue ;
}
var vn = ( mf in state . natural ) ? state . natural [ mf ] : 0 ;
var vm = ( mf in state [ wslot . id + 'props' ] ) ? state [ wslot . id + 'props' ] [ mf ] : 0 ;
var vt = vn + vm ;
var mvt = vt ;
for ( var staten in dressStates )
{
var astate = dressStates [ staten ] ;
var avn = ( mf in astate . natural ) ? astate . natural [ mf ] : 0 ;
var avm1 = ( mf in astate . w3props ) ? astate . w3props [ mf ] : 0 ;
var avm2 = ( mf in astate . w10props ) ? astate . w10props [ mf ] : 0 ;
var avt1 = avn + avm1 ;
var avt2 = avn + avm2 ;
if ( mvt < avt1 )
{
mvt = avt1 ;
}
if ( mvt < avt2 )
{
mvt = avt2 ;
}
}
if ( mvt != 0 || vn != 0 || vm != 0 )
{
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += getItemPropLabel ( mf ) ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += getItemPropTNMRBHtml ( mf , vt , vn , vm , mvt , null , true , 0 ) ;
chapterHtml += '</td></tr>' ;
}
}
if ( chapterHtml )
{
html += chapterHtml ;
}
return html ;
}
function getDresserInfoPaneCombatSpellHtml ( state , spellid )
{
var r = state . combatSpells [ spellid ] ;
var o = getObjectById ( spellid ) ;
var html = '<tr><td colspan="2"><hr size="1" noshade="noshade" /></td></tr>' ;
if ( isHeavyArmor ( getObjectByStateSlot ( state , slot _w4 ) ) )
{
html += format ( localizer . badHeavyArmor ,
getMenuItemHtml ( localizer . here , format ( "onObjectDrop('{0}', 'w4')" , state . id ) )
) ;
}
if ( areNotMagicGloves ( getObjectByStateSlot ( state , slot _w11 ) ) )
{
html += format ( localizer . badGloves ,
getMenuItemHtml ( localizer . here , format ( "onObjectDrop('{0}', 'w11')" , state . id ) )
) ;
}
html += '<tr><td valign="top"><b>' ;
html += localizer . strikeGroup ;
html += '</b></td><td valign="top"><font color="#336699"><b>' ;
html += o . caption ;
html += '</b></font></td></tr>' ;
var chapterHtml = '' ;
for ( var mf in r )
{
if ( ! item _props [ mf ] . view )
{
continue ;
}
var vt = r [ mf ] ;
var mvt = ( vt . minv + vt . maxv ) ;
for ( var staten in dressStates )
{
var astate = dressStates [ staten ] ;
var avt = ( spellid in astate . combatSpells ) ? astate . combatSpells [ spellid ] [ mf ] : null ;
var mavt = ( avt != null ) ? ( avt . minv + avt . maxv ) : 0 ;
if ( mvt < mavt )
{
mvt = mavt ;
}
}
if ( mvt != 0 )
{
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += getItemPropLabel ( mf ) ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += getItemPropAdvWeaponHtml ( mf , vt , mvt , true ) ;
chapterHtml += '</td></tr>' ;
}
}
if ( chapterHtml )
{
html += chapterHtml ;
html += '<tr><td colspan="2"><hr class="dashed" /></td></tr>' ;
chapterHtml = '' ;
}
if ( chapterHtml )
{
html += chapterHtml ;
}
return html ;
}
function getDresserInfoPaneCombatTrickHtml ( ctrick )
{
var trick = tricks [ ctrick . name ] ;
var html = '<tr><td colspan="2"><hr size="1" noshade="noshade" /></td></tr>' ;
html += '<tr><td valign="top"><b>' ;
html += localizer . trick ;
html += '</b></td><td valign="top"><font color="#336699"><b>' ;
html += ctrick . caption ;
html += '</b></font></td></tr>' ;
var chapterHtml = '' ;
for ( var mf in ctrick )
{
if ( mf == 'name' || mf == 'caption' )
{
continue ;
}
if ( ! item _props [ mf ] . view )
{
continue ;
}
var vt = ctrick [ mf ] ;
var mvt = vt ;
for ( var staten in dressStates )
{
var astate = dressStates [ staten ] ;
var avt = ( ctrick . name in astate . combatSpells ) ? astate . combatSpells [ ctrick . name ] [ mf ] : 0 ;
if ( mvt < avt )
{
mvt = avt ;
}
}
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += getItemPropLabel ( mf ) ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += getItemPropFormattedValue ( mf , vt , mvt ) ;
chapterHtml += '</td></tr>' ;
}
var targeter = null ;
if ( 'attack' in trick )
{
targeter = trick . attack ;
} else if ( 'healing' in trick )
{
targeter = trick . healing ;
}
if ( targeter != null )
{
2023-01-10 18:29:32 +02:00
var count = 'Одна цель' ;
2022-12-19 22:22:19 +02:00
if ( 'mincount' in targeter )
{
2023-01-10 18:29:32 +02:00
count = targeter . mincount + ' - ' + targeter . maxcount + ' целей' ;
2022-12-19 22:22:19 +02:00
}
else if ( 'count' in targeter )
{
2023-01-10 18:29:32 +02:00
count = targeter . count + ' целей' ;
2022-12-19 22:22:19 +02:00
}
chapterHtml += '<tr><td valign="top">' ;
2023-01-10 18:29:32 +02:00
chapterHtml += 'Количество целей' ;
2022-12-19 22:22:19 +02:00
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += count ;
}
if ( chapterHtml )
{
html += chapterHtml ;
html += '<tr><td colspan="2"><hr class="dashed" /></td></tr>' ;
chapterHtml = '' ;
}
if ( chapterHtml )
{
html += chapterHtml ;
}
return html ;
}
function getDefElixSecondValue ( defelix , firstValue )
{
var index = 0 ;
for ( var i = 0 ; i < defelix . values . length ; i ++ )
{
if ( defelix . values [ i ] > firstValue )
{
break ;
}
index = i ;
}
return defelix . values2 [ index ] ;
}
function toggleViewOption ( isItemProp , prop )
{
if ( isItemProp )
{
item _props [ prop ] . view = ! item _props [ prop ] . view ;
}
else
{
common _props [ prop ] . view = ! common _props [ prop ] . view ;
}
}
function getDresserInfoPaneTabHtml ( tabText , tabFunc , on )
{
var html = '' ;
var classn = on ? 'activeLink' : 'usualLink' ;
var onclick = on ? '' : ( ' onclick="' + tabFunc + '"' ) ;
html += format ( '<li class="{0}"><a href="javascript:;"{1}>{2}</a></li>' , classn , onclick , tabText ) ;
return html ;
}
function getDresserInfoPaneTabsHtml ( tabIndex )
{
var state = activeState ;
var html = '' ;
html += '<br />' ;
html += '<div class="dtab"><ul class="dtab" style="float:right; margin-right: 16px;">' ;
html += getDresserInfoPaneTabHtml ( localizer . infoPaneHeader , 'showInfoPane()' , ( tabIndex == 0 ) ) ;
html += getDresserInfoPaneTabHtml ( localizer . damagePaneHeader , 'showDamagePane()' , ( tabIndex == 4 ) ) ;
html += getDresserInfoPaneTabHtml ( localizer . componentsPaneHeader , 'showComponentsPane()' , ( tabIndex == 5 ) ) ;
html += getDresserInfoPaneTabHtml ( localizer . listPaneHeader , 'showListPane()' , ( tabIndex == 1 ) ) ;
if ( state != null && state . pet != null )
{
html += getDresserInfoPaneTabHtml ( localizer . petPaneHeader , 'showPetPane()' , ( tabIndex == 2 ) ) ;
}
html += getDresserInfoPaneTabHtml ( localizer . viewOptionsPaneHeader , 'showViewOptionsPane()' , ( tabIndex == 3 ) ) ;
html += '</ul></div>' ;
return html ;
}
function getDresserPetPaneHtml ( )
{
var state = activeState ;
if ( state == null || state . pet == null )
{
return '' ;
}
var html = '' ;
var pet = pets [ state . pet . n ] ;
var pl = pet . levels [ 'L' + state . pet . level ] ;
html += '<div style="width: 100%">' ;
html += getDresserInfoPaneTabsHtml ( 2 ) ;
html += '<table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab-content"><tr><td colspan="2">' ;
html += '<table width="100%" border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;">' ;
html += '<tr><td>' ;
2023-01-10 18:29:32 +02:00
html += '<b>Информация о выбранном питомце</b><br />' ;
html += 'Тип: ' + pet . caption ;
2022-12-19 22:22:19 +02:00
for ( var name in pl )
{
if ( name in item _props )
{
html += '<br />' + getItemPropLabel ( name ) + ': ' + getItemPropFormattedValue ( name , pl [ name ] ) ;
}
}
if ( 'foods' in pet )
{
html += '<hr class="dashed" />' ;
2023-01-10 18:29:32 +02:00
html += '<small>Еда</small><br />' ;
2022-12-19 22:22:19 +02:00
for ( var foodn in pet . foods )
{
var food = pet . foods [ foodn ] ;
html += format ( '<img src="{0}{1}.gif" title="{2}" alt="{2}" width="60" height="60" border="0" />' , itemImgPath , food . name , food . caption ) ;
}
}
html += '</td></tr>' ;
html += '</table>' ;
html += '</td></tr>' ;
html += '</table>' ;
html += '</td></tr></table>' ;
html += '</div>' ;
return html ;
}
function getCharmChooserHtml ( sloti )
{
var html = '' ;
var slot = getSlotByIndex ( sloti ) ;
var o = getObjectByStateSlot ( activeState , slot ) ;
html += '<table cellspacing="0" cellpadding="0" border="0"><tr><td>' ;
html += format ( localizer . charmHint , clanImgPath ) ;
html += '<div style="text-align: right;">' ;
html += '<table cellspacing="0" cellpadding="0" border="0"><tr>' ;
for ( var i = 0 ; i < knownPredefinedCharms . length ; i ++ )
{
var charm = knownPredefinedCharms [ i ] ;
if ( 'categories' in charm )
{
var found = false ;
for ( var ci = 0 ; ci < charm . categories . length ; ci ++ )
{
if ( charm . categories [ ci ] == o . category )
{
found = true ;
break ;
}
}
if ( ! found )
{
continue ;
}
}
2023-01-10 18:29:32 +02:00
var text = '<img border="0" width="40" height="25" src="' + itemImgPath + charm . id + '.gif" + title="Наложить ' + charm . caption + '" />' ;
2022-12-19 22:22:19 +02:00
var action = "doPredefinedCharm('" + sloti + "', '" + charm . v + "')" ;
html += getCellMenuItemHtml ( text , action ) ;
}
html += '</tr></table>' ;
html += '</div>' ;
html += '<label for="charm_mf_name">' + localizer . charmChooseMf + ':</label><br />' ;
html += '<select class="ABText80" id="charm_mf_name">' ;
for ( var ipi in item _props )
{
var prop = item _props [ ipi ] ;
if ( 'nocharm' in prop )
{
continue ;
}
html += format ( '<option value="{0}">{1}</option>' , ipi , prop . lbl ) ;
}
html += '</select><br />' ;
html += '<label for="charm_mf_value">' + localizer . charmEnterV + ':</label><br />' ;
html += '<input class="ABText80" id="charm_mf_value" type="text" maxlength="5" value="" /><br />' ;
html += '<input id="charm_mf_replace" type="checkbox" value="replace" />' ;
html += '<label for="charm_mf_replace">' + localizer . charmReplace + '.</label><br />' ;
if ( ! ( 'canCharm' in slot ) )
{
2023-01-10 18:29:32 +02:00
html += '<div style="color: red; font-size: x-small;">Зачарование этого слота в БК невозможно.</div>' ;
2022-12-19 22:22:19 +02:00
}
if ( 'artefact' in o )
{
if ( 'required' in o )
{
if ( 'level' in o . required )
{
if ( o . required . level < 10 )
2023-01-10 18:29:32 +02:00
{ html += '<div style="color: red; font-size: x-small;">Зачарование артефактов менее 10-г о уровня в БК невозможно.</div>' ; }
2022-12-19 22:22:19 +02:00
}
}
}
html += '<input class="inpButton" type="button" value="' + localizer . charmObject + '" onclick="doCharm(' + sloti + ')" />' ;
html += ' <input class="inpButton" type="button" value="' + localizer . cancel + '" onclick="hideMenu()" />' ;
html += '</td></tr></table>' ;
return html ;
}
///////////////////////////////////////////////////////////////////////////////////
function getASChooserHtml ( sloti , numb )
{
var html = '' ;
var slot = getSlotByIndex ( sloti ) ;
var o = getObjectByStateSlot ( activeState , slot ) ;
html += '<table cellspacing="0" cellpadding="0" border="0"><tr><td>' ;
html += format ( localizer . addstatsHint , clanImgPath ) ;
html += '<div style="text-align: left;">' ;
html += '<table cellspacing="0" cellpadding="0" border="0"><tr>' ;
2023-01-10 18:29:32 +02:00
html += '<td><div id="awsdstats">Количество увеличений:' ;
2022-12-19 22:22:19 +02:00
html += '<input type="hidden" id="itemstat" class="ABTextAA" value="' + numb + '">' ;
html += '<input type="text" id="alst" class="ABTextAA" value="' + numb + '" READONLY></div></td><tr><td>' ;
2023-01-10 18:29:32 +02:00
html += '<input class="ABTextAA" id="add_strength" type="text" maxlength="3" value="0" READONLY/> Сила</td><td>'
html += '<a onclick="item_ad_p(\'add_strength\')" href="javascript:;"><img src="http://img.combats.com/i/plus.gif" alt="увеличить" border=0> </a>' ;
html += '<a onclick="item_ad_m(\'add_strength\')" href="javascript:;"><img src="http://img.combats.com/i/minus.gif" alt="уменшить" border=0> </a>' ;
2022-12-19 22:22:19 +02:00
html += '</td></tr><tr><td>' ;
2023-01-10 18:29:32 +02:00
html += '<input class="ABTextAA" id="add_dexterity" type="text" maxlength="3" value="0" READONLY /> Ловкость</td><td>' ;
html += '<a onclick="item_ad_p(\'add_dexterity\')" href="javascript:;"><img src="http://img.combats.com/i/plus.gif" alt="увеличить" border=0> </a>' ;
html += '<a onclick="item_ad_m(\'add_dexterity\')" href="javascript:;"><img src="http://img.combats.com/i/minus.gif" alt="уменшить" border=0> </a>' ;
2022-12-19 22:22:19 +02:00
html += '</td></tr><tr><td>' ;
2023-01-10 18:29:32 +02:00
html += '<input class="ABTextAA" id="add_intuition" type="text" maxlength="3" value="0" READONLY/> Интуиция</td><td>' ;
html += '<a onclick="item_ad_p(\'add_intuition\')" href="javascript:;"><img src="http://img.combats.com/i/plus.gif" alt="увеличить" border=0> </a>' ;
html += '<a onclick="item_ad_m(\'add_intuition\')" href="javascript:;"><img src="http://img.combats.com/i/minus.gif" alt="уменшить" border=0> </a>' ;
2022-12-19 22:22:19 +02:00
html += '</td></tr><tr><td>' ;
2023-01-10 18:29:32 +02:00
html += '<input class="ABTextAA" id="add_intellect" type="text" maxlength="3" value="0" READONLY /> Интеллект</td><td>' ;
html += '<a onclick="item_ad_p(\'add_intellect\')" href="javascript:;"><img src="http://img.combats.com/i/plus.gif" alt="увеличить" border=0> <a>' ;
html += '<a onclick="item_ad_m(\'add_intellect\')" href="javascript:;"><img src="http://img.combats.com/i/minus.gif" alt="уменшить" border=0> <a>' ;
2022-12-19 22:22:19 +02:00
html += '</td></tr></table>' ;
html += '</div>' ;
html += '</td></tr></table>' ;
html += '<input class="inpButton" type="button" value="' + localizer . addstatsObject + '" onclick="doAddStats(' + sloti + ')" />' ;
html += ' <input class="inpButton" type="button" value="' + localizer . cancel + '" onclick="hideMenu()" />' ;
html += '</td></tr></table>' ;
return html ;
}
function item _ad _p ( stat )
{
as = document . getElementById ( 'alst' ) ;
var istat = document . getElementById ( 'itemstat' ) . value ;
elem = document . getElementById ( stat ) ;
document . getElementById ( stat ) . focus ( ) ;
if ( ( parseInt ( as . value ) <= parseInt ( istat ) ) && ( parseInt ( as . value ) > 0 ) )
{
elem . value ++ ;
as . value -- ;
}
document . getElementById ( stat ) . blur ( ) ;
}
function item _ad _m ( stat )
{
as = document . getElementById ( 'alst' ) ;
elem = document . getElementById ( stat ) ;
var istat = document . getElementById ( 'itemstat' ) . value ;
document . getElementById ( stat ) . focus ( ) ;
if ( ( as . value <= istat ) && ( as . value >= 0 ) )
{
if ( elem . value >= 1 )
{
elem . value -- ;
as . value ++ ;
}
}
document . getElementById ( stat ) . blur ( ) ;
}
function getDresserViewOptionsPaneHtml ( )
{
var html = '' ;
html += '<div style="width: 100%">' ;
html += getDresserInfoPaneTabsHtml ( 3 ) ;
html += '<table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab-content"><tr><td colspan="2">' ;
html += '<table width="100%" border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;">' ;
html += '<tr><td>' ;
html += localizer . indicesPaneHeader ;
for ( var ci in common _props )
{
var prop = common _props [ ci ] ;
html += format ( '<input onclick="toggleViewOption(false, {2})" type="checkbox" id="{0}" name="{0}"{1} /><label for="{0}">' , ci , ( prop . view ? ' checked="true"' : '' ) , format ( "'{0}'" , ci ) ) ;
html += htmlstring ( prop . lbl ) ;
html += '</label><br />' ;
}
html += '<hr class="dashed" />' ;
for ( var ipi in item _props )
{
var prop = item _props [ ipi ] ;
html += format ( '<input onclick="toggleViewOption(true, {2})" type="checkbox" id="{0}" name="{0}"{1} /><label for="{0}">' , ipi , ( prop . view ? ' checked="true"' : '' ) , format ( "'{0}'" , ipi ) ) ;
html += htmlstring ( prop . lbl ) ;
html += '</label><br />' ;
}
html += '</td></tr>' ;
html += '</table>' ;
html += '</td></tr>' ;
html += '</table>' ;
html += '</td></tr></table>' ;
html += '</div>' ;
return html ;
}
function getDresserListPaneHtml ( state )
{
var html = '' ;
html += '<div style="width: 100%">' ;
html += getDresserInfoPaneTabsHtml ( 1 ) ;
html += '<table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab-content"><tr><td colspan="2">' ;
html += '<table width="100%" border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;">' ;
html += '<tr><td>' ;
html += '<b>' + localizer . naturalStats + '</b><br />' ;
for ( var i = 0 ; i < knownStats . length ; i ++ )
{
html += getItemPropLabel ( knownStats [ i ] ) ;
html += ': ' ;
html += getItemPropFormattedValue ( knownStats [ i ] , state . natural [ knownStats [ i ] ] ) ;
html += '<br />' ;
}
html += '<hr class="dashed" />' ;
html += '<b>' + localizer . resultStats + '</b><br />' ;
for ( var i = 0 ; i < knownStats . length ; i ++ )
{
html += getItemPropLabel ( knownStats [ i ] ) ;
html += ': ' ;
html += getItemPropFormattedValue ( knownStats [ i ] , state . results [ knownStats [ i ] ] ) ;
html += '<br />' ;
}
html += '<hr class="dashed" />' ;
html += '<b>' + localizer . wearedItems + '</b><br />' ;
for ( var i = 0 ; i < slots . length ; i ++ )
{
var o = getObjectByStateSlot ( state , slots [ i ] ) ;
if ( o == null )
{
continue ;
}
html += '<a class="ISLink" href="#" onclick="return dcInfoSpace(' ;
var o2 = getObjectById ( state . objects [ slots [ i ] . index ] ) ;
html += "'" + o2 . id + "', 'goodies'" ;
html += ')" >' ;
html += htmlstring ( o . caption ) ;
2023-01-10 18:29:32 +02:00
html += ' <img alt="Информация" src="' + infospaceImgPath + 'info.gif" width="12" height="11" border="0" /></a>' ;
2022-12-19 22:22:19 +02:00
html += '<br />' ;
}
html += '<hr class="dashed" />' ;
html += '</td></tr>' ;
html += '</table>' ;
html += '</td></tr>' ;
html += '</table>' ;
html += '</td></tr></table>' ;
html += '</div>' ;
return html ;
}
function showPetPane ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
document . getElementById ( 'infopane' + state . id ) . innerHTML = getDresserPetPaneHtml ( ) ;
}
function showViewOptionsPane ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
document . getElementById ( 'infopane' + state . id ) . innerHTML = getDresserViewOptionsPaneHtml ( ) ;
}
function showListPane ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
document . getElementById ( 'infopane' + state . id ) . innerHTML = getDresserListPaneHtml ( state ) ;
}
function showDamagePane ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
document . getElementById ( 'infopane' + state . id ) . innerHTML = getDresserDamagePaneHtml ( state ) ;
}
function showComponentsPane ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
document . getElementById ( 'infopane' + state . id ) . innerHTML = getDresserComponentsPaneHtml ( state ) ;
}
function showPetSkillProps ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var pet = pets [ state . pet . n ] ;
var pl = pet . levels [ 'L' + state . pet . level ] ;
showPopup ( getObjectDescHtml ( state , pl . skill ) ) ;
}
function getDamageHtml ( caption , damageData )
{
var html = '' ;
var chapterHtml = '' ;
for ( var mf in knownAdvWeaponModifiers )
{
if ( ! item _props [ mf ] . view )
{
continue ;
}
var vt = ( mf in damageData ) ? damageData [ mf ] : null ;
var mvt = ( vt != null ) ? ( vt . minv + vt . maxv ) : 0 ;
if ( mvt != 0 )
{
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += getItemPropLabel ( mf ) ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += getItemPropAdvWeaponHtml ( mf , vt , mvt , true ) ;
chapterHtml += '</td></tr>' ;
}
}
if ( item _props . _power _v . view && ( '_power_v' in damageData ) )
{
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += getItemPropLabel ( '_power_v' ) ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += getItemPropFormattedValue ( '_power_v' , damageData . _power _v ) ;
chapterHtml += '</td></tr>' ;
}
if ( chapterHtml )
{
html += '<tr><td><b>' + caption + '</b></td></tr>' ;
html += chapterHtml ;
html += '<tr><td colspan="2"><hr class="dashed" /></td></tr>' ;
}
return html ;
}
function getDresserDamagePaneHtmlFor ( state , wslot )
{
var wo = getObjectByStateSlot ( state , wslot ) ;
if ( wo == null && wslot . id != slot _w3 . id )
{
return '' ;
}
var html = '<tr><td colspan="2"><hr size="1" noshade="noshade" /></td></tr>' ;
html += '<tr><td valign="top"><b>' ;
html += localizer . strikeGroup ;
html += '</b></td><td valign="top"><font color="#336699"><b>' ;
var caption = ( wo == null ) ? localizer . fists : wo . caption ;
html += caption ;
html += '</b></font></td></tr>' ;
var wd = state [ wslot . id + 'props' ] ;
html += getDamageHtml ( localizer . averageDamage + ':' , wd ) ;
var wsd = getWeaponSkillData ( state , wslot ) ;
if ( wsd != null && wsd . name != null )
{
html += '<tr><td valign="top">' ;
html += getItemPropLabel ( wsd . name ) ;
html += ': </td><td valign="top">' ;
html += wsd . value ;
html += '</td></tr>' ;
html += '<tr><td colspan="2"><hr class="dashed" /></td></tr>' ;
}
for ( var attackn in wd . damages )
{
var d = wd . damages [ attackn ] ;
var caption = localizer [ 'attackt' + attackn ] ;
caption += ' (' + d . attack . freal + '%):' ;
html += getDamageHtml ( caption , d ) ;
}
return html ;
}
function getDresserDamagePaneHtml ( state )
{
var html = '' ;
html += '<div style="width: 100%">' ;
html += getDresserInfoPaneTabsHtml ( 4 ) ;
html += '<table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab-content"><tr><td colspan="2">' ;
html += '<table width="100%" border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;"><tr>' ;
var wo3 = getObjectByStateSlot ( state , slot _w3 ) ;
var wo10 = getObjectByStateSlot ( state , slot _w10 ) ;
html += '<td valign="top"><table border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;">' ;
html += getDresserDamagePaneHtmlFor ( state , slot _w3 ) ;
html += '</table></td>' ;
if ( ( wo10 != null ) && ( wo10 . slot == 'w3' ) )
{
if ( ! areSameObjectsWeared ( state , slot _w3 , slot _w10 ) )
{
html += '<td valign="top"><table border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;">' ;
html += getDresserDamagePaneHtmlFor ( state , slot _w10 ) ;
html += '</table></td>' ;
}
else
{
html += '<td valign="top"><table border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;">' ;
html += '<tr><td colspan="2"><hr size="1" noshade="noshade" /></td></tr>' ;
html += '<tr><td colspan="2" valign="top">' ;
html += localizer . sameWeapon ;
html += '</td></tr>' ;
html += '</table></td>' ;
}
}
html += '</table></td>' ;
html += '</tr></table>' ;
html += '</td></tr></table>' ;
html += '</div>' ;
return html ;
}
function getDresserComponentsPaneHtml ( state )
{
var html = '' ;
html += '<div style="width: 100%">' ;
html += getDresserInfoPaneTabsHtml ( 5 ) ;
html += '<table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab-content"><tr><td colspan="2">' ;
html += '<table width="100%" border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;"><tr>' ;
html += '<td valign="top">' ;
var eps = { } ;
for ( var epn in dressExchangePoints )
{
var ep = dressExchangePoints [ epn ] ;
eps [ epn ] = { id : epn , caption : ep . caption , description : ep . description , items : [ ] } ;
}
html += '<b>' + localizer . componentsPaneHeader + '</b>' ;
var chtml = '' ;
var totals = { } ;
for ( var i = 0 ; i < slots . length ; i ++ )
{
var slot = slots [ i ] ;
var o = getObjectByStateSlot ( state , slot ) ;
if ( o == null ) continue ;
if ( 'requireditems' in o )
{
for ( var oi in o . requireditems )
{
eps [ oi ] . items . push ( { id : o . id , caption : o . caption , items : o . requireditems [ oi ] . items } ) ;
}
}
if ( ! ( 'clist' in o ) ) continue ;
chtml += '<br /><b><i>' + o . caption + '</i></b>: ' ;
for ( var ccn in o . clist )
{
var firstc = true ;
for ( var cn in o . clist [ ccn ] )
{
var c = o . clist [ ccn ] [ cn ] ;
if ( ! ( cn in totals ) ) totals [ cn ] = { id : cn , count : 0 , caption : c . caption } ;
totals [ cn ] . count += c . count ;
if ( firstc ) firstc = false ; else chtml += ',' ;
chtml += ' ' + c . caption + ' - ' + c . count ;
}
chtml += '.' ;
}
}
if ( chtml != '' )
{
2023-01-10 18:29:32 +02:00
html += '<br /><b><i>' + 'Создание' + '</i></b>' ;
2022-12-19 22:22:19 +02:00
html += chtml ;
2023-01-10 18:29:32 +02:00
html += '<br /><i><b>В с е г о </b></i>: ' ;
2022-12-19 22:22:19 +02:00
html + - '<ul>' ;
var firstc = true ;
for ( var cn in totals )
{
var c = totals [ cn ] ;
if ( firstc ) firstc = false ; //else html += '';
html += '<li> ' + c . caption + ' - ' + c . count + ' </li>' ;
}
html += '</ul>' ;
html += '<br />' ;
}
for ( var epi in eps )
{
var ep = eps [ epi ] ;
var ephtml = '' ;
totals = { } ;
for ( var i in ep . items )
{
var item = ep . items [ i ] ;
ephtml += item . caption + ': ' ;
var firstc = true ;
for ( var ci in item . items )
{
var c = item . items [ ci ] ;
if ( ! ( ci in totals ) ) totals [ ci ] = { id : ci , count : 0 , caption : c . caption } ;
totals [ ci ] . count += c . count ;
if ( firstc ) firstc = false ; else ephtml += ',' ;
ephtml += ' ' + c . caption + ' - ' + c . count ;
}
ephtml += '.<br />' ;
}
if ( ephtml != '' )
{
html += '<br /><b title="' + ep . description + '"><i>' + ep . caption + '</i></b><br />' ;
html += ephtml ;
2023-01-10 18:29:32 +02:00
html += '<i>В с е г о </i>: ' ;
2022-12-19 22:22:19 +02:00
var firstc = true ;
for ( var ci in totals )
{
var c = totals [ ci ] ;
if ( firstc ) firstc = false ; else html += ',' ;
html += ' ' + c . caption + ' - ' + c . count ;
}
html += '<br />' ;
}
}
html += '</td>' ;
html += '</tr></table>' ;
html += '</td></tr></table>' ;
html += '</div>' ;
return html ;
}
function getMatvikZoneValue ( v )
{
v = 1 - Math . pow ( 0.5 , ( v / 250.0 ) ) ;
v *= 100.0 ;
v = Math . floor ( v * 100.0 + 0.5 ) / 100.0 ;
return v ;
}
function getMatvikZoneValue800 ( v )
{
if ( v > 800 ) v = 800 ;
return getMatvikZoneValue ( v ) ;
}
function getMatvikZoneValue1000 ( v )
{
if ( v > 1000 ) v = 1000 ;
return getMatvikZoneValue ( v ) ;
}
function getDresserInfoPaneHtml ( state )
{
var html = '' ;
html += '<div style="width: 100%">' ;
html += getDresserInfoPaneTabsHtml ( 0 ) ;
html += '<table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab-content"><tr><td colspan="2">' ;
html += '<table width="100%" border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;">' ;
var chapterHtml = '' ;
for ( var sloti = 0 ; sloti < slots . length ; sloti ++ )
{
var slot = slots [ sloti ] ;
var o = getObjectByStateSlot ( state , slot ) ;
if ( o != null && 'required' in o )
{
var needHtml = '' ;
var canFit = false ;
if ( 'sex' in o . required )
{
var statesex = state . sex ? 'female' : 'male' ;
if ( o . required . sex != statesex )
{
needHtml += localizer . badGender ;
}
}
for ( var mfname in o . required )
{
var rv = state . results [ mfname ] ;
var bmf = 0 ;
if ( mfname in state . battlemf )
{
bmf = state . battlemf [ mfname ] ;
}
rv -= bmf ;
if ( rv < o . required [ mfname ] )
{
if ( needHtml != '' )
{
needHtml += '<br />' ;
}
needHtml += format ( localizer . reqInfo , getItemPropLabel ( mfname ) , o . required [ mfname ] , ( o . required [ mfname ] - state . modify [ mfname ] + bmf ) ) ;
canFit = true ;
}
}
if ( needHtml != '' )
{
chapterHtml += '<tr><td colspan="2" class="hintview">' ;
chapterHtml += '<table class="reqinfo" width="100%" border="0"><tr><td>' + o . caption . bold ( ) + '</td>' ;
chapterHtml += '<td>' + needHtml + '</td></tr></table>' ;
if ( canFit )
{
chapterHtml += format ( localizer . adjustHint , getMenuItemHtml ( localizer . here , format ( "onFitStats('{0}')" , state . id ) ) ) ;
}
chapterHtml += '</td></tr>' ;
}
}
}
for ( var tricki = 0 ; tricki < state . trickSlots . length ; tricki ++ )
{
var trickn = state . trickSlots [ tricki ] ;
var o = null ;
if ( trickn != null )
{
o = tricks [ getJSName ( trickn ) ] ;
}
if ( o != null && 'required' in o )
{
var needHtml = '' ;
var canFit = false ;
if ( 'sex' in o . required )
{
var statesex = state . sex ? 'female' : 'male' ;
if ( o . required . sex != statesex )
{
needHtml += localizer . badGender ;
}
}
for ( var mfname in o . required )
{
var rv = state . results [ mfname ] ;
if ( mfname in state . battlemf )
{
rv -= state . battlemf [ mfname ] ;
}
if ( rv < o . required [ mfname ] )
{
if ( needHtml != '' )
{
needHtml += '<br />' ;
}
needHtml += format ( localizer . reqInfo , getItemPropLabel ( mfname ) , o . required [ mfname ] , ( o . required [ mfname ] - state . modify [ mfname ] ) ) ;
canFit = true ;
}
}
if ( needHtml != '' )
{
chapterHtml += '<tr><td colspan="2" class="hintview">' ;
chapterHtml += '<table class="reqinfo" width="100%" border="0"><tr><td>' + o . caption . bold ( ) + '</td>' ;
chapterHtml += '<td>' + needHtml + '</td></tr></table>' ;
if ( canFit )
{
chapterHtml += format ( localizer . adjustHint , getMenuItemHtml ( localizer . here , format ( "onFitStats('{0}')" , state . id ) ) ) ;
}
chapterHtml += '</td></tr>' ;
}
}
}
if ( chapterHtml != '' )
{
html += chapterHtml ; // + '<tr><td colspan="2"><hr class="dashed" /></td></tr>';
}
html += '</table></td></tr>' ;
html += '<tr><td valign="top">' ;
html += '<table border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;">' ;
html += '<tr><td colspan="2"><hr size="1" noshade="noshade" /></td></tr>' ;
chapterHtml = '' ;
var waddo = getObjectByStateSlot ( state , slot _wadd ) ;
if ( waddo != null )
{
chapterHtml += '<tr><td valign="top">' ;
2023-01-10 18:29:32 +02:00
chapterHtml += localizer . waddInfo ; //Продукты - Подарок
2022-12-19 22:22:19 +02:00
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += format (
'<u onmouseout="hidePopup()" onmouseover="showItemProps2({1}, {2})">{0}</u></td></tr>' ,
waddo . caption ,
format ( "'{0}'" , state . id ) ,
format ( "'{0}'" , waddo . id )
) ;
}
for ( i = 0 ; i < state . appliedSets . length ; i ++ )
{
var set = state . appliedSets [ i ] ;
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += localizer . set ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += format (
'<u onmouseout="hidePopup()" onmouseover="showSetProps({1}, {2})">{0}</u></td></tr>' ,
set . caption ,
format ( "'{0}'" , state . id ) ,
format ( "'{0}'" , set . id )
) ;
}
for ( i = 0 ; i < state . appliedStrengthenings . length ; i ++ )
{
var strengthening = state . appliedStrengthenings [ i ] ;
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += localizer . strengthening ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += format (
'<u onmouseout="hidePopup()" onmouseover="showStrengtheningProps({1}, {2})">{0}</u></td></tr>' ,
strengthening . caption ,
format ( "'{0}'" , state . id ) ,
format ( "'{0}'" , strengthening . id )
) ;
}
if ( state . statElix != null )
{
var elix = knownElix [ state . statElix . elixn ] ;
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += localizer . statWeakness ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += format (
'{0} <i>{1} +{2}</i> </td></tr>' ,
elix . caption ,
getItemPropLabel ( elix . makeUp ) ,
state . statElix . v
) ;
if ( 'makeUp2' in elix )
{
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += localizer . statWeakness ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += format (
'{0} <i>{1} +{2}</i> </td></tr>' ,
elix . caption ,
getItemPropLabel ( elix . makeUp2 ) ,
elix . values2 [ 0 ]
) ;
}
}
for ( var damageelixn in state . damageElixes )
{
var damageelix = knownDamageElix [ damageelixn ] ;
var caption = damageelix . caption ;
if ( 'buylink' in damageelix )
{
2023-01-10 18:29:32 +02:00
caption += ' <a title="Купить" target="_blank" class="TLink" href="' + damageelix . buylink + '">>></a>' ;
2022-12-19 22:22:19 +02:00
}
chapterHtml += format (
'<tr><td valign="top">{1}: </td><td valign="top">{0}</td></tr>' ,
caption ,
localizer . statWeakness
) ;
}
for ( var defelixn in state . defElixes )
{
var defelix = knownDefElix [ defelixn ] ;
chapterHtml += format (
2023-01-10 18:29:32 +02:00
'<tr><td valign="top">{3}: </td><td valign="top">{0}: {2} на <i>{1} ед.</i></td></tr>' ,
2022-12-19 22:22:19 +02:00
defelix . caption ,
state . defElixes [ defelixn ] ,
getItemPropLabel ( defelix . makeUp ) ,
localizer . statWeakness
) ;
if ( 'makeUp2' in defelix )
{
chapterHtml += format (
2023-01-10 18:29:32 +02:00
'<tr><td valign="top">{3}: </td><td valign="top">{0}: {2} на <i>{1} ед.</i></td></tr>' ,
2022-12-19 22:22:19 +02:00
defelix . caption ,
getDefElixSecondValue ( defelix , state . defElixes [ defelixn ] ) ,
getItemPropLabel ( defelix . makeUp2 ) ,
localizer . statWeakness
) ;
}
}
if ( state . pet != null )
{
var pet = pets [ state . pet . n ] ;
var pl = pet . levels [ 'L' + state . pet . level ] ;
if ( 'skill' in pl )
{
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += localizer . appliedPetSkill ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += format (
'<u onmouseover="showPetSkillProps()" onmouseout="hidePopup()">{0} [{1}]</u>' ,
pl . skill . caption ,
pl . level
) ;
chapterHtml += '</td></tr>' ;
}
}
if ( state . spellIntel != 0 )
{
var spell = knownApplicableSpells . spellIntel ;
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += localizer . appliedSpell ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += format (
'{0} <i>{1} + {2}</i> </td></tr>' ,
spell . caption ,
getItemPropLabel ( spell . makeUp ) ,
state . spellIntel
) ;
}
if ( state . spellBD != 0 )
{
var spell = knownApplicableSpells . spellBD ;
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += localizer . appliedSpell ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += format (
'{0} <i>{1} + {2}</i> </td></tr>' ,
spell . caption ,
getItemPropLabel ( spell . makeUp ) ,
state . spellBD
) ;
}
if ( state . spellHitpoints != 0 )
{
var sv = state . spellHitpoints . toString ( ) ;
var shp = ( state . spellHitpoints * state . natural . endurance ) . toString ( ) ;
if ( state . spellHitpoints > 0 )
{
sv = '+' + sv ;
shp = '+' + shp ;
}
var spell = ( state . spellHitpoints > 0 ) ? knownApplicableSpells . spellHitpointsUp : knownApplicableSpells . spellHitpointsDown ;
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += localizer . appliedSpell ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += format (
'{0}{2} <i>{1} {3}</i></td></tr>' ,
spell . caption ,
getItemPropLabel ( spell . makeUp ) ,
sv ,
shp
) ;
}
for ( var powerupn in state . spellPowerUps )
{
var spell = getObjectById ( powerupn ) ;
var caption = spell . caption ;
if ( 'buylink' in spell )
{
2023-01-10 18:29:32 +02:00
caption += ' <a title="Купить" target="_blank" class="TLink" href="' + spell . buylink + '">>></a>' ;
2022-12-19 22:22:19 +02:00
}
if ( spell . id in knownPowerUps )
{
var link = '<font size="1"><a onclick="onPowerUp(' + "'" + spell . id + "'" + ')" href="javascript:;">(remove)</a></font>' ;
}
else
{
var link = '<font size="1"><a onclick="onECRPowerUp(' + "'" + spell . id + "'" + ')" href="javascript:;">(remove)</a></font>' ;
}
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += localizer . appliedSpell ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += format (
2023-01-10 18:29:32 +02:00
'{0} на <i>{1} ед.</i>' + link + '</td></tr>' ,
2022-12-19 22:22:19 +02:00
caption ,
state . spellPowerUps [ powerupn ]
) ;
}
if ( chapterHtml != '' )
{
html += chapterHtml + '<tr><td colspan="2"><hr class="dashed" /></td></tr>' ;
}
chapterHtml = '' ;
for ( i = 0 ; i < knownCleanModifiers . length ; i ++ )
{
var mfname = knownCleanModifiers [ i ] ;
if ( mfname == '-' )
{
if ( chapterHtml != '' )
{
html += chapterHtml + '<tr><td colspan="2"><hr class="dashed" /></td></tr>' ;
chapterHtml = '' ;
}
continue ;
}
if ( ! item _props [ mfname ] . view )
{
continue ;
}
var isEditField = false ;
for ( j = 0 ; j < knownNaturalEditors . length ; j ++ )
{
if ( knownNaturalEditors [ j ] != '-' && knownNaturalEditors [ j ] == mfname )
{
isEditField = true ;
break ;
}
}
if ( isEditField )
{
continue ;
}
if ( mfname in state . results )
{
var vt = state . results [ mfname ] ;
var vr = ( mfname in state . required ) ? state . required [ mfname ] : 0 ;
var vn = ( mfname in state . natural ) ? state . natural [ mfname ] : 0 ;
var vm = ( mfname in state . modify ) ? state . modify [ mfname ] : 0 ;
var mvt = vt ;
for ( var staten in dressStates )
{
var astate = dressStates [ staten ] ;
var avn = ( mfname in astate . natural ) ? astate . natural [ mfname ] : 0 ;
var avm = ( mfname in astate . modify ) ? astate . modify [ mfname ] : 0 ;
var avt = avn + avm ;
if ( mvt < avt )
{
mvt = avt ;
}
}
if ( mvt === 0 && vn === 0 && vm === 0 && vr === 0 )
{
continue ;
}
chapterHtml += '<tr><td valign="top">' ;
chapterHtml += getItemPropLabel ( mfname ) ;
chapterHtml += ': </td><td valign="top">' ;
chapterHtml += getItemPropTNMRBHtml ( mfname , vt , vn , vm , mvt , vr , true , 0 ) ;
chapterHtml += '</td></tr>' ;
}
}
if ( chapterHtml != '' )
{
html += chapterHtml + '<tr><td colspan="2"><hr class="dashed" /></td></tr>' ;
}
html += '</table></td>' ;
html += '<td valign="top">' ;
html += '<table border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;">' ;
var wo3 = getObjectByStateSlot ( state , slot _w3 ) ;
var wo10 = getObjectByStateSlot ( state , slot _w10 ) ;
html += getDresserInfoPaneWeaponHtml ( state , slot _w3 ) ;
if ( ( wo10 != null ) && ( wo10 . slot == 'w3' ) )
{
if ( ! areSameObjectsWeared ( state , slot _w3 , slot _w10 ) )
{
html += getDresserInfoPaneWeaponHtml ( state , slot _w10 ) ;
}
else
{
html += '<tr><td colspan="2"><hr size="1" noshade="noshade" /></td></tr>' ;
html += '<tr><td colspan="2" valign="top">' ;
html += localizer . sameWeapon ;
html += '</td></tr>' ;
}
}
for ( var spellid in state . combatSpells )
{
html += getDresserInfoPaneCombatSpellHtml ( state , spellid ) ;
}
for ( var ctrickn in state . combatTricks )
{
html += getDresserInfoPaneCombatTrickHtml ( state . combatTricks [ ctrickn ] ) ;
}
html += '</table></td></tr>' ;
html += '<tr><td colspan="2">' ;
html += '<table width="100%" border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;">' ;
html += '<tr><td colspan="2">' ;
html += '<table class="tabZ" width="100%" border="1" cellspacing="0" cellpadding="2">' ;
html += format (
'<tr><td><b>{0}</b></td><td align="center"><b>{1}</b></td><td align="center"><b>{2}</b></td><td align="center"><b>{3}</b></td><td align="center"><b>{4}</b></td><td align="center"><b>{5}</b></td></tr>' ,
localizer . zoneVariable ,
localizer . zonehead ,
localizer . zonebody ,
localizer . zonewaist ,
localizer . zoneleg ,
localizer . zoneavg
) ;
html += '<tr><td>' + localizer . armor + '</td>' ;
for ( var armorn in knownArmorModifiers )
{
var vobj = { minv : state . results [ armorn + '1' ] , maxv : state . results [ armorn + '2' ] } ;
var mvt = ( vobj . minv + vobj . maxv ) ;
for ( var staten in dressStates )
{
var astate = dressStates [ staten ] ;
var av1 = ( ( armorn + '1' ) in astate . results ) ? astate . results [ armorn + '1' ] : 0 ;
var av2 = ( ( armorn + '2' ) in astate . results ) ? astate . results [ armorn + '2' ] : av1 ;
if ( mvt < ( av1 + av2 ) )
{
mvt = av1 + av2 ;
}
}
html += '<td align="center">' + getItemPropAdvWeaponHtml ( armorn , vobj , mvt , true ) + '</td>' ;
}
html += '</tr>' ;
for ( var mfname in knownZoneModifiers )
{
if ( ! ( mfname in state . results ) )
{
continue ;
}
var vt = state . results [ mfname ] ;
var mvt = { head : 0 , body : 0 , waist : 0 , leg : 0 , avg : 0 } ;
for ( var staten in dressStates )
{
var astate = dressStates [ staten ] ;
var avt = { head : 0 , body : 0 , waist : 0 , leg : 0 , avg : 0 } ;
if ( mfname in astate . results )
{
avt = astate . results [ mfname ] ;
}
if ( mvt . head < avt . head )
{
mvt . head = avt . head ;
}
if ( mvt . body < avt . body )
{
mvt . body = avt . body ;
}
if ( mvt . waist < avt . waist )
{
mvt . waist = avt . waist ;
}
if ( mvt . leg < avt . leg )
{
mvt . leg = avt . leg ;
}
if ( mvt . avg < avt . avg )
{
mvt . avg = avt . avg ;
}
}
if ( mvt . head !== 0 || mvt . body !== 0 || mvt . waist !== 0 || mvt . leg !== 0 )
{
var pc = { head : getMatvikZoneValue1000 ( vt . head ) , body : getMatvikZoneValue1000 ( vt . body ) , waist : getMatvikZoneValue1000 ( vt . waist ) , leg : getMatvikZoneValue1000 ( vt . leg ) , avg : getMatvikZoneValue1000 ( vt . avg ) } ;
for ( var pcn in pc )
{
pc [ pcn ] = Math . floor ( pc [ pcn ] * 100 + 0.5 ) / 100 ;
}
html += format (
'<tr><td>{0}</td><td align="center">{1} ({5}%)</td><td align="center">{2} ({6}%)</td><td align="center">{3} ({7}%)</td><td align="center">{4} ({8}%)</td><td align="center">{9} ({10}%)</td></tr>' ,
getItemPropLabel ( mfname ) ,
getItemPropFormattedValue ( mfname , vt . head , mvt . head ) ,
getItemPropFormattedValue ( mfname , vt . body , mvt . body ) ,
getItemPropFormattedValue ( mfname , vt . waist , mvt . waist ) ,
getItemPropFormattedValue ( mfname , vt . leg , mvt . leg ) ,
pc . head , pc . body , pc . waist , pc . leg ,
getItemPropFormattedValue ( mfname , vt . avg , mvt . avg ) ,
pc . avg
) ;
}
}
html += '</table>' ;
html += '</td></tr>' ;
html += '</table>' ;
html += '</td></tr></table>' ;
html += '</div>' ;
return html ;
}
function onToggleShowImagesOption ( )
{
dressOptions . showImages = ! dressOptions . showImages ;
saveOptions ( ) ;
catlistsources = { } ;
}
function applyAlphaForMenuAndTipOption ( )
{
var newMenuOpacity = dressOptions . useAlphaForMenuAndTip ? defaultMenuOpacity : 100 ;
var newTipOpacity = dressOptions . useAlphaForMenuAndTip ? defaultTipOpacity : 100 ;
var menu = document . getElementById ( menuDivId ) ;
var popup = document . getElementById ( popupDivId ) ;
if ( is . ie )
{
menu . filters [ 'alpha' ] . opacity = newMenuOpacity ;
popup . filters [ 'alpha' ] . opacity = newTipOpacity ;
}
else
{
menu . style . opacity = ( newMenuOpacity / 100 ) ;
menu . style . MozOpacity = ( newMenuOpacity / 100 ) ;
menu . style . KhtmlOpacity = ( newMenuOpacity / 100 ) ;
popup . style . opacity = ( newTipOpacity / 100 ) ;
popup . style . MozOpacity = ( newTipOpacity / 100 ) ;
popup . style . KhtmlOpacity = ( newTipOpacity / 100 ) ;
}
}
function onToggleUseAlphaForMenuAndTipOption ( )
{
dressOptions . useAlphaForMenuAndTip = ! dressOptions . useAlphaForMenuAndTip ;
applyAlphaForMenuAndTipOption ( ) ;
saveOptions ( ) ;
}
function onToggleUseTransitionEffectsOption ( )
{
dressOptions . useTransitionEffects = ! dressOptions . useTransitionEffects ;
saveOptions ( ) ;
}
function onToggleCaptureMouseOption ( )
{
dressOptions . captureMouse = ! dressOptions . captureMouse ;
saveOptions ( ) ;
}
function onTogglePreloadImagesOption ( )
{
dressOptions . preloadImages = ! dressOptions . preloadImages ;
if ( dressOptions . preloadImages )
{
preloadImagesWanted ( ) ;
}
saveOptions ( ) ;
}
function onToggleColorizedDummyOption ( )
{
dressOptions . colorizedDummy = ! dressOptions . colorizedDummy ;
if ( activeState != null )
{
hardUpdateDresserState ( activeState ) ;
}
saveOptions ( ) ;
}
function onOptionsMenu ( )
{
var menuHtml = '<table width="300px" border="0">' ;
if ( dressOptions . showImages )
{
menuHtml += getRowMenuItemHtml ( localizer . optionsHideImages , "onToggleShowImagesOption()" ) ;
}
else
{
menuHtml += getRowMenuItemHtml ( localizer . optionsShowImages , "onToggleShowImagesOption()" ) ;
}
if ( dressOptions . useAlphaForMenuAndTip )
{
menuHtml += getRowMenuItemHtml ( localizer . optionsDontUseAlphaForMenuAndTip , "onToggleUseAlphaForMenuAndTipOption()" ) ;
}
else
{
menuHtml += getRowMenuItemHtml ( localizer . optionsUseAlphaForMenuAndTip , "onToggleUseAlphaForMenuAndTipOption()" ) ;
}
if ( is . ie )
{
if ( dressOptions . useTransitionEffects )
{
menuHtml += getRowMenuItemHtml ( localizer . optionsDontUseTransitionEffects , "onToggleUseTransitionEffectsOption()" ) ;
}
else
{
menuHtml += getRowMenuItemHtml ( localizer . optionsUseTransitionEffects , "onToggleUseTransitionEffectsOption()" ) ;
}
if ( dressOptions . captureMouse )
{
menuHtml += getRowMenuItemHtml ( localizer . optionsDontCaptureMouse , "onToggleCaptureMouseOption()" ) ;
}
else
{
menuHtml += getRowMenuItemHtml ( localizer . optionsCaptureMouse , "onToggleCaptureMouseOption()" ) ;
}
}
if ( dressOptions . preloadImages )
{
menuHtml += getRowMenuItemHtml ( localizer . optionsDontPreloadImages , "onTogglePreloadImagesOption()" ) ;
}
else
{
menuHtml += getRowMenuItemHtml ( localizer . optionsPreloadImages , "onTogglePreloadImagesOption()" ) ;
}
if ( dressOptions . colorizedDummy )
{
menuHtml += getRowMenuItemHtml ( localizer . optionsColorizedDummyOff , "onToggleColorizedDummyOption()" ) ;
}
else
{
menuHtml += getRowMenuItemHtml ( localizer . optionsColorizedDummyOn , "onToggleColorizedDummyOption()" ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , "hideMenu()" ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml ) ;
}
function onApplyConcreteElix ( elixn , v )
{
var state = activeState ;
if ( state == null )
{
return ;
}
if ( elixn == 'spellIntel' )
{
state . spellIntel = v ;
}
else if ( elixn == 'spellHitpointsUp' || elixn == 'spellHitpointsDown' )
{
state . spellHitpoints = v ;
}
else if ( elixn == 'spellBD' )
{
state . spellBD = v ;
}
else if ( elixn in knownDamageElix )
{
if ( v > 0 )
{
state . damageElixes [ elixn ] = v ;
}
else if ( elixn in state . damageElixes )
{
delete state . damageElixes [ elixn ] ;
}
}
else if ( elixn in knownDefElix )
{
for ( var delixn in state . defElixes )
{
if ( areArraysIntersect ( knownDefElix [ delixn ] . places , knownDefElix [ elixn ] . places ) )
{
delete state . defElixes [ delixn ] ;
}
}
if ( v > 0 )
{
state . defElixes [ elixn ] = v ;
}
}
else
{
if ( elixn == null || v <= 0 || knownElix [ elixn ] == null )
{
state . statElix = null ;
}
else
{
var elix = knownElix [ elixn ] || knownApplicableSpells [ elixn ] ;
state . statElix = { elixn : elixn , v : v } ;
}
}
hardUpdateDresserState ( state ) ;
}
function onConcreteElixMenu ( elixn )
{
var state = activeState ;
var elix = knownElix [ elixn ] || knownApplicableSpells [ elixn ] || knownDefElix [ elixn ] ;
if ( state == null || elix == null )
{
return ;
}
var menuHtml = '<table width="240px" border="0"><tr><td>' ;
if ( elix . id . indexOf ( '{0}' ) < 0 )
{
menuHtml += format ( '<img src="{0}{1}.gif" width="15" height="15" alt="{2}" border="0" /> ' , itemImgPath , elix . id , elix . caption ) ;
menuHtml += elix . caption . bold ( ) ;
}
else
{
menuHtml += format ( elix . caption , '' ) . bold ( ) ;
}
menuHtml += '</td></tr>' ;
var captionHead = ( ( 'isSpell' in elix ) && elix . isSpell ) ? localizer . appliedSpell : localizer . statWeakness ;
for ( var i = 0 ; i < elix . values . length ; i ++ )
{
var caption = ( ( 'isSpell' in elix ) && elix . isSpell ) ? localizer . dropSpell : localizer . dropElix ;
var v = elix . values [ i ] ;
var sv = ( v > 0 ) ? ( '+' + v . toString ( ) ) : v . toString ( ) ;
if ( ( elix . check == 1 ) && ( state . natural . level == v ) )
{ sv = sv . bold ( ) ; }
if ( v != 0 )
{
if ( elix . id . indexOf ( '{0}' ) < 0 )
{
caption = captionHead
+ ' '
+ getItemPropLabel ( elix . makeUp )
+ sv ;
}
else
{
if ( elix . check == 1 )
{
caption =
format ( '<img src="{0}{1}.gif" width="15" height="15" alt="{2}" border="0" /> ' , trickImgPath , elix . pic , elix . caption )
+ ' '
+ captionHead
+ ' '
+ elix . caption
+ sv ;
}
else
{
caption =
format ( '<img src="{0}{1}.gif" width="15" height="15" alt="{2}" border="0" /> ' , itemImgPath , format ( elix . id , Math . abs ( v ) ) , ( elix . caption + sv ) )
+ ' '
+ captionHead
+ ' '
+ elix . caption
+ sv
;
}
}
}
menuHtml += getRowMenuItemHtml ( caption , format ( "onApplyConcreteElix('{0}', {1})" , elixn , v ) ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , "hideMenu()" ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml ) ;
if ( ! is . ie && e . stopPropagation )
{
e . stopPropagation ( ) ;
}
if ( is . ie )
{
window . event . cancelBubble = true ;
window . event . returnValue = false ;
}
}
function onSwitchConcreteElix ( elixn )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var putOn = ( elixn in state . damageElixes ) ? 0 : 1 ;
onApplyConcreteElix ( elixn , putOn ) ;
}
function onElixMenu ( )
{
cursorX -= 240 ;
if ( 'onElixMenu' in menuhash )
{
showMenu ( menuhash . onElixMenu ) ;
return ;
}
var state = activeState ;
if ( state == null )
{
return ;
}
var menuHtml = '<table width="640" border="0"><tr><td>' ;
menuHtml += '<table width="240" border="0">' ;
menuHtml += getRowMenuItemHtml ( localizer . noElix , "onApplyConcreteElix(null, 0)" ) ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
for ( var elixn in knownElix )
{
var elix = knownElix [ elixn ] ;
if ( elix == null )
{
menuHtml += getRowMenuSeparatorHtml ( ) ;
continue ;
}
var caption = elix . caption ;
caption = format ( '<img src="{0}{1}.gif" width="15" height="15" alt="{2}" border="0" /> ' , itemImgPath , elix . id , elix . caption ) + caption ;
menuHtml += getRowMenuItemHtml ( caption , format ( "onConcreteElixMenu('{0}')" , elixn ) ) ;
}
menuHtml += '</table></td><td><table width="240" border="0">' ;
for ( var elixn in knownDamageElix )
{
var elix = knownDamageElix [ elixn ] ;
if ( elix == null )
{
menuHtml += getRowMenuSeparatorHtml ( ) ;
continue ;
}
var caption = format ( '<img src="{0}{1}.gif" width="15" height="15" alt="{2}" border="0" /> ' , itemImgPath , elix . id , elix . caption ) + elix . caption ;
var action = format ( "onSwitchConcreteElix('{0}')" , elixn ) ;
menuHtml += getRowMenuItemHtml ( caption , action ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
var a = 0 ;
for ( var elixn in knownDefElix )
{
a ++ ;
if ( a < 9 )
{
var elix = knownDefElix [ elixn ] ;
if ( elix == null )
{
menuHtml += getRowMenuSeparatorHtml ( ) ;
continue ;
}
var caption = elix . caption ;
caption = format ( '<img src="{0}{1}.gif" width="15" height="15" alt="{2}" border="0" /> ' , itemImgPath , elix . id , elix . caption ) + caption ;
menuHtml += getRowMenuItemHtml ( caption , format ( "onConcreteElixMenu('{0}')" , elixn ) ) ;
}
}
menuHtml += '</table></td><td><table width="240" border="0">' ;
var a = 0 ;
for ( var elixn in knownDefElix )
{
a ++ ;
if ( a >= 9 )
{
var elix = knownDefElix [ elixn ] ;
if ( elix == null )
{
menuHtml += getRowMenuSeparatorHtml ( ) ;
continue ;
}
var caption = elix . caption ;
caption = format ( '<img src="{0}{1}.gif" width="15" height="15" alt="{2}" border="0" /> ' , itemImgPath , elix . id , elix . caption ) + caption ;
menuHtml += getRowMenuItemHtml ( caption , format ( "onConcreteElixMenu('{0}')" , elixn ) ) ;
}
}
menuHtml += '</table></td></tr><tr><td colspan="3"><table width="640" border="0">' ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , "hideMenu()" ) ;
menuHtml += '</table></td></tr></table>' ;
menuhash . onElixMenu = menuHtml ;
showMenu ( menuHtml ) ;
}
function onApplyWAdd ( waddn )
{
var state = activeState ;
if ( state == null )
{
return ;
}
state . objects [ slot _wadd . index ] = null ;
state . fitSlots [ slot _wadd . index ] = null ;
state . upgradeSlots [ slot _wadd . index ] = null ;
state . charmSlots [ slot _wadd . index ] = null ;
state . addSlots [ slot _wadd . index ] = null ;
state . runeSlots [ slot _wadd . index ] = null ;
state . objCache [ slot _wadd . index ] = null ;
state . objects [ slot _wadd . index ] = waddn ;
updateDresserState ( ) ;
}
function onWAddMenu ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var menuHtml = '' ;
menuHtml += '<table width="240" border="0">' ;
if ( state . objects [ slot _wadd . index ] != null )
{
menuHtml += getRowMenuItemHtml ( localizer . noWAdd , 'onApplyWAdd(null)' ) ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
}
for ( var waddn in knownAdds )
{
if ( state . objects [ slot _wadd . index ] == waddn )
{
continue ;
}
var wadd = knownAdds [ waddn ] ;
var caption = wadd . caption ;
caption = format ( '<img src="{0}{1}.gif" width="15" height="15" alt="{2}" border="0" /> ' , itemImgPath , wadd . id , wadd . caption ) + caption ;
menuHtml += getRowMenuItemHtml ( caption , format ( "onApplyWAdd('{0}')" , waddn ) ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , "hideMenu()" ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml ) ;
}
function onPowerUp ( spellid )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var maxv = 33 ;
var del = false ;
var spell = knownPowerUps [ spellid ] ;
if ( spell != null && ! spell . damageup )
{
maxv = 125 ;
}
var v = maxv ;
if ( spellid in state . spellPowerUps )
{
v = state . spellPowerUps [ spellid ] ;
}
v = spell [ 'value' ] ;
v = parseInt ( v ) ;
if ( spellid in state . spellPowerUps )
{
v = 0 ;
}
if ( isNaN ( v ) )
{
return ;
}
if ( v < 0 )
{
v = 0 ;
}
if ( v > maxv )
{
v = maxv ;
}
if ( v > 0 )
{
state . spellPowerUps [ spellid ] = v ;
}
else
{
delete state . spellPowerUps [ spellid ] ;
}
updateDresserStateWanted ( ) ;
}
function onECRPowerUp ( spellid )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var v = 100 ;
if ( spellid in state . spellPowerUps )
{
delete state . spellPowerUps [ spellid ] ;
}
else
{
state . spellPowerUps [ spellid ] = knownECRPowerUps [ spellid ] . v ;
}
updateDresserStateWanted ( ) ;
}
function onSpellMenu ( )
{
cursorX -= 100 ;
if ( 'onSpellMenu' in menuhash )
{
showMenu ( menuhash . onSpellMenu ) ;
return ;
}
var state = activeState ;
if ( state == null )
{
return ;
}
var menuHtml = '<table width="480px" border="0">' ;
menuHtml += '<tr><td valign="top"><table width="240px" border="0">' ;
for ( var spelln in knownApplicableSpells )
{
var spell = knownApplicableSpells [ spelln ] ;
if ( spell == null )
{
menuHtml += getRowMenuSeparatorHtml ( ) ;
continue ;
}
var spellHtml = spell . caption ;
if ( spell . check == 1 )
{
spellHtml = format ( '<img src="{0}{1}.gif" width="15" height="15" alt="{2}" border="0" /> {2}' , trickImgPath , spell . id , spell . caption ) ;
} else if ( spell . id . indexOf ( '(0}' ) < 0 )
{
spellHtml = format ( '<img src="{0}{1}.gif" width="15" height="15" alt="{2}" border="0" /> {2}' , itemImgPath , format ( spell . id , 5 ) , spell . caption ) ;
}
menuHtml += getRowMenuItemHtml ( spellHtml , format ( "onConcreteElixMenu('{0}')" , spelln ) ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
for ( var powerupn in knownPowerUps )
{
var o = getObjectById ( powerupn ) ;
var caption = format ( '<img src="{0}{1}.gif" width="15" height="15" alt="{2}" border="0" /> {3}' , itemImgPath , o . id , o . caption , htmlstring ( o . caption ) ) ;
menuHtml += getRowMenuItemHtml ( caption , format ( "onPowerUp('{0}')" , powerupn ) ) ;
}
menuHtml += '</table></td><td valign="top"><table width="240px" border="0">' ;
for ( var powerupn in knownECRPowerUps )
{
var o = getObjectById ( powerupn ) ;
2023-01-10 18:29:32 +02:00
var caption = format ( '<img src="{0}{1}.gif" width="15" height="15" alt="{2}" border="0" /> Наложить {3}' , itemImgPath , o . id , o . caption , htmlstring ( o . caption ) ) ;
2022-12-19 22:22:19 +02:00
menuHtml += getRowMenuItemHtml ( caption , format ( "onECRPowerUp('{0}')" , powerupn ) ) ;
}
menuHtml += '</table></td></tr><tr><td colspan="2" valign="top"><table width="480px" border="0">' ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , "hideMenu()" ) ;
menuHtml += '</table></td></tr></table>' ;
menuhash . onSpellMenu = menuHtml ;
showMenu ( menuHtml ) ;
}
function summonPet ( petn , level )
{
var state = activeState ;
if ( state == null )
{
return ;
}
if ( petn == null )
{
state . pet = null ;
hardUpdateDresserState ( state ) ;
return ;
}
var pet = pets [ petn ] ;
if ( level <= state . natural . level )
{
state . pet = { n : petn , name : pet . caption , level : level } ;
}
else
{
state . pet = { n : petn , name : pet . caption , level : state . natural . level } ;
}
hardUpdateDresserState ( state ) ;
}
function onConcretePetMenu ( petn )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var pet = pets [ petn ] ;
var menuHtml = '<table width="240px" border="0">' ;
menuHtml += format ( '<img src="{2}{1}.gif" width="40" height="25" border="0" alt="{0}" />{0}' , pet . caption , pet . summon . name , itemImgPath ) ;
if ( state . pet != null )
{
menuHtml += getRowMenuItemHtml ( localizer . dropPet , 'summonPet()' ) ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
}
// see here
for ( var leveln in pet . levels )
{
var level = pet . levels [ leveln ] ;
if ( level . level <= state . natural . level )
{
2023-01-10 18:29:32 +02:00
var text = format ( '[{0}] Уровень' , level . level ) ;
2022-12-19 22:22:19 +02:00
menuHtml += getRowMenuItemHtml ( text , format ( "summonPet('{0}', {1})" , petn , level . level ) ) ;
}
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , "hideMenu()" ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml ) ;
}
function onPetMenu ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var menuHtml = '<table width="240px" border="0">' ;
if ( state . pet != null )
{
menuHtml += getRowMenuItemHtml ( localizer . dropPet , 'summonPet()' ) ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
}
for ( var petn in pets )
{
var pet = pets [ petn ] ;
var petHtml = format ( '<img src="{2}{1}.gif" width="40" height="25" border="0" alt="{0}" />{0}' , pet . caption , pet . summon . name , itemImgPath ) ;
menuHtml += getRowMenuItemHtml ( petHtml , format ( "onConcretePetMenu('{0}')" , petn ) ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , "hideMenu()" ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml ) ;
}
function loadFriendLinks ( )
{
var qs = window . location . search ;
if ( qs == null || qs . length < 4 )
{
return ;
}
var params = qs . match ( "[^\?=&]*=[^\?=&]*" ) ;
for ( var i = 0 ; i < params . length ; i ++ )
{
var paramName = params [ i ] ;
var paramValue = '' ;
if ( paramName . indexOf ( '=' ) >= 0 )
{
var sp = paramName . split ( '=' ) ;
paramName = sp [ 0 ] ;
paramValue = unescape ( sp [ 1 ] ) ;
}
if ( paramName == 'data' )
{
var newState = deserializeObject ( paramValue ) ;
if ( newState != null )
{
applyDeserializedState ( null , newState ) ;
}
}
if ( paramName == 'raw' )
{
var newState = createNewDresserState ( ) ;
updateTabs ( false ) ;
recalcDresserState ( newState ) ;
updateCabs ( ) ;
changeCab ( newState . id ) ;
someStatesLoaded = true ;
handleCharInfo ( newState , paramValue ) ;
}
}
}
function onFriendLink ( stateid )
{
var state = dressStates [ stateid ] ;
if ( state == null )
{
return ;
}
var menuHtml = '<table border="0"><tr><td>' ;
var url = absoluteDressRoomUrl
url += '?data=' ;
url += escape ( serializeObject ( getSerializableState ( state ) ) ) ;
menuHtml += format ( localizer . friendLinkHint , clanImgPath ) ;
menuHtml += '<br /><textarea id="friendLink" class="inpText" cols="50" rows="8" wrap="VIRTUAL" readonly="true">' ;
menuHtml += url ;
menuHtml += '</textarea></td></tr>' ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , "hideMenu()" ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml , false ) ;
var telt = document . getElementById ( 'friendLink' ) ;
if ( telt != null )
{
telt . focus ( ) ;
telt . select ( ) ;
}
}
function updateEnduranceLimit ( level )
{
var end = 3 ;
for ( var i = 0 ; i <= level ; i ++ )
{
var leveln = 'L' + i ;
if ( ! ( leveln in expd ) )
{
break ;
}
var ld = expd [ leveln ] ;
if ( ! ( 'U0' in ld . ups ) )
{
break ;
}
end += ld . ups . U0 . aendurance ;
}
knownStatLimits . endurance = end ;
}
function onFitStats ( stateid )
{
var state = dressStates [ stateid ] ;
if ( state == null )
{
return ;
}
updateEnduranceLimit ( state . natural . level ) ;
for ( var name in state . required )
{
var newnv = state . required [ name ] ;
if ( name in state . modify )
{
newnv -= state . modify [ name ] ;
}
if ( name in state . battlemf )
{
newnv += state . battlemf [ name ] ;
}
if ( newnv < 0 )
{
newnv = 0 ;
}
if ( name in knownStatLimits )
{
if ( newnv < knownStatLimits [ name ] )
{
newnv = knownStatLimits [ name ] ;
}
}
if ( name . indexOf ( 'skill' ) > 0 )
{
if ( name . indexOf ( 'magicskill' ) > 0 )
{
if ( newnv > 10 )
{
newnv = 10 ;
}
}
else
{
if ( newnv > 5 )
{
newnv = 5 ;
}
}
}
if ( ! ( name in state . natural ) || ( state . natural [ name ] < newnv ) )
{
state . natural [ name ] = newnv ;
}
}
updateDresserState ( state ) ;
}
function handleCharInfo ( state , text )
{
var stateid = state . id ;
var objects = [ ] ;
var doneState = { } ;
// Combats VIP bug wrapping
text = replacestr ( text , shortVip , shortVip + "\n" ) ;
var pet _type = '' ;
var pet _level = 0 ;
var pet _name = '' ;
var align = '0' ;
var clan = '' ;
var sex = 0 ;
var img = 0 ;
var zodiac = '' ;
var propDefs = text . split ( "\n" ) ;
var rstats = { } ;
for ( var propi = 0 ; propi < propDefs . length ; propi ++ )
{
var propDef = propDefs [ propi ] ;
var propName = propDef ;
var propVal = '' ;
var eqi = propDef . indexOf ( '=' ) ;
if ( eqi > 0 )
{
propName = propDef . substr ( 0 , eqi ) ;
propVal = propDef . substr ( eqi + 1 ) ;
}
if ( propName in shortInfoMap )
{
doneState [ shortInfoMap [ propName ] ] = parseInt ( propVal ) ;
continue ;
}
if ( propName in shortInfoMap2 )
{
rstats [ shortInfoMap2 [ propName ] ] = parseInt ( propVal ) ;
continue ;
}
if ( propName == 'login' )
{
nick = propVal ;
continue ;
}
if ( propName == 'align' )
{
align = propVal ;
continue ;
}
if ( propName == 'klan' )
{
clan = propVal ;
continue ;
}
if ( propName == 'sex' )
{
sex = parseInt ( propVal ) ;
continue ;
}
if ( propName == 'img' )
{
img = propVal ;
continue ;
}
if ( propName == 'zodiac' )
{
zodiac = propVal ;
continue ;
}
if ( propName == 'objects' )
{
objects = propVal . split ( ',' ) ;
continue ;
}
if ( propName == 'pet_type' )
{
pet _type = propVal ;
continue ;
}
if ( propName == 'pet_level' )
{
pet _level = propVal ;
continue ;
}
if ( propName == 'pet_name' )
{
pet _name = propVal ;
continue ;
}
if ( propName == 'found' )
{
if ( parseInt ( propVal ) === 0 )
{
2023-01-10 18:29:32 +02:00
alert ( 'Персонаж с такими ником не найден' ) ;
2022-12-19 22:22:19 +02:00
return ;
}
}
}
var state = createNewDresserState ( state . id ) ;
state . name = nick ;
state . align = align ;
state . clan = clan ;
state . sign = zodiac ;
state . sex = sex ;
state . image = img ;
if ( ( pet _type != '' ) && ( pet _type in pets ) )
{
var pet = pets [ pet _type ] ;
if ( ( 'L' + pet _level ) in pet . levels )
{
state . pet = { n : pet _type , name : pet _name , level : pet _level } ;
}
}
if ( 'level' in doneState )
{
state . natural . level = doneState . level ;
}
for ( var oi = 0 ; oi < objects . length ; oi ++ )
{
var oname = objects [ oi ] ;
var oval = '' ;
var eqi = oname . indexOf ( '=' ) ;
if ( eqi >= 0 )
{
oval = oname . substr ( eqi + 1 ) ;
oname = oname . substr ( 0 , eqi ) ;
}
if ( oname == '' )
{
continue ;
}
oval = oval . split ( '\\n' ) ;
applyAssortedObject ( state , oname , oval ) ;
}
recalcDresserState ( state ) ;
for ( var stat in doneState )
{
state . natural [ stat ] = doneState [ stat ] - state . modify [ stat ] ;
if ( stat in state . battlemf )
{
state . natural [ stat ] += state . battlemf [ stat ] ;
}
}
for ( var stat in rstats )
{
state . natural [ stat ] = rstats [ stat ] ;
}
activeState = state ;
hardUpdateDresserState ( state ) ;
// changeCab(state.id);
}
function onDressFromCombatsNick ( stateid )
{
var state = dressStates [ stateid ] ;
if ( state == null )
{
return ;
}
var nick = document . getElementById ( 'dfcnick' ) . value ;
var text = '' ;
if ( dressOptions . benderOmskMode )
{
window . navigate ( format ( benderOmsk . getInfoLink , nick ) ) ;
return ;
}
if ( dressOptions . hasGetDSCharInfo )
{
var dstatestr = window . external . getDSCharInfo ( nick ) ;
if ( dstatestr == null )
{
return ;
}
applyDeserializedState ( stateid , deserializeObject ( dstatestr ) ) ;
return ;
}
if ( dressOptions . hasGetCharInfo )
{
text = window . external . getCharInfo ( nick ) ;
if ( text == null )
{
text = 'found=0' ;
}
}
else
{
//nick = urlesc(nick);
var url = format ( getCharacterInfoUrlFormat , nick ) ;
if ( ! loadXMLDoc ( url ) )
{
return ;
}
text = req . responseText ;
}
handleCharInfo ( state , text ) ;
}
function onDressFromCombatsMenu ( stateid )
{
var state = dressStates [ stateid ] ;
if ( state == null )
{
return ;
}
2023-01-10 18:29:32 +02:00
var menuHtml = '<table width="260px" border="0"><tr><td><img src="' + clanImgPath + 'DarkClan.gif" width="24" height="15" border="0" align="right" /><b>Загрузка манекена с персонажа БК</b><form name="dfc" method="GET" onreset="hideMenu()" onsubmit="return false"><center>' ;
2022-12-19 22:22:19 +02:00
menuHtml += localizer . FCPlayerNick + ': <input id="dfcnick" name="dfcnick" type="text" value="' ;
menuHtml += state . name ;
menuHtml += '" class="ABText80" />' ;
menuHtml += '<hr class="dashed" />' ;
menuHtml += '<input class="inpButton" type="submit" name="Submit" value="' + localizer . FCPlayerLoadIn + '" onclick="onDressFromCombatsNick(' + format ( "'{0}'" , state . id ) + '); hideMenu(); return false" /> <input name="cancel" class="inpButton" type="reset" id="cancel" value="' + localizer . cancel + '" onclick="hideMenu()" />' ;
menuHtml += '<hr class="dashed" />' ;
menuHtml += localizer . informAboutCharLoading ;
menuHtml += '</center></form></td></tr></table>' ;
showMenu ( menuHtml , false ) ;
document . getElementById ( 'dfcnick' ) . focus ( ) ;
}
function onCopyCab ( stateid )
{
var state = dressStates [ stateid ] ;
if ( state == null )
{
return ;
}
var serstate = getSerializableState ( state ) ;
applyDeserializedState ( null , serstate ) ;
}
function getDresserCommands ( state )
{
var html = '<table cellpadding="0" cellspacing="0" border="0"><tr>' ;
//html += '<img src="http://upload.wikimedia.org/wikipedia/commons/e/e5/Crystal_Clear_app_x.png" width="32" height="32">'
html += getCell2MenuItemHtml ( localizer . clearAllStats , format ( "onClearAllStats('{0}')" , state . id ) ) ;
html += getCell2MenuSeparatorHtml ( ) ;
html += getCell2MenuItemHtml ( localizer . fitStats , format ( "onFitStats('{0}')" , state . id ) ) ;
html += getCell2MenuSeparatorHtml ( ) ;
html += getCell2MenuItemHtml ( localizer . elixMenu , 'onElixMenu()' ) ;
if ( ! dressOptions . newCapEdition )
{
html += getCell2MenuSeparatorHtml ( ) ;
html += getCell2MenuItemHtml ( localizer . spellMenu , 'onSpellMenu()' ) ;
html += getCell2MenuSeparatorHtml ( ) ;
html += getCell2MenuItemHtml ( localizer . petMenu , 'onPetMenu()' ) ;
}
html += getCell2MenuSeparatorHtml ( ) ;
html += getCell2MenuItemHtml ( localizer . optionsMenu , "onOptionsMenu()" ) ;
html += '</tr></table><table cellpadding="0" cellspacing="0" border="0"><tr>' ;
html += getCell2MenuItemHtml ( localizer . dropAll , 'onDropAll()' ) ;
html += getCell2MenuSeparatorHtml ( ) ;
html += getCell2MenuItemHtml ( localizer . saveSet , format ( "onSaveSet('{0}')" , state . id ) ) ;
html += getCell2MenuSeparatorHtml ( ) ;
html += getCell2MenuItemHtml ( localizer . loadSet , format ( "onLoadSet('{0}')" , state . id ) ) ;
html += getCell2MenuSeparatorHtml ( ) ;
html += getCell2MenuItemHtml ( localizer . dressCombatsSet , 'onDressAnyCombatsSet()' ) ;
html += getCell2MenuSeparatorHtml ( ) ;
var s = localizer . dressFromCombats ;
s = '<img unselectable="on" src="' + hereItemImgPath + 'dressFromCombats.gif" width="17" height="15" border="0" /><font unselectable="on" color="#003300" title="' + localizer . dressFromCombatsHint + '">' + s + '</font>' ;
html += getCell2MenuItemHtml ( s , format ( "onDressFromCombatsMenu('{0}')" , state . id ) ) ;
html += '</tr></table><table cellpadding="0" cellspacing="0" border="0"><tr>' ;
html += getCell2MenuItemHtml ( '<img unselectable="on" src="' + hereItemImgPath + 'dressFriendLink.gif" width="16" height="15" border="0" /><font unselectable="on" color="#330033">' + localizer . friendLink + '</font>' , format ( "onFriendLink('{0}')" , state . id ) ) ;
html += getCell2MenuSeparatorHtml ( ) ;
html += getCell2MenuItemHtml ( localizer . copyCab , format ( "onCopyCab('{0}')" , state . id ) ) ;
html += getCell2MenuSeparatorHtml ( ) ;
html += getCell2MenuItemHtml ( localizer . waddMenu , 'onWAddMenu()' ) ;
html += getCell2MenuSeparatorHtml ( ) ;
html += getCell2MenuItemHtml ( '<span title="' + localizer . doCleanHint + '">' + localizer . doClean + '</span>' , "doClean()" ) ;
html += getCell2MenuSeparatorHtml ( ) ;
html += getCell2MenuItemHtml ( '<img unselectable="on" src="' + hereItemImgPath + 'dressHelp.gif" width="17" height="15" border="0" /><font unselectable="on" color="#000033" title="' + localizer . helpHint + '">' + localizer . help + '</font>' , "showHelp()" ) ;
html += '</table>' ;
return html ;
}
function getDresserNaturalEditorInfo ( state , name )
{
var html = '' ;
if ( name in state . results )
{
var vt = state . results [ name ] ;
var vr = ( name in state . required ) ? state . required [ name ] : 0 ;
var vn = ( name in state . natural ) ? state . natural [ name ] : 0 ;
var vm = ( name in state . modify ) ? state . modify [ name ] : 0 ;
var vb = ( name in state . battlemf ) ? state . battlemf [ name ] : 0 ;
vt -= vb ;
vm -= vb ;
var mvt = vt ;
for ( var staten in dressStates )
{
var astate = dressStates [ staten ] ;
var avn = ( name in astate . natural ) ? astate . natural [ name ] : 0 ;
var avm = ( name in astate . modify ) ? astate . modify [ name ] : 0 ;
var avt = ( name in astate . results ) ? astate . results [ name ] : 0 ;
if ( name in astate . battlemf )
{
avt -= astate . battlemf [ name ] ;
avm -= astate . battlemf [ name ] ;
}
if ( mvt < avt )
{
mvt = avt ;
}
}
html += getItemPropTNMRBHtml ( name , vt , vn , vm , mvt , vr , true , vb ) ;
}
return html ;
}
function getLevelUpInfo ( state )
{
if ( ( 'L' + state . natural . level ) in expd )
{
var ldata = expd [ 'L' + state . natural . level ] ;
if ( ! ( 'ups' in ldata ) || ! ( ( 'U' + state . natural . levelup ) in ldata . ups ) )
{
if ( 'count' in ldata )
{
state . natural . levelup = ldata . count - 1 ;
}
else
{
state . natural . levelup = 0 ;
}
}
if ( ! ( 'ups' in ldata ) || ! ( 'U0' in ldata . ups ) )
{
return null ;
}
return ldata . ups [ 'U' + state . natural . levelup ] ;
}
return null ;
}
function getEditHeaderInfo ( state )
{
var html = '' ;
var totalnskills = 0 ;
for ( skilln in state . natural )
{
if ( skilln . indexOf ( 'skill' ) > 0 )
{
totalnskills += state . natural [ skilln ] ;
}
}
if ( state . pet != null )
{
if ( state . pet . level > state . natural . level )
{
html += '<div class="hintview">' ;
html += format ( localizer . badPetLevel , state . natural . level , state . pet . level ) ;
html += '</div>' ;
}
}
var availskills = state . natural . level + state . natural . pskil + 1 ;
if ( availskills < totalnskills )
{
var pskilstr = '' ;
if ( state . natural . pskil > 0 )
{
pskilstr = format ( localizer . badSkillRewardedCount ) ;
}
html += '<div class="hintview">' ;
html += format ( localizer . badSkillCount , state . natural . level , pskilstr , availskills , totalnskills ) ;
html += '</div>' ;
}
if ( state . natural . pskil > 5 )
{
html += '<div class="hintview">' ;
html += format ( localizer . badRewardedSkillCount , state . natural . pskil ) ;
html += '</div>' ;
}
if ( state . natural . pstat > 25 )
{
html += '<div class="hintview">' ;
html += format ( localizer . badRewardedStatCount , state . natural . pstat ) ;
html += '</div>' ;
}
var upd = getLevelUpInfo ( state ) ;
if ( upd && upd . sstats && state . natural . totalstats )
{
html += '<div class="hintview">' ;
var availstats = upd . sstats + state . natural . pstat ;
var s = availstats . toString ( ) ;
if ( state . natural . totalstats != availstats )
{
s = s . bold ( ) ;
}
var pstatstr = '' ;
if ( state . natural . pstat > 0 )
{
pstatstr = format ( localizer . rewardedStatsCount , state . natural . pstat ) ;
}
html += format ( localizer . nativeStatsCount , state . natural . level , upd . id , pstatstr , s ) ;
if ( state . natural . totalstats != availstats )
{
s = state . natural . totalstats . toString ( ) ;
if ( state . natural . totalstats > availstats )
{
s = s . fontcolor ( 'red' ) ;
}
html += format ( localizer . neqStatsCount , s ) ;
if ( state . natural . totalstats < availstats )
{
html += format ( localizer . gtStatsCount , ( availstats - state . natural . totalstats ) ) ;
}
else
{
html += format ( localizer . ltStatsCount , ( state . natural . totalstats - availstats ) ) ;
}
}
else
{
html += localizer . eqStatsCount ;
}
html += '</div>' ;
}
return html ;
}
function getDresserNaturalEditors ( state )
{
var html = '<table class="tcontent" width="100%" cellspacing="0" border="0" style="padding: 2px 4px 0px 0px">' ;
html += format ( '<tr><td id="{1}{0}" colspan="3">{2}</td></tr>' , state . id , 'editheader' , getEditHeaderInfo ( state ) ) ;
for ( var i = 0 ; i < knownNaturalEditors . length ; i ++ )
{
var name = knownNaturalEditors [ i ] ;
if ( name == '-' )
{
html += '<tr><td colspan="3"><hr class="dashed" /></td></tr>' ;
continue ;
}
if ( ! item _props [ name ] . view )
{
continue ;
}
html += '<tr><td align="right" valign="top">' ;
html += format (
'<input name="edit{0}" type="text" id="edit{0}" class="ABTextR" value="{1}" size="3" maxlength="3" onblur="onChangeEdit({2})" />' ,
state . id + name ,
state . natural [ name ] ? state . natural [ name ] : 0 ,
format ( "this, '{0}', '{1}'" , state . id , name )
) ;
html += '</td><td align="left" valign="top">' ;
html += getItemPropLabel ( name ) ;
html += format ( '</td><td id="editi{0}{1}" valign="top">' , state . id , name ) ;
html += getDresserNaturalEditorInfo ( state , name ) ;
html += '</td>' ;
html += '<td>' ;
var fiop = 'edit' + state . id + name ;
2023-01-10 18:29:32 +02:00
html += '<a onclick="adm(\'' + fiop + '\')" href="javascript:;"><img src="http://img.combats.com/i/minus.gif" alt="уменшить" border=0> </a></td>' ;
html += '<td><a onclick="adp(\'' + fiop + '\')" href="javascript:;"><img src="http://img.combats.com/i/plus.gif" alt="увеличить" border=0> </a>' ;
2022-12-19 22:22:19 +02:00
html += '</td>' ;
html += '</tr>' ;
}
html += '</table>' ;
return html ;
}
function adp ( formt )
{
document . getElementById ( formt ) . focus ( ) ;
elem = document . getElementById ( formt ) ;
elem . value ++ ;
document . getElementById ( formt ) . blur ( ) ;
}
function adm ( formt )
{
document . getElementById ( formt ) . focus ( ) ;
elem = document . getElementById ( formt ) ;
elem . value -- ;
document . getElementById ( formt ) . blur ( ) ;
}
function updateDresserNaturalEditors ( state )
{
var eheader = document . getElementById ( 'editheader' + state . id ) ;
if ( eheader == null )
{
document . getElementById ( 'editpane' + state . id ) . innerHTML = getDresserNaturalEditors ( state ) ;
return ;
}
eheader . innerHTML = getEditHeaderInfo ( state ) ;
for ( var i = 0 ; i < knownNaturalEditors . length ; i ++ )
{
var name = knownNaturalEditors [ i ] ;
if ( name == '-' )
{
continue ;
}
var eltname = format ( 'edit{0}{1}' , state . id , name ) ;
var elt = document . getElementById ( eltname ) ;
if ( elt == null )
{
document . getElementById ( 'editpane' + state . id ) . innerHTML = getDresserNaturalEditors ( state ) ;
return ;
}
var v = '0' ;
if ( name in state . natural )
{
v = state . natural [ name ] . toString ( ) ;
}
elt . value = v ;
var infname = format ( 'editi{0}{1}' , state . id , name ) ;
var inf = document . getElementById ( infname ) ;
if ( inf == null )
{
document . getElementById ( 'editpane' + state . id ) . innerHTML = getDresserNaturalEditors ( state ) ;
return ;
}
inf . innerHTML = getDresserNaturalEditorInfo ( state , name ) ;
}
}
function onChangeEdit ( field , stateId , propName )
{
var state = dressStates [ stateId ] ;
if ( state == null )
{
return ;
}
var v = parseInt ( field . value ) ;
if ( isNaN ( v ) || v < 0 )
{
updateDresserState ( state ) ;
return ;
}
if ( propName . lastIndexOf ( 'skill' ) > 0 )
{
if ( propName . lastIndexOf ( 'magicskill' ) > 0 )
{
if ( v > 10 )
{
v = 10 ;
}
}
else
{
if ( v > 5 )
{
v = 5 ;
}
}
}
if ( propName == 'levelup' )
{
if ( ( 'L' + state . natural . level ) in expd )
{
var ldata = expd [ 'L' + state . natural . level ] ;
if ( ( 'ups' in ldata ) && ( ( 'U' + v ) in ldata . ups ) )
{
var udata = ldata . ups [ 'U' + v ] ;
}
else
{
if ( 'count' in ldata )
{
v = ldata . count - 1 ;
}
else
{
v = 0 ;
}
}
}
}
state . natural [ propName ] = v ;
updateEnduranceLimit ( state . natural . level ) ;
for ( propName in knownStatLimits )
{
if ( ! ( propName in state . natural ) || ( state . natural [ propName ] < knownStatLimits [ propName ] ) )
{
state . natural [ propName ] = knownStatLimits [ propName ] ;
}
}
updateDresserState ( state ) ;
}
function getDresserShortcuts ( state )
{
var html = '' ;
var btn = '<img src="' + blankImgPath + '" border="0" width="80" height="51" />' ;
html += '<a class="elixmenu" href="#" onclick="hideMenu(); onElixMenu(); return false" title="' + localizer . elixMenu + '">' + btn + '</a>' ;
if ( ! dressOptions . newCapEdition )
{
html += '<a class="spellmenu" href="#" onclick="hideMenu(); onSpellMenu(); return false" title="' + localizer . spellMenu + '">' + btn + '</a>' ;
html += '<a class="petmenu" href="#" onclick="hideMenu(); onPetMenu(); return false" title="' + localizer . petMenu2 + '">' + btn + '</a>' ;
}
html += '<hr class="dashed" />' ;
html += '<a class="dressset" href="#" onclick="hideMenu(); onDressAnyCombatsSet(); return false" title="' + localizer . dressCombatsSet + '">' + btn + '</a>' ;
html += '<a class="dropitems" href="#" onclick="hideMenu(); onDropAll(); return false" title="' + localizer . dropAll + '">' + btn + '</a>' ;
html += btn ;
return html ;
}
function getDresserInnerHtml ( state , placeholdersOnly )
{
var fmt = '<table class="tcontent" width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td valign="top" colspan="2">{3}</td></tr><tr><td valign="top" width="400"><table border="0" cellspacing="0" cellpadding="0" width="400"><tr><td width="320" valign="top">{0}</td><td width="80" valign="bottom">{5}</td></tr><tr><td colspan="2" valign="top"><div id="editpane{2}">{4}</div></td></tr></table></td><td valign="top"><div id="infopane{2}">{1}</div></td></tr></table>' ;
return format (
fmt ,
getPersImageHtml ( state ) ,
getDresserInfoPaneHtml ( state ) ,
state . id ,
getDresserCommands ( state ) ,
getDresserNaturalEditors ( state ) ,
getDresserShortcuts ( state )
) ;
}
function getCellHtml ( s , odd )
{
var r = '' ;
r += '<td ' ;
if ( odd )
{
r += 'class="infolighttd" ' ;
}
r += '>' + s + '</td>' ;
return r ;
}
function getHeaderHtml ( separator )
{
var cattr = separator ? ' class="infoseparator"' : '' ;
var html = '<tr><th colspan="2"' + cattr + '>' ;
if ( separator )
{
html += '<hr class="dashed" />' ;
}
else
{
html += ' ' ;
}
html += '</th>' ;
var stateCount = 0 ;
var i = 1 ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
var n = ' ' + localizer . upperCab + ' ' + i + ' ' ;
if ( state . name != '' )
{
n += '<br />' + htmlstring ( state . name ) ;
}
html += '<th' + cattr + '><nobr>' + n + '</nobr></th>' ;
stateCount ++ ;
i ++ ;
}
html += '</tr>' ;
return html ;
}
function getLeftCellHtml ( s , odd , s2 )
{
var c = 'infoleftth' ;
var r = '<tr><th class="' + c + '" ' ;
if ( s2 == null )
{
r += 'colspan="2">' + s ;
}
else
{
r += '>' + s + '</th><th class="' + c + '">' + s2 ;
}
r += '</th>' ;
return r ;
}
function getSummaryInnerHtml ( )
{
var html = '<table class="tcontent" width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center" valign="top">' ;
html += '<p>' + localizer . summaryTableDesc + '</p>' ;
html += '<table class="info" border="0" cellspacing="0" cellpadding="0">' ;
var stateCount = 0 ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
recalcDresserState ( state ) ;
stateCount ++ ;
}
html += getHeaderHtml ( false ) ;
var firstChapter = true ;
var chapterHtml = '' ;
var odd = false ;
for ( var mfi in knownCleanModifiers )
{
var mf = knownCleanModifiers [ mfi ] ;
if ( mf == '-' )
{
if ( chapterHtml != '' )
{
html += chapterHtml ;
html += getHeaderHtml ( true ) ;
chapterHtml = '' ;
odd = false ;
}
continue ;
}
if ( ! item _props [ mf ] . view )
{
continue ;
}
var hasValues = false ;
var maxValue = Number . MIN _VALUE ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
hasValues |= ( state . results [ mf ] != 0 ) ;
if ( maxValue < state . results [ mf ] )
{
maxValue = state . results [ mf ] ;
}
}
if ( ! hasValues )
{
continue ;
}
chapterHtml += getLeftCellHtml ( getItemPropLabel ( mf ) , odd ) ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
var v = state . results [ mf ] ;
v = getItemPropFormattedValue ( mf , v , maxValue ) ;
chapterHtml += getCellHtml ( v , odd ) ;
}
chapterHtml += '</tr>' ;
odd = ! odd ;
}
if ( chapterHtml != '' )
{
html += chapterHtml ;
html += getHeaderHtml ( true ) ;
}
chapterHtml = '' ;
odd = false ;
for ( var mf in knownAdvWeaponModifiers )
{
if ( ! item _props [ mf ] . view )
{
continue ;
}
var hasValues = false ;
var maxValue = Number . MIN _VALUE ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
if ( mf in state . w3props )
{
var vobj = state . w3props [ mf ] ;
if ( vobj != null )
{
var vsum = vobj . minv + vobj . maxv ;
hasValues = true ;
if ( maxValue < vsum )
{
maxValue = vsum ;
}
}
}
if ( mf in state . w10props )
{
var vobj = state . w10props [ mf ] ;
if ( vobj != null )
{
var vsum = vobj . minv + vobj . maxv ;
hasValues = true ;
if ( maxValue < vsum )
{
maxValue = vsum ;
}
}
}
}
if ( ! hasValues )
{
continue ;
}
chapterHtml += getLeftCellHtml ( getItemPropLabel ( mf ) , odd ) ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
var vhtml = '' ;
var v = '-' ;
if ( mf in state . w3props )
{
v = getItemPropAdvWeaponHtml ( mf , state . w3props [ mf ] , maxValue , true ) ;
}
vhtml += v ;
if ( mf in state . w10props )
{
v = getItemPropAdvWeaponHtml ( mf , state . w10props [ mf ] , maxValue , true ) ;
vhtml += '/' + v ;
}
chapterHtml += getCellHtml ( vhtml , odd ) ;
}
chapterHtml += '</tr>' ;
odd = ! odd ;
}
if ( chapterHtml != '' )
{
html += chapterHtml ;
html += getHeaderHtml ( true ) ;
chapterHtml = '' ;
odd = false ;
}
for ( var mfi in knownWeaponModifiers )
{
var mf = knownWeaponModifiers [ mfi ] ;
if ( mf == '-' )
{
if ( chapterHtml != '' )
{
html += chapterHtml ;
html += getHeaderHtml ( true ) ;
chapterHtml = '' ;
odd = false ;
}
continue ;
}
if ( ! item _props [ mf ] . view )
{
continue ;
}
var hasValues = false ;
var maxValue = Number . MIN _VALUE ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
if ( mf in state . w3props )
{
var v = state . w3props [ mf ] ;
if ( mf in state . natural )
{
v += state . natural [ mf ] ;
}
hasValues |= ( v != 0 ) ;
if ( maxValue < v )
{
maxValue = v ;
}
}
if ( mf in state . w10props )
{
var v = state . w10props [ mf ] ;
if ( mf in state . natural )
{
v += state . natural [ mf ] ;
}
hasValues |= ( v != 0 ) ;
if ( maxValue < v )
{
maxValue = v ;
}
}
}
if ( ! hasValues )
{
continue ;
}
chapterHtml += getLeftCellHtml ( getItemPropLabel ( mf ) , odd ) ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
var vhtml = '' ;
var v = '-' ;
if ( mf in state . w3props )
{
v = state . w3props [ mf ] ;
if ( mf in state . natural )
{
v += state . natural [ mf ] ;
}
v = getItemPropFormattedValue ( mf , v , maxValue ) ;
}
vhtml += v ;
if ( mf in state . w10props )
{
v = state . w10props [ mf ] ;
if ( mf in state . natural )
{
v += state . natural [ mf ] ;
}
v = getItemPropFormattedValue ( mf , v , maxValue ) ;
vhtml += '/' + v ;
}
chapterHtml += getCellHtml ( vhtml , odd ) ;
}
chapterHtml += '</tr>' ;
odd = ! odd ;
}
if ( chapterHtml != '' )
{
html += chapterHtml ;
html += getHeaderHtml ( true ) ;
}
chapterHtml = '' ;
odd = false ;
for ( var mf in knownArmorModifiers )
{
if ( ! item _props [ mf ] . view )
{
continue ;
}
var maxValue = Number . MIN _VALUE ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
var v1 = state . results [ mf + '1' ] ;
var v2 = state . results [ mf + '2' ] ;
if ( maxValue < ( v1 + v2 ) )
{
maxValue = v1 + v2 ;
}
}
chapterHtml += getLeftCellHtml ( getItemPropLabel ( mf ) , odd ) ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
var vobj = { minv : state . results [ mf + '1' ] , maxv : state . results [ mf + '2' ] } ;
chapterHtml += getCellHtml ( getItemPropAdvWeaponHtml ( mf , vobj , maxValue , true ) , odd ) ;
}
chapterHtml += '</tr>' ;
odd = ! odd ;
}
if ( chapterHtml != '' )
{
html += chapterHtml ;
html += getHeaderHtml ( true ) ;
}
chapterHtml = '' ;
odd = false ;
for ( var mf in knownZoneModifiers )
{
if ( ! item _props [ mf ] . view )
{
continue ;
}
var hasValues = false ;
var maxValues = { head : 0 , body : 0 , waist : 0 , leg : 0 , avg : 0 } ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
if ( mf in state . results )
{
var v = state . results [ mf ] ;
for ( zone in maxValues )
{
if ( maxValues [ zone ] < v [ zone ] )
{
maxValues [ zone ] = v [ zone ] ;
hasValues = true ;
}
}
}
}
if ( ! hasValues )
{
continue ;
}
chapterHtml += '<tr><th rowspan="5" class="infoleftth">' + getItemPropLabel ( mf ) + '</th>' ;
var firstZone = true ;
for ( var zone in maxValues )
{
if ( firstZone )
{
firstZone = false ;
}
else
{
chapterHtml += '</tr><tr>' ;
odd = ! odd ;
}
chapterHtml += '<th class="infoleftth">' + localizer [ 'zone' + zone ] + '</th>' ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
var v = '-' ;
if ( mf in state . results )
{
v = state . results [ mf ] [ zone ] ;
var pcz = getMatvikZoneValue ( parseFloat ( v ) ) ;
// if (pcz > 80) pcz = 80; // no more than 80%
if ( pcz > 100 ) pcz = 100 ; // no more than 100%
pcz = Math . floor ( pcz * 100 + 0.5 ) / 100 ;
v = getItemPropFormattedValue ( mf , v , maxValues [ zone ] ) + ' (' + pcz + '%)' ;
}
chapterHtml += getCellHtml ( v , odd ) ;
}
}
chapterHtml += '</tr>' ;
odd = ! odd ;
}
if ( chapterHtml != '' )
{
html += chapterHtml ;
html += getHeaderHtml ( true ) ;
}
html += '</table>' ;
html += '</td></tr></table>' ;
return html ;
}
function showSummary ( )
{
var summaryDiv = document . getElementById ( summaryDivId ) ;
summaryDiv . innerHTML = getSummaryInnerHtml ( ) ;
summaryDiv . style . display = '' ;
}
function hideSummary ( )
{
var summaryDiv = document . getElementById ( summaryDivId ) ;
summaryDiv . style . display = 'none' ;
}
function getExpTableHeaderHtml ( separator )
{
var cattr = separator ? ' class="infoseparator"' : '' ;
var html = '' ;
if ( separator )
{
html += '<tr><th colspan="2"' + cattr + '>' ;
html += '<hr class="dashed" />' ;
html += '</th>' ;
}
else
{
html += '<tr><th width="33%" rowspan="2"' + cattr + '>' + item _props . level . lbl + '</th>' ;
html += '<th rowspan="2"' + cattr + '>' + item _props . levelup . lbl + '</th>' ;
html += '<th width="1%"' + cattr + '>|</th>' ;
html += '<th colspan="4"' + cattr + '>' + localizer . expIncrement + '</th>' ;
html += '<th width="1%"' + cattr + '>|</th>' ;
html += '<th colspan="3"' + cattr + '>' + localizer . expTotal + '</th>' ;
html += '</tr><tr>' ;
}
html += '<th width="1%"' + cattr + '>|</th>' ;
html += '<th' + cattr + '>' + localizer . expStats + '</th>' ;
html += '<th' + cattr + '>' + localizer . expSkills + '</th>' ;
html += '<th' + cattr + '>' + localizer . expEndurance + '</th>' ;
html += '<th' + cattr + '>' + localizer . expCredits + '</th>' ;
html += '<th width="1%"' + cattr + '>|</th>' ;
html += '<th' + cattr + '>' + localizer . expStats + '</th>' ;
html += '<th' + cattr + '>' + localizer . expExperience + '</th>' ;
html += '<th' + cattr + '>' + localizer . expCredits + '</th>' ;
html += '</tr>' ;
return html ;
}
function getExpTableInnerHtml ( )
{
var html = '<table class="tcontent" width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center" valign="top">' ;
html += '<p>' + localizer . expTableDesc + '</p>' ;
html += '<table width="100%" class="info" border="0" cellspacing="0" cellpadding="0">' ;
html += getExpTableHeaderHtml ( false ) ;
for ( var leveln in expd )
{
var level = expd [ leveln ] ;
var upc = 1 ;
if ( 'count' in level )
{
upc = level . count ;
}
html += '<tr>' ;
html += '<th rowspan="' + upc + '" class="infoleftth">' + item _props . level . lbl + ': ' ;
html += level . id . toString ( ) . bold ( ) ;
if ( 'baseExp' in level )
{
html += '<br />' + localizer . expBaseExperience + ': ' + level . baseExp . toString ( ) . bold ( ) ;
}
if ( 'body' in level )
{
html += '<br />' + localizer . expBody + ': ' + level . body . toString ( ) . bold ( ) ;
}
if ( 'description' in level )
{
html += '<br />' + localizer . expDescription + ': ' + level . description . bold ( ) ;
}
html += '</th>' ;
if ( 'ups' in level )
{
var firstUp = true ;
var odd = false ;
for ( var upn in level . ups )
{
if ( firstUp )
{
firstUp = false ;
}
else
{
html += '</tr><tr>' ;
}
var up = level . ups [ upn ] ;
html += '<th class="infoleftth">' + up . id + '</th>' ;
html += getCellHtml ( '|' , odd )
html += getCellHtml ( up . astats , odd )
html += getCellHtml ( up . amastery || '' , odd )
html += getCellHtml ( up . aendurance || '' , odd )
html += getCellHtml ( up . acredits || '' , odd )
html += getCellHtml ( '|' , odd )
html += getCellHtml ( up . sstats , odd )
html += getCellHtml ( up . sexp , odd )
html += getCellHtml ( up . scredits . toString ( ) , odd )
odd = ! odd ;
}
}
if ( ! ( 'count' in level ) )
{
html += '<th class="infoleftth"> </th>' ;
html += '<td colspan="9">' + localizer . expNoInformation + '</td>' ;
}
html += '</tr>' ;
html += getExpTableHeaderHtml ( true ) ;
}
html += '</table>' ;
html += '</td></tr></table>' ;
return html ;
}
function showExpTable ( )
{
var expTableDiv = document . getElementById ( expTableDivId ) ;
if ( ! expTableBuilt )
{
2023-01-10 18:29:32 +02:00
expTableDiv . innerHTML = 'Подождите, пока идёт форматирование таблицы опыта...' ;
2022-12-19 22:22:19 +02:00
}
expTableDiv . style . display = '' ;
if ( ! expTableBuilt )
{
expTableDiv . innerHTML = getExpTableInnerHtml ( ) ;
expTableBuilt = true ;
}
}
function hideExpTable ( )
{
var expTableDiv = document . getElementById ( expTableDivId ) ;
expTableDiv . style . display = 'none' ;
}
function getCabsAsOptions ( )
{
var html = '' ;
var i = 1 ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
html += '<option value="' ;
html += state . id ;
html += '">' ;
html += localizer . upperCab + ' ' + i ;
html += '</option>' ;
i ++ ;
}
return html ;
}
var dressHealerData = new Array (
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 ) ,
new Array ( 5 , 5 , 5 , 5 , 5 , 5 )
) ;
function evaluateHealerPrice ( )
{
var errorsFound = false ;
var html = '' ;
var sourceState = dressStates [ document . getElementById ( 'sourcecab' ) . value ] ;
if ( sourceState == null )
{
2023-01-10 18:29:32 +02:00
html += '<p><font color="red">Н е выбрана исходная кабинка.</font></p>' ;
2022-12-19 22:22:19 +02:00
errorsFound = true ;
}
var targetState = dressStates [ document . getElementById ( 'targetcab' ) . value ] ;
if ( targetState == null )
{
2023-01-10 18:29:32 +02:00
html += '<p><font color="red">Н е выбрана целевая кабинка.</font></p>' ;
2022-12-19 22:22:19 +02:00
errorsFound = true ;
}
var freeSwapsCount = parseInt ( document . getElementById ( 'freeswaps' ) . value ) ;
if ( isNaN ( freeSwapsCount ) || freeSwapsCount < 0 )
{
2023-01-10 18:29:32 +02:00
html += '<p><font color="red">Количество оставшихся бесплатных перекидок статов должно быть целым неотрицательным числом.</font></p>' ;
2022-12-19 22:22:19 +02:00
errorsFound = true ;
}
if ( freeSwapsCount > 15 )
{
2023-01-10 18:29:32 +02:00
html += '<p><font color="red">Количество оставшихся бесплатных перекидок статов не может быть выше 15.</font></p>' ;
2022-12-19 22:22:19 +02:00
errorsFound = true ;
}
if ( sourceState == targetState )
{
2023-01-10 18:29:32 +02:00
html += '<p><font color="red">Вы выбрали одну и ту же кабинку в качестве исходной и целевой. Стоимость перекидки равна 0кр .</font></p>' ;
2022-12-19 22:22:19 +02:00
errorsFound = true ;
}
recalcDresserState ( sourceState ) ;
recalcDresserState ( targetState ) ;
if ( sourceState . natural . totalstats != targetState . natural . totalstats )
{
2023-01-10 18:29:32 +02:00
html += '<p><font color="red">Общая сумма родных статов в выбранных кабинках не совпадает.' ;
html += ' Для исходной кабинки сумма родных статов равна ' + sourceState . natural . totalstats ;
html += ', а для целевой кабинки сумма родных статов равна ' + targetState . natural . totalstats ;
html += '. Пожалуйста, выровняйте количество родных статов в этих кабинках.</font></p>' ;
2022-12-19 22:22:19 +02:00
errorsFound = true ;
}
if ( sourceState . natural . spirituality < targetState . natural . spirituality )
{
2023-01-10 18:29:32 +02:00
html += '<p><font color="red">Значение духовности в целевой кабинке больше, чем в исходной.' ;
html += '. К сожалению, Администрация БК пока не предоставила нам информацию о стоимости перекидки статов в Духовность.</font></p>' ;
2022-12-19 22:22:19 +02:00
errorsFound = true ;
}
var freeStats = '' ;
for ( var i = 0 ; i < knownStats . length ; i ++ )
{
var mfname = knownStats [ i ] ;
var sval = sourceState . natural [ mfname ] ;
var tval = targetState . natural [ mfname ] ;
if ( tval > sval && tval > dressHealerData . length )
{
2023-01-10 18:29:32 +02:00
html += '<p><font color="red">' + getItemPropLabel ( mfname ) + ': Значение в целевой кабинке больше, чем мы можем обработать.' ;
html += 'Для перекидки больше ' + dressHealerData . length + ' статов дешевле воспользоватся кнопкой "Скинуть все" в комнате знахаря.</font></p>' ;
2022-12-19 22:22:19 +02:00
errorsFound = true ;
}
if ( tval > sval && tval < 0 )
{
2023-01-10 18:29:32 +02:00
html += '<p><font color="red">' + getItemPropLabel ( mfname ) + ': Значение в целевой кабинке меньше нуля, и больше значения в исходной кабинке.' ;
html += '. Значения родных статов не могут быть меньше 0.</font></p>' ;
2022-12-19 22:22:19 +02:00
errorsFound = true ;
}
if ( sval > tval )
{
if ( freeStats != '' )
{
freeStats += ', ' ;
}
freeStats += getItemPropLabel ( mfname ) ;
}
}
if ( ! errorsFound )
{
var history = '' ;
var price = 0 ;
for ( var i = knownStats . length - 1 ; i >= 0 ; i -- )
{
if ( i >= dressHealerData [ 0 ] . length )
{
continue ;
}
var mfname = knownStats [ i ] ;
var sval = sourceState . natural [ mfname ] ;
var tval = targetState . natural [ mfname ] ;
var diff = tval - sval ;
if ( diff > 0 )
{
for ( j = 0 ; j < diff ; j ++ )
{
if ( freeSwapsCount > 0 )
{
freeSwapsCount -- ;
2023-01-10 18:29:32 +02:00
history += 'Перекидываем один стат из [' + freeStats + '] в ' + getItemPropLabel ( mfname ) + ' бесплатно <i>(' + getItemPropLabel ( mfname ) + ': было ' + ( sval + j ) . toString ( ) + ', стало ' + ( sval + j + 1 ) . toString ( ) + ')</i>.<br />' ;
2022-12-19 22:22:19 +02:00
}
else
{
var m = sval + j ;
var m2 = m - 1 ;
if ( m2 < 0 ) m2 = 0 ;
var stepPrice = dressHealerData [ m2 ] [ i ] ;
price += stepPrice ;
2023-01-10 18:29:32 +02:00
history += 'Перекидываем один стат из [' + freeStats + '] в ' + getItemPropLabel ( mfname ) + ' за ' + stepPrice + 'кр. <i>(' + getItemPropLabel ( mfname ) + ': было ' + m . toString ( ) + ', стало ' + ( m + 1 ) . toString ( ) + ')</i>.<br />' ;
2022-12-19 22:22:19 +02:00
}
}
}
}
2023-01-10 18:29:32 +02:00
html += '<p>Общая стоимость перекидки статов: <b>' + price + '</b>кр.</p>' ;
2022-12-19 22:22:19 +02:00
html += '<hr class="dashed" />' ;
html += history ;
}
var healerInfoDiv = document . getElementById ( 'evaluatedHealerInfo' ) ;
healerInfoDiv . innerHTML = html ;
}
function getHealerInnerHtml ( )
{
var html = '<table class="tcontent" width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td align="left" valign="top">' ;
2023-01-10 18:29:32 +02:00
html += '<p>Комната Знахаря позволит Вам оценить затраты на перекидку статов.</p>' ;
html += '<p>1. Выберите кабинку с исходным комплектом: <select id="sourcecab" name="sourcecab" class="ABTextR">' ;
2022-12-19 22:22:19 +02:00
html += getCabsAsOptions ( ) ;
html += '</select><br />' ;
2023-01-10 18:29:32 +02:00
html += '2. Выберите кабинку с целевым комплектом: <select id="targetcab" name="targetcab" class="ABTextR">' ;
2022-12-19 22:22:19 +02:00
html += getCabsAsOptions ( ) ;
html += '</select><br />' ;
2023-01-10 18:29:32 +02:00
html += '3. Укажите количество оставшихся бесплатных перекидок статов: <input type="text" id="freeswaps" name="freeswaps" value="0" class="ABTextR" size="2" maxlength="2" /><br />' ;
html += '4. И нажмите на эту кнопку: <input class="inpButton" type="button" id="evaluatehealerprice" name="evaluatehealerprice" value="Рассчитать стоимость перекидки статов" onclick="evaluateHealerPrice(); return false" /></p>' ;
2022-12-19 22:22:19 +02:00
html += '<div id="evaluatedHealerInfo"></div>' ;
html += '</td></tr></table>' ;
return html ;
}
function showHealer ( )
{
var healerDiv = document . getElementById ( healerDivId ) ;
healerDiv . innerHTML = getHealerInnerHtml ( ) ;
healerDiv . style . display = '' ;
}
function hideHealer ( )
{
var healerDiv = document . getElementById ( healerDivId ) ;
healerDiv . style . display = 'none' ;
}
function getAttackCount ( state )
{
var r = 1 ;
var w3o = getObjectById ( state . objects [ slot _w3 . index ] ) ;
var w10o = getObjectById ( state . objects [ slot _w10 . index ] ) ;
if ( w10o != null && w10o . slot != 'w3' )
{
w10o = null ;
}
if ( w3o != null && w10o != null )
{
r = 2 ;
}
var wearedRings = [
state . objects [ slot _w6 . index ] ,
state . objects [ slot _w7 . index ] ,
state . objects [ slot _w8 . index ]
] ;
for ( var ri = 0 ; ri < wearedRings . length ; ri ++ )
{
if ( wearedRings [ ri ] == 'aring5' )
{
r += 1 ;
}
}
return r ;
}
function adjustBlockCount ( o , firstw , shieldy )
{
if ( o == null ) return - 1 ;
if ( o . category == 'shields' ) return 1 ;
if ( ( 'properties' in o ) && ( 'blockzones' in o . properties ) )
{
var bz = o . properties . blockzones . toString ( ) ;
if ( ! firstw && ( bz == '++' ) )
{
return 1 ;
}
if ( ( ! firstw || shieldy ) && ( bz == '—' ) )
{
return - 1 ;
}
}
return 0 ;
}
function getBlockCount ( state )
{
var r = 2 ;
var w3o = getObjectById ( state . objects [ slot _w3 . index ] ) ;
var w10o = getObjectById ( state . objects [ slot _w10 . index ] ) ;
if ( w3o == null )
{
return r ;
}
if ( w10o != null )
{
r += adjustBlockCount ( w3o , true , ( w10o . category == 'shields' ) ) ;
r += adjustBlockCount ( w10o , false , ( w10o . category == 'shields' ) ) ;
}
if ( r < 1 ) r = 1 ;
if ( r > 4 ) r = 4 ;
return r ;
}
function getBlockZones ( blockCount )
{
var bzd = twoBlockZones ;
if ( blockCount >= 3 )
{
bzd = threeBlockZones ;
}
return bzd ;
}
function updateTurnButton ( )
{
var noStrike = false ;
for ( var i = 0 ; i < turnData . strikes . length ; i ++ )
{
if ( turnData . strikes [ i ] == null )
{
noStrike = true ;
break ;
}
}
var en = ! noStrike && ( turnData . blockZones != 0 ) ;
document . getElementById ( 'doTurn' ) . disabled = ! en ;
}
function strikeChosen ( id )
{
var el = document . getElementById ( id ) ;
var number = parseInt ( el . name . substr ( 4 ) ) ;
var zn = parseInt ( el . id . substr ( el . name . length + 1 ) ) ;
var v = el . checked ;
if ( v )
{
turnData . strikes [ number ] = ( zn - 1 ) ;
}
else
{
if ( turnData . strikes [ number ] == ( zn - 1 ) )
{
turnData . strikes [ number ] = null ;
}
}
updateTurnButton ( ) ;
}
function blockChosen ( id )
{
var el = document . getElementById ( id ) ;
var number = parseInt ( el . name . substr ( 4 ) ) ;
var zn = parseInt ( el . id . substr ( el . name . length + 1 ) ) ;
var v = el . checked ;
if ( v )
{
turnData . blockZones |= turnData . bzd [ ( zn - 1 ) ] . zones ;
}
else
{
turnData . blockZones &= ~ turnData . bzd [ ( zn - 1 ) ] . zones ;
}
updateTurnButton ( ) ;
}
function doBattleTurn ( )
{
2023-01-10 18:29:32 +02:00
document . getElementById ( 'battlechoose' ) . innerHTML = 'Ожидаем ответа' ;
2022-12-19 22:22:19 +02:00
battleRequest ( ) ;
}
function getBattleTurnParamsHash ( )
{
var p = { } ;
for ( var i = 0 ; i < battleTurnParams . length ; i ++ )
{
p [ battleTurnParams [ i ] ] = true ;
}
return p ;
}
function getStateBattleTurnParamsOf ( prefix , postfix , data , p )
{
var r = '' ;
for ( var mn in data )
{
if ( ( mn in p ) && ( data [ mn ] != 0 ) )
{
r += '&' + prefix + mn + postfix + '=' + data [ mn ] ;
}
}
return r ;
}
function getStateBattleTurnParams ( postfix , state , p )
{
var r = '' ;
r += getStateBattleTurnParamsOf ( 'r.' , postfix , state . results , p ) ;
r += getStateBattleTurnParamsOf ( 'w3.' , postfix , state . w3props , p ) ;
if ( hasTwoWeapons ( state ) )
{
r += getStateBattleTurnParamsOf ( 'w0.' , postfix , state . w10props , p ) ;
}
return r ;
}
function battleRequest ( )
{
var p = getBattleTurnParamsHash ( ) ;
br _cleanupScriptElement ( battleScriptId ) ;
var href = battleProviderUrl + '?rnd=' + Math . random ( ) ;
if ( hasTwoWeapons ( bstate1 ) )
{
href += '&h2w1=1' ;
}
if ( hasTwoWeapons ( bstate2 ) )
{
href += '&h2w2=1' ;
}
for ( var i = 0 ; i < turnData . strikes . length ; i ++ )
{
href += '&s1_' + i + '=' + turnData . strikes [ i ] ;
}
href += '&bz1=' + turnData . blockZones ;
href += getStateBattleTurnParams ( '.1' , bstate1 , p ) ;
href += getStateBattleTurnParams ( '.2' , bstate2 , p ) ;
if ( isDeveloperMode ( ) ) informAboutProgress ( href ) ;
br _getScriptElement ( battleScriptId , href ) ;
}
function br _cleanupScriptElement ( id )
{
var span = document . getElementById ( id ) ;
if ( span != null )
{
setTimeout ( function ( )
{
// without setTimeout - crash in IE 5.0!
span . parentNode . removeChild ( span ) ;
} ,
50
) ;
}
}
function br _getScriptElement ( id , href )
{
var span = document . body . appendChild ( document . createElement ( 'SPAN' ) ) ;
span . style . display = 'none' ;
span . innerHTML = 'MSIE fix<s' + 'cript></s' + 'cript>' ;
setTimeout ( function ( )
{
var s = span . getElementsByTagName ( "script" ) [ 0 ] ;
s . language = "JavaScript" ;
if ( s . setAttribute ) s . setAttribute ( 'src' , href ) ; else s . src = href ;
} ,
10
) ;
return span ;
}
var bstate1 ;
var bstate2 ;
function handleBattleResponse ( response )
{
var line = response . line ;
document . getElementById ( 'xx_battlescreen' ) . innerHTML = getBattleScreenHtml ( ) ;
var logelt = document . getElementById ( 'xx_battlelog' ) ;
line = '<div style="border-bottom: solid 1px #222222;">' + line + '</div>' ;
if ( logelt . insertAdjacentHTML )
{
logelt . insertAdjacentHTML ( 'afterBegin' , line ) ;
}
else
{
logelt . innerHTML = line + logelt . innerHTML ;
}
}
function getStrikeBlockSelector ( attackCount , blockCount )
{
var html = '' ;
var bzd = getBlockZones ( blockCount ) ;
turnData = { bzd : bzd , strikes : new Array ( attackCount ) , blockZones : 0 } ;
html += '<table width="100%" border="0" cellspacing="0" cellpadding="8"><tr>' ;
for ( azi = 0 ; azi < attackCount ; azi ++ )
{
html += '<td valign="top">' ;
2023-01-10 18:29:32 +02:00
html += '<label>Удар</label>' ;
2022-12-19 22:22:19 +02:00
var rn = 'atck' + azi ;
for ( var i = 0 ; i < localizer . attackZone . length ; i ++ )
{
var id = rn + '_' + ( i + 1 ) ;
html += '<br />' ;
html += '<input id="' + id + '" type="radio" value="' + i + '" name="' + rn + '" onclick="strikeChosen(' + "'" + id + "'" + ')" />' ;
html += '<label for="' + id + '">' + localizer . attackZone [ i ] + '</label>' ;
}
}
html += '</td><td valign="top">' ;
2023-01-10 18:29:32 +02:00
html += '<label>Блок</label>' ;
2022-12-19 22:22:19 +02:00
var rn = 'blck0' ;
for ( var i = 0 ; i < bzd . length ; i ++ )
{
var id = rn + '_' + ( i + 1 ) ;
html += '<br />' ;
html += '<input id="' + id + '" type="radio" value="' + bzd [ i ] . zones + '" name="' + rn + '" onclick="blockChosen(' + "'" + id + "'" + ')" />' ;
html += '<label for="' + id + '">' + bzd [ i ] . name + '</label>' ;
}
html += '</td></tr></table>' ;
html += '<input id="doTurn" class="inpButton" type="button" onclick="doBattleTurn()" value="' + localizer . goStrike + '" disabled="yes" />' ;
return html ;
}
function getBattleScreenHtml ( )
{
var html = '' ;
html += '<div id="xx_battlescreen"><table width="100%" cellpadding="0" cellspacing="0"><tr>' ;
html += '<td width="240" valign="top">' + getSimplePersImageHtml ( bstate1 , true ) + '</td>' ;
html += '<td align="center" valign="top" id="battlechoose">' ;
html += getStrikeBlockSelector ( bstate1 . results . attackcount , bstate1 . results . blockcount ) ;
html += '</td>' ;
html += '<td width="240" valign="top">' + getSimplePersImageHtml ( bstate2 , false ) + '</td>' ;
html += '</tr></table></div>' ;
return html ;
}
function clearBattleState ( state )
{
for ( var mf in knownWeaponModifiersHash )
{
if ( ! ( mf in state . natural ) )
{
continue ;
}
if ( mf in state . w3props )
{
state . w3props [ mf ] += state . natural [ mf ] ;
}
if ( mf in state . w10props )
{
state . w10props [ mf ] += state . natural [ mf ] ;
}
delete state . results [ mf ] ;
}
state . inbattle . hitpoints = state . results . hitpoints ;
state . inbattle . mana = state . results . mana ;
}
function startBattle ( )
{
var s1 = dressStates [ document . getElementById ( 'bcab1' ) . value ] ;
var s2 = dressStates [ document . getElementById ( 'bcab2' ) . value ] ;
bstate1 = cloneObject ( s1 ) ;
bstate2 = cloneObject ( s2 ) ;
clearBattleState ( bstate1 ) ;
clearBattleState ( bstate2 ) ;
var html = '' ;
html += getBattleScreenHtml ( ) ;
html += '<hr class="dashed" />' ;
html += '<div id="xx_battlelog"> </div>' ;
var battlesDiv = document . getElementById ( battlesDivId ) ;
battlesDiv . innerHTML = html ;
}
function getBattlesInnerHtml ( )
{
var html = '<table class="tcontent" width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td align="left" valign="top">' ;
2023-01-10 18:29:32 +02:00
html += '<p>Здесь Вы можете провести тестовые поединки.</p>' ;
html += '<p><font color="red">Вплоть до официального релиза поединков оные будут лимитированы. Сперва появятся только поединки бойцов, и только потом появится магия.</font></p>' ;
html += '<p>1. Выберите кабинку с о своим комплектом: <select id="bcab1" name="bcab1" class="ABTextR">' ;
2022-12-19 22:22:19 +02:00
html += getCabsAsOptions ( ) ;
html += '</select><br />' ;
2023-01-10 18:29:32 +02:00
html += '2. Выберите кабинку с комплектом противника: <select id="bcab2" name="bcab2" class="ABTextR">' ;
2022-12-19 22:22:19 +02:00
html += getCabsAsOptions ( ) ;
html += '</select><br />' ;
2023-01-10 18:29:32 +02:00
html += '3. И нажмите на эту кнопку: <input class="inpButton" type="button" id="startbattle" name="startbattle" value="Начать поединок один на один" onclick="startBattle(); return false" /></p>' ;
2022-12-19 22:22:19 +02:00
html += '</td></tr></table>' ;
return html ;
}
function showBattles ( )
{
var battlesDiv = document . getElementById ( battlesDivId ) ;
battlesDiv . innerHTML = getBattlesInnerHtml ( ) ;
battlesDiv . style . display = '' ;
}
function hideBattles ( )
{
var battlesDiv = document . getElementById ( battlesDivId ) ;
battlesDiv . style . display = 'none' ;
}
function getFake ( oid )
{
var o = getObjectById ( oid ) ;
var r = o . upgrade [ getJSName ( oid ) + '_fake' ] ;
if ( ! ( 'caption' in r ) )
{
r . caption = o . caption ;
}
r . category = o . category ;
r . slot = o . slot ;
r . width = o . width ;
r . height = o . height ;
return r ;
}
function getCommonItemList ( )
{
return common _props ;
}
function getSelectItemListHtml ( prefix , list )
{
var html = '' ;
html += '<select id="' + prefix + 'itemListChooser">' ;
for ( var mf in list )
{
var data = list [ mf ] ;
var lbl = data . lbl ;
html += '<option value="' + mf + '">' + lbl + '</option>' ;
}
html += '</select>' ;
return html ;
}
function applyFakeParam ( id )
{
var value = parseFloat ( document . getElementById ( 'fakeParamValue' ) . value ) ;
if ( isNaN ( value ) )
{
2023-01-10 18:29:32 +02:00
alert ( 'Введите число.' ) ;
2022-12-19 22:22:19 +02:00
return ;
}
var o = getObjectById ( id ) ;
if ( 'upgradecache' in o )
{
delete o . upgradecache ;
}
var fake = getFake ( id ) ;
if ( ! ( 'common' in fake ) )
{
fake . common = { } ;
}
if ( value != 0 )
{
fake . common [ document . getElementById ( 'cmnitemListChooser' ) . value ] = value ;
}
else
{
delete fake . common [ document . getElementById ( 'cmnitemListChooser' ) . value ] ;
}
document . getElementById ( 'buildings' ) . innerHTML = getFakeItemEditor ( id ) ;
}
function addFakeParam ( id )
{
var html = '' ;
html += getSelectItemListHtml ( 'cmn' , getCommonItemList ( ) ) ;
html += '<br /><input id="fakeParamValue" type="text" value="0" />' ;
2023-01-10 18:29:32 +02:00
html += '<br /><input class="inpButton" type="button" value="Добавить" onclick="applyFakeParam(' + "'" + id + "'" + ')" /></div>' ;
2022-12-19 22:22:19 +02:00
document . getElementById ( 'param_newline' ) . innerHTML = html ;
}
function getBoolItemList ( boolvar )
{
var r = { } ;
for ( var mf in item _props )
{
var data = item _props [ mf ] ;
if ( ( boolvar in data ) && data [ boolvar ] )
{
r [ mf ] = data ;
}
}
return r ;
}
function getRequiredItemList ( )
{
return getBoolItemList ( 'required' ) ;
}
function applyFakeReq ( id )
{
var value = document . getElementById ( 'fakeReqValue' ) . value ;
if ( isNaN ( value ) )
{
2023-01-10 18:29:32 +02:00
alert ( 'Введите число.' ) ;
2022-12-19 22:22:19 +02:00
return ;
}
var o = getObjectById ( id ) ;
if ( 'upgradecache' in o )
{
delete o . upgradecache ;
}
var fake = getFake ( id ) ;
if ( ! ( 'required' in fake ) )
{
fake . required = { } ;
}
if ( value > 0 )
{
fake . required [ document . getElementById ( 'reqitemListChooser' ) . value ] = value ;
}
else
{
delete fake . required [ document . getElementById ( 'reqitemListChooser' ) . value ] ;
}
document . getElementById ( 'buildings' ) . innerHTML = getFakeItemEditor ( id ) ;
}
function addFakeReq ( id )
{
var html = '' ;
html += getSelectItemListHtml ( 'req' , getRequiredItemList ( ) ) ;
html += '<br /><input id="fakeReqValue" type="text" value="0" />' ;
2023-01-10 18:29:32 +02:00
html += '<br /><input class="inpButton" type="button" value="Добавить" onclick="applyFakeReq(' + "'" + id + "'" + ')" /></div>' ;
2022-12-19 22:22:19 +02:00
document . getElementById ( 'req_newline' ) . innerHTML = html ;
}
function getCleanModifyItemList ( )
{
return getBoolItemList ( 'inmfg' ) ;
}
function applyFakeCleanMf ( id )
{
var value = document . getElementById ( 'fakeMfValue' ) . value ;
if ( isNaN ( value ) )
{
2023-01-10 18:29:32 +02:00
alert ( 'Введите число.' ) ;
2022-12-19 22:22:19 +02:00
return ;
}
var o = getObjectById ( id ) ;
if ( 'upgradecache' in o )
{
delete o . upgradecache ;
}
var fake = getFake ( id ) ;
if ( ! ( 'modify' in fake ) )
{
fake . modify = { } ;
}
if ( value != 0 )
{
fake . modify [ document . getElementById ( 'cmfitemListChooser' ) . value ] = value ;
}
else
{
delete fake . modify [ document . getElementById ( 'cmfitemListChooser' ) . value ] ;
}
document . getElementById ( 'buildings' ) . innerHTML = getFakeItemEditor ( id ) ;
}
function addFakeCleanMf ( id )
{
var html = '' ;
html += getSelectItemListHtml ( 'cmf' , getCleanModifyItemList ( ) ) ;
html += '<br /><input id="fakeMfValue" type="text" value="0" />' ;
2023-01-10 18:29:32 +02:00
html += '<br /><input class="inpButton" type="button" value="Добавить" onclick="applyFakeCleanMf(' + "'" + id + "'" + ')" /></div>' ;
2022-12-19 22:22:19 +02:00
document . getElementById ( 'mf_newline' ) . innerHTML = html ;
}
function getCleanPropertiesItemList ( )
{
return getBoolItemList ( 'inprpg' ) ;
}
function applyFakeCleanPrp ( id )
{
var value = document . getElementById ( 'fakePrpValue' ) . value ;
if ( isNaN ( value ) )
{
2023-01-10 18:29:32 +02:00
alert ( 'Введите число.' ) ;
2022-12-19 22:22:19 +02:00
return ;
}
var o = getObjectById ( id ) ;
if ( 'upgradecache' in o )
{
delete o . upgradecache ;
}
var fake = getFake ( id ) ;
if ( ! ( 'properties' in fake ) )
{
fake . properties = { } ;
}
if ( value != 0 )
{
fake . properties [ document . getElementById ( 'prpitemListChooser' ) . value ] = value ;
}
else
{
delete fake . properties [ document . getElementById ( 'prpitemListChooser' ) . value ] ;
}
document . getElementById ( 'buildings' ) . innerHTML = getFakeItemEditor ( id ) ;
}
function addFakeCleanPrp ( id )
{
var html = '' ;
html += getSelectItemListHtml ( 'prp' , getCleanPropertiesItemList ( ) ) ;
html += '<br /><input id="fakePrpValue" type="text" value="0" />' ;
2023-01-10 18:29:32 +02:00
html += '<br /><input class="inpButton" type="button" value="Добавить" onclick="applyFakeCleanPrp(' + "'" + id + "'" + ')" /></div>' ;
2022-12-19 22:22:19 +02:00
document . getElementById ( 'prp_newline' ) . innerHTML = html ;
}
function renameFake ( id )
{
var o = getObjectById ( id ) ;
var fake = getFake ( id ) ;
var caption = o . caption ;
if ( 'caption' in fake )
{
caption = fake . caption ;
}
2023-01-10 18:29:32 +02:00
caption = window . prompt ( 'Введите имя предмета' , caption ) ;
2022-12-19 22:22:19 +02:00
if ( caption != null )
{
if ( caption == o . caption )
{
if ( 'caption' in fake )
{
delete fake . caption ;
}
}
else
{
fake . caption = caption ;
}
}
if ( 'upgradecache' in o )
{
delete o . upgradecache ;
}
document . getElementById ( 'buildings' ) . innerHTML = getFakeItemEditor ( id ) ;
}
function getFakeItemEditor ( id )
{
var html = '' ;
var fake = getFake ( id ) ;
html += categories [ fake . category ] . caption . bold ( ) + '<hr class="dashed" />' ;
html += format ( '<img border="0" align="right" src="{0}{1}.gif" width="{2}" height="{3}" />' , itemImgPath , id , fake . width , fake . height ) ;
html += '<b>' + getUpgradeCaption ( getObjectById ( id ) , fake ) + '</b> ' ;
2023-01-10 18:29:32 +02:00
html += '<input class="inpButton" type="button" value="Переименовать" onclick="renameFake(' + "'" + id + "'" + ')" /><br />' ;
2022-12-19 22:22:19 +02:00
if ( 'common' in fake )
{
for ( var mf in fake . common )
{
html += getHtmlOfProp ( null , fake . common , common _props [ mf ] , mf ) ;
}
}
2023-01-10 18:29:32 +02:00
html += '<div id="param_newline"><input class="inpButton" type="button" value="Добавить в Параметры" onclick="addFakeParam(' + "'" + id + "'" + ')" /></div>' ;
2022-12-19 22:22:19 +02:00
html += localizer . itemRequiredGroup . bold ( ) + '<br />' ;
if ( 'required' in fake )
{
for ( var mf in fake . required )
{
html += getHtmlOfProp ( null , fake . required , item _props [ mf ] , mf ) ;
}
}
2023-01-10 18:29:32 +02:00
html += '<div id="req_newline"><input class="inpButton" type="button" value="Добавить в Требования" onclick="addFakeReq(' + "'" + id + "'" + ')" /></div>' ;
2022-12-19 22:22:19 +02:00
html += localizer . itemModifyGroup . bold ( ) + '<br />' ;
if ( 'modify' in fake )
{
for ( var mf in fake . modify )
{
if ( mf in knownArmorModifiers )
{
continue ;
}
html += getHtmlOfSignedProp ( fake . modify , item _props [ mf ] , mf , null , null , null ) ;
}
for ( var armorn in knownArmorModifiers )
{
html += getHtmlOfArmorProp ( fake . modify , armorn , getItemPropLabel ( armorn ) ) ;
}
}
2023-01-10 18:29:32 +02:00
html += '<div id="mf_newline"><input class="inpButton" type="button" value="Добавить в Действует на" onclick="addFakeCleanMf(' + "'" + id + "'" + ')" /></div>' ;
2022-12-19 22:22:19 +02:00
html += localizer . itemPropertiesGroup . bold ( ) + '<br />' ;
if ( 'properties' in fake )
{
for ( var mf in fake . properties )
{
html += getHtmlOfSignedProp ( fake . properties , item _props [ mf ] , mf , null , null , null ) ;
}
}
2023-01-10 18:29:32 +02:00
html += '<div id="prp_newline"><input class="inpButton" type="button" value="Добавить в Свойства предмета" onclick="addFakeCleanPrp(' + "'" + id + "'" + ')" /></div>' ;
2022-12-19 22:22:19 +02:00
return html ;
}
function createFake ( id , fake )
{
var c = categories [ fake . category ] ;
var slot = getSlotById ( c . slot ) ;
var oidx = getJSName ( id ) ;
if ( ! ( oidx in dressItems ) )
{
dressItems [ oidx ] = { id : id , fakebase : true , caption : fake . caption , category : c . id , slot : c . slot , width : slot . width , height : slot . height } ;
c . items . push ( dressItems [ oidx ] ) ;
}
var o = getObjectById ( id ) ;
if ( ! ( 'upgrade' in o ) )
{
o . upgrade = { } ;
}
o . upgrade [ oidx + '_fake' ] = fake ;
}
function builderEditItem ( isNewItem )
{
var ci = document . getElementById ( 'builderCategoryChooser' ) . value ;
var c = categories [ ci ] ;
var slot = getSlotById ( c . slot ) ;
var id = '' ;
if ( isNewItem )
{
id = document . getElementById ( 'builderItemComposeName' ) . value ;
var slashIndex = id . lastIndexOf ( '/' ) ;
if ( slashIndex >= 0 )
{
id = id . substr ( slashIndex + 1 ) ;
}
var gifIndex = id . lastIndexOf ( '.gif' ) ;
if ( gifIndex >= 0 )
{
id = id . substr ( 0 , gifIndex ) ;
}
if ( getObjectById ( id ) != null )
{
2023-01-10 18:29:32 +02:00
alert ( 'Предмет с таким кодом уже существует!' ) ;
2022-12-19 22:22:19 +02:00
return ;
}
}
else
{
id = document . getElementById ( 'builderItemChooser' ) . value ;
}
if ( id == '' )
{
2023-01-10 18:29:32 +02:00
alert ( 'Пустое имя предмета' ) ;
2022-12-19 22:22:19 +02:00
return ;
}
var oidx = getJSName ( id ) ;
if ( ! ( oidx in dressItems ) )
{
2023-01-10 18:29:32 +02:00
dressItems [ oidx ] = { id : id , fakebase : true , caption : 'Новый предмет' , category : c . id , slot : c . slot , width : slot . width , height : slot . height } ;
2022-12-19 22:22:19 +02:00
c . items . push ( dressItems [ oidx ] ) ;
for ( var ci in categories )
{
var oc = categories [ ci ] ;
if ( ( 'basecat' in oc ) && ( oc . basecat == c ) && ( oc . items != c . items ) )
{
oc . items . push ( dressItems [ oidx ] ) ;
}
}
}
if ( ! ( oidx in dressExData . fakes ) )
{
var o = getObjectById ( id ) ;
if ( ! ( 'upgrade' in o ) )
{
o . upgrade = { } ;
}
o . upgrade [ oidx + '_fake' ] = { id : id + '_fake' , fake : Math . random ( ) } ;
if ( ! isNewItem )
{
o . upgrade [ oidx + '_fake' ] = combineObjects ( o , o . upgrade [ oidx + '_fake' ] ) ;
}
dressExData . fakes [ oidx ] = id ;
}
document . getElementById ( 'buildings' ) . innerHTML = getFakeItemEditor ( id ) ;
}
function rebuildItems ( )
{
var ci = document . getElementById ( 'builderCategoryChooser' ) . value ;
if ( ci == null || ci == '' )
{
document . getElementById ( 'builderItemChooserDiv' ) . innerHTML = '' ;
return ;
}
var html = '' ;
html += '<select id="builderItemChooser">' ;
var c = categories [ ci ] ;
var items = getFilteredItems ( c . items ) ;
for ( var iti in items )
{
var it = items [ iti ] ;
html += '<option value="' + it . id + '">' + htmlstring ( it . caption ) + '</option>' ;
}
html += '</select>' ;
2023-01-10 18:29:32 +02:00
html += '<br /><input class="inpButton" type="button" value="Открыть в конструкторе" onclick="builderEditItem(false);" />' ;
2022-12-19 22:22:19 +02:00
document . getElementById ( 'builderItemChooserDiv' ) . innerHTML = html ;
}
function builderChooseItem ( )
{
var html = '' ;
2023-01-10 18:29:32 +02:00
html += 'Выберите предмет для начала конструирования<br />' ;
2022-12-19 22:22:19 +02:00
html += '<select id="builderCategoryChooser" onchange="rebuildItems()">' ;
for ( var ci in categories )
{
var c = categories [ ci ] ;
if ( ( c . id == 'emptyitems' ) || ( 'basecat' in c ) )
{
continue ;
}
html += '<option value="' + ci + '">' ;
html += htmlstring ( c . caption ) ;
html += '</option>' ;
}
html += '</select>' ;
html += '<div id="builderItemChooserDiv"> </div>' ;
document . getElementById ( 'buildings' ) . innerHTML = html ;
rebuildItems ( ) ;
}
function builderComposeItem ( )
{
var html = '' ;
2023-01-10 18:29:32 +02:00
html += 'Введите код предмета или ссылку на е г о изображение<br />' ;
2022-12-19 22:22:19 +02:00
html += '<select id="builderCategoryChooser">' ;
for ( var ci in categories )
{
var c = categories [ ci ] ;
if ( c . id == 'emptyitems' )
{
continue ;
}
html += '<option value="' + ci + '">' ;
html += htmlstring ( c . caption ) ;
html += '</option>' ;
}
html += '</select>' ;
html += '<br /><input id="builderItemComposeName" type="text" value="" />' ;
2023-01-10 18:29:32 +02:00
html += '<br /><input class="inpButton" type="button" value="Открыть в конструкторе" onclick="builderEditItem(true);" />' ;
2022-12-19 22:22:19 +02:00
document . getElementById ( 'buildings' ) . innerHTML = html ;
}
function dropItemFromCategoryItems ( c , o )
{
for ( var i = 0 ; i < c . items . length ; i ++ )
{
if ( c . items [ i ] == o )
{
delete c . items [ i ] ;
break ;
}
}
}
function builderDropItem ( )
{
var id = document . getElementById ( 'builderItemChooser' ) . value ;
var o = getObjectById ( id ) ;
delete o . upgrade [ id + '_fake' ] ;
var hasUpgrades = false ;
for ( var ui in o . upgrade )
{
hasUpgrades = true ;
break ;
}
if ( ! hasUpgrades )
{
delete o . upgrade ;
}
delete dressExData . fakes [ getJSName ( id ) ] ;
if ( 'fakebase' in o )
{
var c = categories [ o . category ] ;
dropItemFromCategoryItems ( c , o ) ;
for ( var ci in categories )
{
var oc = categories [ ci ] ;
if ( ( 'basecat' in oc ) && ( oc . basecat == c ) && ( oc . items != c . items ) )
{
dropItemFromCategoryItems ( oc , o ) ;
}
}
delete dressItems [ getJSName ( id ) ] ;
}
showBuilder ( ) ;
}
function builderForgotItem ( )
{
var html = '' ;
2023-01-10 18:29:32 +02:00
html += 'Выберите предмет для забывания<br />' ;
2022-12-19 22:22:19 +02:00
html += '<select id="builderItemChooser">' ;
var items = [ ] ;
for ( var fi in dressExData . fakes )
{
items . push ( getObjectById ( dressExData . fakes [ fi ] ) ) ;
}
for ( var iti in items )
{
var it = items [ iti ] ;
html += '<option value="' + it . id + '">' + htmlstring ( it . caption ) + '</option>' ;
}
html += '</select>' ;
2023-01-10 18:29:32 +02:00
html += '<br /><input class="inpButton" type="button" value="Забыть в конструкторе" onclick="builderDropItem();" />' ;
2022-12-19 22:22:19 +02:00
document . getElementById ( 'buildings' ) . innerHTML = html ;
}
function getBuilderCommands ( )
{
var html = '<table cellpadding="0" cellspacing="0" border="0"><tr>' ;
2023-01-10 18:29:32 +02:00
html += getCell2MenuItemHtml ( 'Модифицировать известный предмет' , 'builderChooseItem()' ) ;
2022-12-19 22:22:19 +02:00
html += getCell2MenuSeparatorHtml ( ) ;
2023-01-10 18:29:32 +02:00
html += getCell2MenuItemHtml ( 'Создать новый предмет' , 'builderComposeItem()' ) ;
2022-12-19 22:22:19 +02:00
html += getCell2MenuSeparatorHtml ( ) ;
2023-01-10 18:29:32 +02:00
html += getCell2MenuItemHtml ( 'Забыть сконструированный предмет' , 'builderForgotItem()' ) ;
2022-12-19 22:22:19 +02:00
html += '</table>' ;
return html ;
}
function getBuilderInnerHtml ( )
{
var html = '' ;
html += getBuilderCommands ( ) ;
html += '<div id="buildings">' ;
2023-01-10 18:29:32 +02:00
html += '<p><font color="red">Конструктор в режиме тестирования и реализации, использовать пока не рекомендуется.</font></p>' ;
html += '<p>Здесь Вы можете конструировать свои предметы или модифицировать существующие.</p>' ;
html += '<p>Р е с у р с полезен при изменениях в мире БК любым игрокам, а также перед оными для гейм-мастеров.</p>' ;
2022-12-19 22:22:19 +02:00
html += '</div>' ;
return html ;
}
function showBuilder ( )
{
var builderDiv = document . getElementById ( builderDivId ) ;
builderDiv . innerHTML = getBuilderInnerHtml ( ) ;
builderDiv . style . display = '' ;
}
function hideBuilder ( )
{
var builderDiv = document . getElementById ( builderDivId ) ;
builderDiv . style . display = 'none' ;
}
function recalcDresserWeaponState ( state , wslot )
{
var r = { } ;
var objid ;
var o ;
for ( var mfname in knownWeaponModifiersHash )
{
var mfvalue = 0 ;
for ( var sloti = 0 ; sloti < slots . length ; sloti ++ )
{
var slot = slots [ sloti ] ;
o = getObjectByStateSlot ( state , slot ) ;
if ( o == null )
{
continue ;
}
if ( ( 'modify' in o ) && ( mfname in o . modify ) )
{
mfvalue += parseInt ( o . modify [ mfname ] ) ;
}
}
for ( var seti = 0 ; seti < state . appliedSets . length ; seti ++ )
{
var set = state . appliedSets [ seti ] ;
if ( ( 'modify' in set ) && ( mfname in set . modify ) )
{
mfvalue += parseInt ( set . modify [ mfname ] ) ;
}
}
for ( var strgi = 0 ; strgi < state . appliedStrengthenings . length ; strgi ++ )
{
var strg = state . appliedStrengthenings [ strgi ] ;
if ( ( 'modify' in strg ) && ( mfname in strg . modify ) )
{
mfvalue += parseInt ( strg . modify [ mfname ] ) ;
}
}
o = getObjectByStateSlot ( state , wslot ) ;
if ( o != null )
{
if ( ( 'properties' in o ) && ( mfname in o . properties ) )
{
mfvalue += parseInt ( o . properties [ mfname ] ) ;
}
}
if ( o == null && wslot . id != 'w3' )
{
continue ;
}
r [ mfname ] = mfvalue ;
}
for ( var powerupn in state . spellPowerUps )
{
if ( powerupn in knownECRPowerUps )
{
var epowerup = knownECRPowerUps [ powerupn ] ;
if ( epowerup . modify in knownWeaponModifiersHash )
{
r [ epowerup . modify ] += epowerup . v ;
}
}
}
return r ;
}
function calculateBaseWeaponIndices ( state , wslot , o )
{
var strength = 0 ;
var mindamage = 0 ;
var maxdamage = 0 ;
var postmindamage = 0 ;
var postmaxdamage = 0 ;
var powermf = 0 ;
var magicpowermf = 0 ;
var skill = getWeaponSkillValue ( state , wslot ) ;
var attacks = getAttackFreq ( o ) ;
for ( var sloti = 0 ; sloti < slots . length ; sloti ++ )
{
var slot = slots [ sloti ] ;
if ( slot == wslot ) continue ;
var so = getObjectByStateSlot ( state , slot ) ;
if ( so == null )
{
continue ;
}
if ( 'modify' in so )
{
if ( 'mindamage' in so . modify )
{
postmindamage += parseInt ( so . modify . mindamage ) ;
}
if ( 'maxdamage' in so . modify )
{
postmaxdamage += parseInt ( so . modify . maxdamage ) ;
}
}
}
for ( var i = 0 ; i < state . appliedStrengthenings . length ; i ++ )
{
var strengthening = state . appliedStrengthenings [ i ] ;
if ( 'modify' in strengthening )
{
if ( 'mindamage' in strengthening . modify )
{
postmindamage += parseInt ( strengthening . modify . mindamage ) ;
}
if ( 'maxdamage' in strengthening . modify )
{
postmaxdamage += parseInt ( strengthening . modify . maxdamage ) ;
}
}
}
if ( o != null )
{
if ( 'modify' in o )
{
if ( 'mindamage' in o . modify )
{
mindamage += parseInt ( o . modify . mindamage ) ;
}
if ( 'maxdamage' in o . modify )
{
maxdamage += parseInt ( o . modify . maxdamage ) ;
}
}
if ( 'properties' in o )
{
if ( 'mindamage' in o . properties )
{
mindamage += parseInt ( o . properties . mindamage ) ;
}
if ( 'maxdamage' in o . properties )
{
maxdamage += parseInt ( o . properties . maxdamage ) ;
}
}
}
// mindamage += state.natural.level;
// maxdamage += state.natural.level;
if ( o != null )
{
if ( isTwohandledWeapon ( o ) )
{
skill *= 1.2 ;
}
var statBonuses = categories [ o . category ] . statBonuses ;
if ( statBonuses != null )
{
for ( var statName in statBonuses )
{
if ( statName in state . results )
{
var bonus = ( state . results [ statName ] * statBonuses [ statName ] ) / 100.0 ;
strength += bonus ;
}
}
}
}
else
{
// test no weapons
if ( wslot . id == 'w3' && getObjectByStateSlot ( state , slot _w10 ) == null )
{
mindamage += 2 ;
maxdamage += 4 ;
if ( 'strength' in state . results )
{
strength += state . results . strength ;
}
if ( strength <= 100 )
{
strength *= 2 ;
}
else
{
strength += 100 ;
}
}
}
if ( hasTwohandledWeapon ( state ) )
{
strength *= 1.1 ;
}
var cpower = 0 ;
if ( 'criticalpower' in state [ wslot . id + 'props' ] )
{
cpower = state [ wslot . id + 'props' ] . criticalpower ;
if ( 'criticalpower' in state . natural )
{
cpower += state . natural . criticalpower ;
}
}
else if ( 'criticalpower' in state . results )
{
cpower = state . results . criticalpower ;
}
for ( var delixn in state . damageElixes )
{
var delix = knownDamageElix [ delixn ] ;
if ( ! ( 'modify' in delix ) ) continue ;
if ( 'power' in delix . modify )
{
powermf += delix . modify . power ;
}
if ( 'magicpower' in delix . modify )
{
magicpowermf += delix . modify . magicpower ;
}
if ( 'damage1' in delix . modify )
{
postmindamage += delix . modify . damage1 ;
}
if ( 'damage2' in delix . modify )
{
postmaxdamage += delix . modify . damage2 ;
}
}
return { strength : strength , skill : skill , mindamage : mindamage , maxdamage : maxdamage , cpower : cpower , attacks : attacks , powermf : powermf , magicpowermf : magicpowermf , postmindamage : postmindamage , postmaxdamage : postmaxdamage } ;
}
function getPowerMfValue ( state , wslot , powermfn )
{
var powerMfValue = 0 ;
if ( powermfn in state [ wslot . id + 'props' ] )
{
powerMfValue = state [ wslot . id + 'props' ] [ powermfn ] ;
if ( powermfn in state . natural )
{
powerMfValue += state . natural [ powermfn ] ;
}
}
else if ( powermfn in state . results )
{
powerMfValue = state . results [ powermfn ] ;
}
return powerMfValue ;
}
function calculateAttackDamage ( state , wslot , o , baseIndices , attackn )
{
var attack = baseIndices . attacks [ attackn ] ;
var k1 = 1 + ( baseIndices . strength / 300.0 ) ;
var k2 = 1 + ( baseIndices . skill * 0.075 ) ;
var k4 = 0.97 ;
var k2e = 1 ;
var mindamage = baseIndices . mindamage + ( baseIndices . strength / 5 ) ;
var maxdamage = baseIndices . maxdamage + ( baseIndices . strength / 5 ) ;
if ( mindamage < 0 || mindamage > maxdamage )
{
mindamage = 0 ;
}
var powermfn = attackn + 'power' ;
var powerMfValue = baseIndices . powermf ;
if ( attack . elemental )
{
powermfn = attackn + 'magicpower' ;
var estrength = 0 ;
for ( var powerupn in state . spellPowerUps )
{
if ( ! ( powerupn in knownPowerUps ) )
{
continue ;
}
var powerup = knownPowerUps [ powerupn ] ;
if ( powerup . damageup && ( 'element' in powerup ) )
{
if ( attackn != powerup . element )
{
continue ;
}
estrength = baseIndices . strength * 0.01 * state . spellPowerUps [ powerupn ] ;
}
}
var eskill = getWeaponSkillValueOf ( state , o , ( attackn + 'magicskill' ) ) ;
k2e += ( estrength / 300.0 ) + ( eskill * 0.050 ) ;
// k2 = 1 + ((k2 - 1) / 2);
powerMfValue += getPowerMfValue ( state , wslot , 'magicpower' ) ;
powerMfValue += baseIndices . magicpowermf ;
}
// else
// {
powerMfValue += getPowerMfValue ( state , wslot , 'power' ) ;
// }
powerMfValue += getPowerMfValue ( state , wslot , powermfn ) ;
mindamage *= k1 * k2 ;
maxdamage *= k1 * k2 ;
var k3 = 1 + ( powerMfValue / 100.0 ) ;
var damage1 = mindamage * k2e * k3 * k4 ;
var damage2 = maxdamage * k2e * k3 * k4 ;
mindamage += baseIndices . postmindamage ;
maxdamage += baseIndices . postmaxdamage ;
damage1 += baseIndices . postmindamage ;
damage2 += baseIndices . postmaxdamage ;
var cdamage1 = ( damage1 + damage1 ) * ( 1 + ( baseIndices . cpower / 100.0 ) ) ;
var cdamage2 = ( damage2 + damage2 ) * ( 1 + ( baseIndices . cpower / 100.0 ) ) ;
return {
id : attackn ,
attack : attack ,
damage : { minv : mindamage , maxv : maxdamage } ,
mfdamage : { minv : damage1 , maxv : damage2 } ,
mfcdamage : { minv : cdamage1 , maxv : cdamage2 } ,
postdamage : { minv : baseIndices . postmindamage , maxv : baseIndices . postmaxdamage } ,
_power _v : powerMfValue
} ;
}
function addToDamage ( averages , concrete , percentage )
{
averages . minv += concrete . minv * percentage / 100.0 ;
averages . maxv += concrete . maxv * percentage / 100.0 ;
}
function floorDamage ( damage )
{
damage . minv = Math . floor ( damage . minv + 0.5 ) ;
damage . maxv = Math . floor ( damage . maxv + 0.5 ) ;
}
function floorDamages ( damages )
{
floorDamage ( damages . damage ) ;
floorDamage ( damages . mfdamage ) ;
floorDamage ( damages . mfcdamage ) ;
}
function recalcDresserWeaponAdvState ( state , wslot )
{
var o = getObjectByStateSlot ( state , wslot ) ;
var baseIndices = calculateBaseWeaponIndices ( state , wslot , o ) ;
if ( 'spell_powerup10' in state . spellPowerUps )
{
baseIndices . strength *= 1 + ( 0.01 * state . spellPowerUps . spell _powerup10 ) ;
}
baseIndices . mindamage += ( baseIndices . strength / 3 ) ;
baseIndices . maxdamage += ( baseIndices . strength / 3 ) ;
// calculate averages in parallel
var finalData = { } ;
var averages = { damage : { minv : 0 , maxv : 0 } , mfdamage : { minv : 0 , maxv : 0 } , mfcdamage : { minv : 0 , maxv : 0 } } ;
for ( var attackn in baseIndices . attacks )
{
var fd = calculateAttackDamage ( state , wslot , o , baseIndices , attackn ) ;
addToDamage ( averages . damage , fd . damage , fd . attack . real ) ;
addToDamage ( averages . mfdamage , fd . mfdamage , fd . attack . real ) ;
addToDamage ( averages . mfcdamage , fd . mfcdamage , fd . attack . real ) ;
floorDamages ( fd ) ;
finalData [ attackn ] = fd ;
}
floorDamages ( averages ) ;
state [ wslot . id + 'props' ] . damage = averages . damage ;
state [ wslot . id + 'props' ] . mfdamage = averages . mfdamage ;
state [ wslot . id + 'props' ] . mfcdamage = averages . mfcdamage ;
state [ wslot . id + 'props' ] . damages = finalData ;
}
function recalcDresserCombatSpellsState ( state )
{
var spellsFound = { } ;
for ( var spellBase in combatSpells )
{
var spello = combatSpells [ spellBase ] ;
for ( var sloti = 0 ; sloti < slots . length ; sloti ++ )
{
var slot = slots [ sloti ] ;
var o = getObjectByStateSlot ( state , slot ) ;
if ( o == null )
{
continue ;
}
if ( o . id . substr ( 0 , spello . id . length ) == spello . id && ( 'required' in o ) && ( 'mana' in o . required ) )
{
var b = o . id . substr ( spello . id . length ) ;
spellsFound [ getJSName ( o . id ) ] = { spell : o , evd : spello , b : parseInt ( b ) } ;
}
}
}
state . combatSpells = { } ;
for ( var sid in spellsFound )
{
var spell = spellsFound [ sid ] ;
var skillname = spell . evd . magic + 'magicskill' ;
var maxdamage = spell . b ;
var skill = state . results [ skillname ] ;
maxdamage += state . natural . level ;
var mf1 = 1 + ( skill * 0.072 ) ;
var mf2 = 1 ;
mf2 += state . results [ spell . evd . magic + 'magicpower' ] * 0.01 ;
if ( spell . evd . elemental )
{
mf2 += state . results [ 'magicpower' ] * 0.01 ;
}
maxdamage *= mf1 ;
maxdamage *= mf2 ;
maxdamage *= 0.97 ;
if ( maxdamage > ( spell . b * 10 ) )
{
maxdamage = spell . b * 10 ;
}
var mindamage = ( spell . evd . minzero ? 0.0 : ( maxdamage * 0.9 ) )
maxdamage *= 1.02 ;
var mincdamage = mindamage * spell . evd . critMultiplier ;
var maxcdamage = maxdamage * spell . evd . critMultiplier ;
state . combatSpells [ spell . spell . id ] = { magic _damage : { minv : Math . floor ( mindamage ) , maxv : Math . floor ( maxdamage ) } , magic _cdamage : { minv : Math . floor ( mincdamage ) , maxv : Math . floor ( maxcdamage ) } } ;
}
}
function calcResults ( state )
{
for ( var mfname in item _props )
{
if ( mfname in knownZoneModifiers )
{
continue ;
}
var vm = state . modify [ mfname ] ;
var vn = state . natural [ mfname ] ;
state . results [ mfname ] = ( vm + vn ) ;
}
}
function calcArmors ( state )
{
var avgarmor1 = 0 ;
var avgarmor2 = 0 ;
for ( var mfname in knownArmorModifiers )
{
if ( mfname == 'avgarmor' )
{
continue ;
}
var mina = 0 ;
var maxa = 0 ;
for ( var sloti = 0 ; sloti < slots . length ; sloti ++ )
{
var slot = slots [ sloti ] ;
var o = getObjectByStateSlot ( state , slot ) ;
if ( o == null || ! ( 'modify' in o ) )
{
continue ;
}
if ( ( mfname + '1' ) in o . modify )
{
mina += parseInt ( o . modify [ mfname + '1' ] ) ;
maxa += parseInt ( o . modify [ mfname + '2' ] ) ;
}
else if ( mfname in o . modify )
{
mina += parseInt ( o . modify [ mfname ] ) ;
maxa += parseInt ( o . modify [ mfname ] ) ;
}
}
avgarmor1 += mina ;
avgarmor2 += maxa ;
state . results [ mfname + '1' ] = mina ;
state . results [ mfname + '2' ] = maxa ;
}
state . results . avgarmor1 = avgarmor1 / 4.0 ;
state . results . avgarmor2 = avgarmor2 / 4.0 ;
}
function applyDefElix ( state , makeUp , v )
{
switch ( makeUp )
{
case 'edefence' :
state . results . thrustdefence . all += v ;
state . results . sabredefence . all += v ;
state . results . crushdefence . all += v ;
state . results . cutdefence . all += v ;
break ;
case 'emagicdefence' :
state . modify . firemagicdefence += v ;
state . modify . airmagicdefence += v ;
state . modify . watermagicdefence += v ;
state . modify . earthmagicdefence += v ;
break ;
default :
if ( makeUp in knownZoneModifiers )
{
state . results [ makeUp ] . all += v ;
}
else
{
state . modify [ makeUp ] += v ;
}
break ;
}
}
function precalcZoneModifiers ( state )
{
for ( var mfname in knownZoneModifiers )
{
state . results [ mfname ] = { all : 0 , head : 0 , body : 0 , waist : 0 , leg : 0 , avg : 0 , pants : 0 } ;
}
state . results . defence . all = state . natural . endurance * 1.5 ;
}
function calcZoneModifiers ( state )
{
for ( var i = 0 ; i < slots . length ; i ++ )
{
var slot = slots [ i ] ;
var o = getObjectByStateSlot ( state , slot ) ;
if ( o == null )
{
continue ;
}
if ( 'modify' in o )
{
for ( var mfname in o . modify )
{
if ( mfname in knownZoneModifiers )
{
state . results [ mfname ] . all += parseInt ( o . modify [ mfname ] ) ;
}
}
}
if ( 'properties' in o )
{
for ( var mfname in o . properties )
{
if ( mfname in knownZoneModifiers )
{
state . results [ mfname ] [ slot . zone ] += parseInt ( o . properties [ mfname ] ) ;
}
}
}
}
for ( var i = 0 ; i < state . appliedSets . length ; i ++ )
{
var set = state . appliedSets [ i ] ;
if ( 'modify' in set )
{
for ( var mfname in set . modify )
{
if ( mfname in knownZoneModifiers )
{
state . results [ mfname ] . all += parseInt ( set . modify [ mfname ] ) ;
}
}
}
}
for ( var i = 0 ; i < state . appliedStrengthenings . length ; i ++ )
{
var strengthening = state . appliedStrengthenings [ i ] ;
if ( 'modify' in strengthening )
{
for ( var mfname in strengthening . modify )
{
if ( mfname in knownZoneModifiers )
{
state . results [ mfname ] . all += parseInt ( strengthening . modify [ mfname ] ) ;
}
}
}
}
for ( var delixn in state . defElixes )
{
var delix = knownDefElix [ delixn ] ;
if ( ! ( delix . makeUp in knownZoneModifiers ) && ! ( delix . makeUp == 'edefence' ) )
{
continue ;
}
var v = state . defElixes [ delixn ] ;
applyDefElix ( state , delix . makeUp , v ) ;
if ( 'makeUp2' in delix )
{
var v2 = getDefElixSecondValue ( delix , v ) ;
applyDefElix ( state , delix . makeUp2 , v2 ) ;
}
}
if ( 'spell_protect10' in state . spellPowerUps )
{
state . results . defence . all += state . spellPowerUps . spell _protect10 ;
}
for ( var mfname in knownZoneModifiers )
{
if ( mfname == 'defence' )
{
continue ;
}
var zones = state . results [ mfname ] ;
zones . all += state . results . defence . all ;
zones . head += state . results . defence . head ;
zones . body += state . results . defence . body ;
zones . waist += state . results . defence . waist ;
zones . leg += state . results . defence . leg ;
zones . pants += state . results . defence . pants ;
}
for ( var mfname in knownZoneModifiers )
{
var zones = state . results [ mfname ] ;
zones . head += zones . all ;
zones . body += zones . all ;
zones . waist += zones . all ;
zones . leg += zones . all ;
zones . waist += zones . pants ;
zones . leg += zones . pants ;
zones . avg = ( zones . head + zones . body + zones . waist + zones . leg ) / 4 ;
}
state . results . defence = { all : 0 , head : 0 , body : 0 , waist : 0 , leg : 0 , avg : 0 } ;
}
function recalcSpellPowerUpState ( state )
{
for ( var powerUp in knownPowerUps )
{
knownPowerUps [ powerUp ] . found = false ;
for ( var sloti = 0 ; sloti < slots . length ; sloti ++ )
{
var slot = slots [ sloti ] ;
var o = getObjectByStateSlot ( state , slot ) ;
knownPowerUps [ powerUp ] . found |= ( o != null && o . id == powerUp ) ;
}
if ( ! knownPowerUps [ powerUp ] . found )
{
continue ;
}
var v = ( 2.2 * state . results [ knownPowerUps [ powerUp ] . skill ] + 0.1 * state . natural . wisdom ) ;
if ( ! knownPowerUps [ powerUp ] . damageup )
{
v *= 2 ;
v /= 3 ;
}
var vself = v ;
if ( vself > 33 )
{
vself = 33 ;
}
vself = Math . floor ( vself * 100.0 + 0.5 ) / 100.0 ;
state . modify [ powerUp + '_self' ] = vself ;
var vother = vself * 0.75 ;
vother = Math . floor ( vother * 100.0 + 0.5 ) / 100.0 ;
state . modify [ powerUp + '_other' ] = vother ;
}
}
function recalcDresserCombatTricksState ( state )
{
state . combatTricks = { } ;
for ( var i = 0 ; i < state . trickSlots . length ; i ++ )
{
var trickn = state . trickSlots [ i ] ;
if ( trickn == null )
{
continue ;
}
state . combatTricks [ trickn ] = { } ;
}
for ( var trickn in state . combatTricks )
{
var trick = tricks [ trickn ] ;
var skillv = 0 ;
var power = state . results . magicpower ;
var manaconsumption = state . results . manaconsumption ;
var element = '' ;
if ( typeof ( trick ) == 'object' && ( 'required' in trick ) )
{
for ( mfn in trick . required )
{
if ( mfn . indexOf ( 'magicskill' ) > 0 )
{
skillv = state . results [ mfn ] ;
element = mfn . substr ( 0 , mfn . indexOf ( 'magicskill' ) ) ;
power += state . results [ element + 'magicpower' ] ;
break ;
}
}
}
if ( element != '' )
{
for ( var powerupn in state . spellPowerUps )
{
var v = state . spellPowerUps [ powerupn ] ;
var kpu = knownPowerUps [ powerupn ] ;
if ( ( kpu == null ) || ! kpu . damageup || ! ( 'element' in kpu ) || ( kpu . element != element ) )
{
continue ;
}
power += ( v * 2.0 / 3.0 ) ;
break ;
}
}
manaconsumption += ( skillv * 0.72 ) ;
var r = state . combatTricks [ trickn ] ;
r . name = trick . name ;
r . caption = trick . caption ;
if ( 'consumes' in trick )
{
if ( 'mana' in trick . consumes )
{
var mana = trick . consumes . mana ;
r . mana = Math . floor ( mana * ( 1.0 - ( manaconsumption / 100.0 ) ) + 0.5 ) ;
}
if ( 'spiritlevel' in trick . consumes )
{
r . spiritlevel = trick . consumes . spiritlevel ;
}
}
if ( 'attack' in trick )
{
if ( 'damage' in trick . attack )
{
r . mfdamage = Math . floor ( trick . attack . damage * ( 1.0 + ( power / 100.0 ) ) + 0.5 ) ;
}
if ( 'mindamage' in trick . attack )
{
r . mindamage = Math . floor ( trick . attack . mindamage * ( 1.0 + ( power / 100.0 ) ) + 0.5 ) ;
r . maxdamage = Math . floor ( trick . attack . maxdamage * ( 1.0 + ( power / 100.0 ) ) + 0.5 ) ;
}
if ( 'nextdamage' in trick . attack )
{
r . nextdamage = Math . floor ( trick . attack . nextdamage * ( 1.0 + ( power / 100.0 ) ) + 0.5 ) ;
r . nextturns = trick . attack . nextturns ;
}
}
if ( 'healing' in trick )
{
if ( 'hitpoints' in trick . healing )
{
r . hitpoints = Math . floor ( trick . healing . hitpoints * ( 1.0 + ( power / 100.0 ) ) + 0.5 ) ;
}
if ( 'minhitpoints' in trick . healing )
{
r . minhitpoints = Math . floor ( trick . healing . minhitpoints * ( 1.0 + ( power / 100.0 ) ) + 0.5 ) ;
r . maxhitpoints = Math . floor ( trick . healing . maxhitpoints * ( 1.0 + ( power / 100.0 ) ) + 0.5 ) ;
}
if ( 'nexthitpoints' in trick . healing )
{
r . nexthitpoints = Math . floor ( trick . healing . nexthitpoints * ( 1.0 + ( power / 100.0 ) ) + 0.5 ) ;
r . nextturns = trick . healing . nextturns ;
}
}
}
}
function applyCommonSkillsTo ( chapter )
{
if ( 'weaponskill' in chapter )
{
for ( var i = 0 ; i < knownWeaponSkills . length ; i ++ )
{
var skilln = knownWeaponSkills [ i ] ;
if ( skilln == 'staffskill' )
{
continue ;
}
if ( ! ( skilln in chapter ) )
{
chapter [ skilln ] = 0 ;
}
chapter [ skilln ] += chapter . weaponskill ;
}
chapter . weaponskill = 0 ;
}
if ( 'magicskill' in chapter )
{
for ( var i = 0 ; i < naturalElements . length ; i ++ )
{
var skilln = naturalElements [ i ] + 'magicskill' ;
if ( ! ( skilln in chapter ) )
{
chapter [ skilln ] = 0 ;
}
chapter [ skilln ] += chapter . magicskill ;
}
chapter . magicskill = 0 ;
}
if ( 'magicpower' in chapter )
{
for ( var i = 0 ; i < allElements . length ; i ++ )
{
var powern = allElements [ i ] + 'magicpower' ;
if ( ! ( powern in chapter ) )
{
chapter [ powern ] = 0 ;
}
chapter [ powern ] += chapter . magicpower ;
}
chapter . magicpower = 0 ;
}
}
function applyCommonSkills ( state )
{
// applyCommonSkillsTo(state.natural);
applyCommonSkillsTo ( state . modify ) ;
applyCommonSkillsTo ( state . results ) ;
}
function recalcDresserState ( state )
{
var objid ;
var o ;
var propi ;
var sloti ;
var slot ;
var set ;
state . required = { } ;
state . modify = { } ;
state . results = { } ;
state . battlemf = { } ;
state . w3props = { } ;
state . w10props = { } ;
state . appliedSets = [ ] ;
state . appliedStrengthenings = [ ] ;
for ( var mfname in item _props )
{
if ( mfname in knownZoneModifiers )
{
continue ;
}
if ( ! ( mfname in state . natural ) )
{
state . natural [ mfname ] = 0 ;
}
if ( ! ( mfname in state . modify ) )
{
state . modify [ mfname ] = 0 ;
}
}
state . natural . hitpoints = ( state . natural . endurance * 6 ) ;
state . natural . knapsack = 40 * ( state . natural . level + 1 ) + state . natural . endurance ;
state . natural . magicdefence = ( state . natural . endurance * 1.5 ) ;
state . natural . defence = ( state . natural . endurance * 1.5 ) ;
state . natural . mana = ( state . natural . wisdom * 10 ) ;
state . natural . spiritlevel = 0 ;
var ls = state . natural . level ;
if ( ls > 6 )
{
if ( ls > 10 )
{
ls = 10 ;
}
state . natural . spiritlevel += ( ls - 6 ) * 10 ;
}
state . natural . counterstroke = dressOptions . newCapEdition ? 20 : 10 ;
state . natural . piercearmor = dressOptions . newCapEdition ? 20 : 5 ;
state . natural . attackcount = 1 ;
state . modify . attackcount = getAttackCount ( state ) - 1 ;
state . natural . blockcount = 2 ;
state . modify . blockcount = getBlockCount ( state ) - 2 ;
for ( var i = 0 ; i < naturalElements . length ; i ++ )
{
state . natural [ naturalElements [ i ] + 'magicdefence' ] = 0 ;
}
for ( var i = 0 ; i < allElements . length ; i ++ )
{
state . natural [ allElements [ i ] + 'magicpower' ] = state . natural . intellect * 0.5 ;
}
if ( 'spirituality' in state . natural )
{
state . natural . spiritlevel += state . natural . spirituality ;
}
state . modify . knapsack = 0 ;
if ( state . statElix != null )
{
var mf = knownElix [ state . statElix . elixn ] . makeUp ;
state . modify [ mf ] = state . statElix . v ;
if ( 'makeUp2' in knownElix [ state . statElix . elixn ] )
{
var mf2 = knownElix [ state . statElix . elixn ] . makeUp2 ;
state . modify [ mf2 ] = knownElix [ state . statElix . elixn ] . values2 [ 0 ] ;
}
}
if ( state . spellIntel != 0 )
{
state . modify . intellect = state . spellIntel + ( ( 'intellect' in state . modify ) ? state . modify . intellect : 0 ) ;
}
if ( state . spellBD != 0 )
{
state . modify . strength = state . spellBD + ( ( 'strength' in state . modify ) ? state . modify . strength : 0 ) ;
state . modify . dexterity = state . spellBD + ( ( 'dexterity' in state . modify ) ? state . modify . dexterity : 0 ) ;
state . modify . intuition = state . spellBD + ( ( 'intuition' in state . modify ) ? state . modify . intuition : 0 ) ;
state . modify . intellect = state . spellBD + ( ( 'intellect' in state . modify ) ? state . modify . intellect : 0 ) ;
state . modify . hitpoints = state . spellBD * 6 + ( ( 'hitpoints' in state . modify ) ? state . modify . hitpoints : 0 ) ;
}
if ( state . spellHitpoints != 0 )
{
state . modify . hitpoints = ( state . natural . endurance * state . spellHitpoints ) + ( ( 'hitpoints' in state . modify ) ? state . modify . hitpoints : 0 ) ;
}
var w3o = getObjectByStateSlot ( state , slot _w3 ) ;
var w10o = getObjectByStateSlot ( state , slot _w10 ) ;
//dressStrengthenings.neutralPower.modify.mindamage = state.natural.level;
//dressStrengthenings.neutralPower.modify.maxdamage = state.natural.level;
for ( var setn in dressSets )
{
set = dressSets [ setn ] ;
var countFound = getCountForSet ( state , set . id ) ;
if ( ! ( 'details' in set ) || ( countFound == 0 ) )
{
continue ;
}
for ( var scn in set . details )
{
var sc = set . details [ scn ] ;
if ( 'required' in sc )
{
if ( 'itemscount' in sc . required )
{
if ( ! ( 'caption' in sc ) )
{
sc . caption = set . caption + ' (<span style="color:green;">' + sc . required . itemscount + '</span>)' ;
}
if ( sc . required . itemscount == countFound )
{
state . appliedSets . push ( sc ) ;
}
}
else if ( ( 'minitemscount' in sc . required ) && ( 'maxitemscount' in sc . required ) )
{
if ( ! ( 'caption' in sc ) )
{
sc . caption = set . caption + ' (<span style="color:green;">' + sc . required . minitemscount + ' - ' + sc . required . maxitemscount + '</span>)' ;
}
if ( ( countFound >= sc . required . minitemscount ) && ( countFound <= sc . required . maxitemscount ) )
{
state . appliedSets . push ( sc ) ;
}
}
}
}
}
for ( sloti = 0 ; sloti < slots . length ; sloti ++ )
{
slot = slots [ sloti ] ;
o = getObjectByStateSlot ( state , slot ) ;
if ( o == null )
{
continue ;
}
if ( 'required' in o )
{
for ( var mfname in o . required )
{
if ( mfname in knownZoneModifiers )
{
continue ;
}
var v = parseInt ( o . required [ mfname ] ) ;
if ( ! ( mfname in state . required ) || ( state . required [ mfname ] < v ) )
{
state . required [ mfname ] = v ;
}
}
}
if ( 'modify' in o )
{
for ( var mfname in o . modify )
{
if ( mfname in knownZoneModifiers )
{
continue ;
}
state . modify [ mfname ] += parseInt ( o . modify [ mfname ] ) ;
}
}
}
for ( var tricki = 0 ; tricki < state . trickSlots . length ; tricki ++ )
{
var trickn = state . trickSlots [ tricki ] ;
if ( trickn == null )
{
continue ;
}
o = tricks [ getJSName ( trickn ) ] ;
if ( o == null )
{
continue ;
}
if ( 'required' in o )
{
for ( var mfname in o . required )
{
if ( mfname in knownZoneModifiers )
{
continue ;
}
var v = parseInt ( o . required [ mfname ] ) ;
if ( ! ( mfname in state . required ) || ( state . required [ mfname ] < v ) )
{
state . required [ mfname ] = v ;
}
}
}
}
for ( var seti = 0 ; seti < state . appliedSets . length ; seti ++ )
{
set = state . appliedSets [ seti ] ;
if ( 'required' in set )
{
for ( var mfname in set . required )
{
if ( mfname in knownZoneModifiers )
{
continue ;
}
var v = parseInt ( set . required [ mfname ] ) ;
if ( ! ( mfname in state . required ) || ( state . required [ mfname ] < v ) )
{
state . required [ mfname ] = v ;
}
}
}
if ( 'modify' in set )
{
for ( var mfname in set . modify )
{
if ( mfname in knownZoneModifiers )
{
continue ;
}
state . modify [ mfname ] += parseInt ( set . modify [ mfname ] ) ;
}
}
}
if ( state . pet != null )
{
var pet = pets [ state . pet . n ] ;
var pl = pet . levels [ 'L' + state . pet . level ] ;
if ( 'skill' in pl )
{
if ( 'modify' in pl . skill )
{
for ( var mfname in pl . skill . modify )
{
state . battlemf [ mfname ] = pl . skill . modify [ mfname ] ;
state . modify [ mfname ] += pl . skill . modify [ mfname ] ;
}
}
}
}
// preliminary results.
for ( var powerupn in state . spellPowerUps )
{
if ( powerupn in knownPowerUps )
{
var powerup = knownPowerUps [ powerupn ] ;
if ( ! powerup . damageup )
{
state . modify [ powerup . element + 'magicdefence' ] += state . spellPowerUps [ powerupn ] ;
}
else
{
state . modify [ powerup . element + 'magicpower' ] += state . spellPowerUps [ powerupn ] ;
}
}
if ( powerupn in knownECRPowerUps )
{
var epowerup = knownECRPowerUps [ powerupn ] ;
if ( ! ( epowerup . modify in knownZoneModifiers ) )
{
if ( ! ( epowerup . modify in knownWeaponModifiersHash ) )
{
state . modify [ epowerup . modify ] += epowerup . v ;
}
}
}
}
calcResults ( state ) ;
state . natural . criticalhit = state . natural . anticriticalhit = ( state . results . intuition * 5 ) ;
state . natural . jumpaway = state . natural . antijumpaway = ( state . results . dexterity * 5 ) ;
for ( var delixn in state . damageElixes )
{
var delix = knownDamageElix [ delixn ] ;
if ( ! ( 'modify' in delix ) ) continue ;
if ( 'hitpoints' in delix . modify )
{
state . modify . hitpoints += delix . modify . hitpoints ;
}
}
for ( var strgn in dressStrengthenings )
{
var strg = dressStrengthenings [ strgn ] ;
if ( dressOptions . newCapEdition )
{
if ( strg . domain == 'ru' ) continue ;
}
else
{
if ( strg . domain == 'com' ) continue ;
}
var strgOk = true ;
if ( 'required' in strg )
{
for ( var mfname in strg . required )
{
var rvmin = parseInt ( strg . required [ mfname ] ) ;
var rvmax = rvmin + 24 ;
if ( strgn == 'spirituality50' )
{
rvmax = 99 ;
}
if ( dressOptions . newCapEdition )
{
rvmax = 10000 ;
}
if ( ! ( mfname in state . results ) || ( state . results [ mfname ] < rvmin ) || ( ( rvmin < 125 ) && ( state . results [ mfname ] > rvmax ) ) )
{
strgOk = false ;
break ;
}
}
if ( strgOk )
{
if ( 'zodiacs' in strg )
{
strgOk = false ;
var zv = parseInt ( state . sign ) ;
if ( ! isNaN ( zv ) && ( zv >= 1 ) && ( zv <= 12 ) )
{
for ( var zn in strg . zodiacs )
{
var z = strg . zodiacs [ zn ] ;
if ( zv == parseInt ( z . value ) )
{
strgOk = true ;
break ;
}
}
}
}
}
}
if ( strgOk )
{
state . appliedStrengthenings . push ( strg ) ;
}
}
for ( propi = 0 ; propi < knownCleanModifiers . length ; propi ++ )
{
var mfname = knownCleanModifiers [ propi ] ;
if ( mfname == '-' )
{
continue ;
}
var mfvalue = ( mfname in state . modify ) ? state . modify [ mfname ] : 0 ;
for ( var strgi = 0 ; strgi < state . appliedStrengthenings . length ; strgi ++ )
{
var strg = state . appliedStrengthenings [ strgi ] ;
if ( ( 'modify' in strg ) && ( mfname in strg . modify ) )
{
mfvalue += parseInt ( strg . modify [ mfname ] ) ;
}
}
state . modify [ mfname ] = mfvalue ;
}
if ( ( w10o != null ) && w10o . slot == slot _w10 . id )
{
if ( ( 'properties' in w10o ) && ( 'shieldblock' in w10o . properties ) )
{
state . modify . shieldblock += w10o . properties . shieldblock ;
}
}
// final results
/ * i f ( ' s t r e n g t h ' i n s t a t e . m o d i f y )
{
state . modify . knapsack = ( state . modify . strength * 4 ) ;
}
if ( 'strength' in state . battlemf )
{
state . modify . knapsack -= ( state . battlemf . strength * 4 ) ;
} * /
state . natural . consumed _reward = ( 10000 * state . natural . pskil ) ;
state . natural . consumed _reward += ( 2000 * state . natural . pstat ) + ( 50 * ( state . natural . pstat * ( state . natural . pstat - 1 ) ) ) ;
state . modify . consumed _reward = 0 ;
state . natural . totalstats = 0 ;
state . modify . totalstats = 0 ;
for ( propi = 0 ; propi < knownStats . length ; propi ++ )
{
var stname = knownStats [ propi ] ;
state . natural . totalstats += state . natural [ stname ] ;
state . modify . totalstats += state . modify [ stname ] ;
}
state . modify . totalprice = 0 ;
state . modify . totaleprice = 0 ;
state . modify . totalweight = 0 ;
for ( sloti = 0 ; sloti < slots . length ; sloti ++ )
{
slot = slots [ sloti ] ;
o = getObjectByStateSlot ( state , slot ) ;
if ( o == null || ! ( 'common' in o ) )
{
continue ;
}
if ( 'price' in o . common )
{
state . modify . totalprice += o . common . price ;
}
if ( 'eprice' in o . common )
{
state . modify . totaleprice += o . common . eprice ;
}
if ( 'weight' in o . common )
{
state . modify . totalweight += o . common . weight ;
}
else
{
state . modify . totalweight += 1 ;
}
}
state . modify . totalprice = Math . floor ( state . modify . totalprice * 100.0 + 0.5 ) / 100.0 ;
state . modify . totaleprice = Math . floor ( state . modify . totaleprice * 100.0 + 0.5 ) / 100.0 ;
state . modify . totalweight = Math . floor ( state . modify . totalweight * 100.0 + 0.5 ) / 100.0 ;
var bothSkill = getWeaponSkillValue ( state , slot _w3 ) + getWeaponSkillValue ( state , slot _w10 ) ;
//state.natural.parry = (bothSkill * 0.5);
calcArmors ( state ) ;
precalcZoneModifiers ( state ) ;
for ( var powerupn in state . spellPowerUps )
{
if ( powerupn in knownECRPowerUps )
{
var epowerup = knownECRPowerUps [ powerupn ] ;
if ( epowerup . modify in knownZoneModifiers )
{
state . results [ epowerup . modify ] . head += epowerup . v ;
state . results [ epowerup . modify ] . body += epowerup . v ;
state . results [ epowerup . modify ] . waist += epowerup . v ;
state . results [ epowerup . modify ] . leg += epowerup . v ;
state . results [ epowerup . modify ] . avg += epowerup . v ;
}
}
}
calcZoneModifiers ( state ) ;
recalcSpellPowerUpState ( state ) ;
for ( var delixn in state . defElixes )
{
var delix = knownDefElix [ delixn ] ;
var v = state . defElixes [ delixn ] ;
applyDefElix ( state , delix . makeUp , v ) ;
if ( 'makeUp2' in delix )
{
var v2 = getDefElixSecondValue ( delix , v ) ;
applyDefElix ( state , delix . makeUp2 , v2 ) ;
}
}
// updating magic skills from natural intellect
for ( var i = 0 ; i < allElements . length ; i ++ )
{
var mfvalue = ( ( allElements [ i ] + 'magicpower' ) in state . modify ) ? state . modify [ allElements [ i ] + 'magicpower' ] : 0 ;
if ( 'intellect' in state . modify )
{
mfvalue += state . modify . intellect * 0.5 ;
}
state . modify [ allElements [ i ] + 'magicpower' ] = mfvalue ;
}
calcResults ( state ) ;
applyCommonSkills ( state ) ;
recalcDresserCombatSpellsState ( state ) ;
recalcDresserCombatTricksState ( state ) ;
calcResults ( state ) ;
state . w3props = recalcDresserWeaponState ( state , slot _w3 ) ;
recalcDresserWeaponAdvState ( state , slot _w3 ) ;
if ( w10o != null && w10o . slot == slot _w3 . id )
{
state . w10props = recalcDresserWeaponState ( state , slot _w10 ) ;
recalcDresserWeaponAdvState ( state , slot _w10 ) ;
}
}
function showInfoPane ( state )
{
if ( state == null )
{
state = activeState ;
}
if ( state == null )
{
return ;
}
document . getElementById ( 'infopane' + state . id ) . innerHTML = getDresserInfoPaneHtml ( state ) ;
}
// call when changes only in other cabs
function fastUpdateDresserState ( state )
{
if ( state == null )
{
return ;
}
recalcDresserState ( state ) ;
showInfoPane ( state ) ;
updateDresserNaturalEditors ( state ) ;
showDressHint ( ) ;
}
function updateDresserState ( state )
{
if ( state == null )
{
state = activeState ;
}
if ( state == null )
{
return ;
}
fastUpdateDresserState ( state ) ;
setMeter ( state , hpMeterSuffix , state . results . hitpoints ) ;
setMeter ( state , manaMeterSuffix , ( 'mana' in state . results ) ? state . results . mana : 0 ) ;
var nickelt = document . getElementById ( 'nick' + state . id ) ;
if ( nickelt )
{
nickelt . innerHTML = getPersNickString ( state ) ;
}
}
function hardUpdateDresserState ( state )
{
recalcDresserState ( state ) ;
document . getElementById ( 'cab_' + state . id ) . innerHTML = getDresserInnerHtml ( state ) ;
}
var updateDresserStateWantedTimer = null ;
function updateDresserStateWanted ( )
{
if ( updateDresserStateWantedTimer != null )
{
clearTimeout ( updateDresserStateWantedTimer ) ;
updateDresserStateWantedTimer = null ;
}
updateDresserStateWantedTimer = setTimeout ( "updateDresserState()" , 300 ) ;
}
function preloadImages ( )
{
informAboutProgress ( localizer . startPreloadImages ) ;
var img = new Image ( 18 , 16 ) ;
if ( ! ( 'artefact' in imagesToBeLoaded ) )
{
img . src = baseImgPath + 'artefact.gif' ;
imagesToBeLoaded [ 'artefact' ] = img ;
}
for ( var catid in categories )
{
for ( var j = 0 ; j < categories [ catid ] . items . length ; j ++ )
{
var item = categories [ catid ] . items [ j ] ;
var jsName = getJSName ( item . id ) ;
if ( ! ( jsName in imagesToBeLoaded ) )
{
img = new Image ( item . width , item . height ) ;
img . src = itemImgPath + item . id + '.gif' ;
imagesToBeLoaded [ jsName ] = img ;
}
}
}
informAboutProgress ( localizer . completePreloadImages ) ;
}
var preloadImagesWantedTimer = null ;
function preloadImagesWanted ( state )
{
if ( preloadImagesWantedTimer != null )
{
clearTimeout ( preloadImagesWantedTimer ) ;
preloadImagesWantedTimer = null ;
}
preloadImagesWantedTimer = setTimeout ( 'preloadImages()' , preloadImagesDelay ) ;
}
function getSlotById ( slotid )
{
for ( var i = 0 ; i < slots . length ; i ++ )
{
if ( slots [ i ] . id == slotid )
{
return slots [ i ] ;
}
}
return null ;
}
function getSlotByIndex ( sloti )
{
for ( var i = 0 ; i < slots . length ; i ++ )
{
if ( slots [ i ] . index == sloti )
{
return slots [ i ] ;
}
}
return null ;
}
function getObjectIdOfSlot ( state , slotid )
{
return state . objects [ getSlotById ( slotid ) . index ] ;
}
function hasTwohandledWeapon ( state )
{
var w3o = getObjectByStateSlot ( state , slot _w3 ) ;
return isTwohandledWeapon ( w3o ) ;
}
function DropAllScrolls ( state )
{
for ( var isScrollSlot = 100 ; isScrollSlot <= 109 ; isScrollSlot ++ )
{
setObjectForSlot ( dressStates [ state ] , 'w' + isScrollSlot , null ) ;
}
}
function setObjectForSlot ( state , slotid , objid )
{
var slot = getSlotById ( slotid ) ;
if ( state == null || slot == null )
{
return ;
}
var oimg = ( objid == null ) ? slotid : objid ;
var o = getObjectById ( objid ) ;
var realItemImgPath = getRealImagePath ( objid , slot ) ;
// drop incompatible items.
if ( slotid == 'w10' && objid != null && hasTwohandledWeapon ( state ) )
{
onObjectDrop ( state . id , 'w3' ) ;
}
if ( slotid == 'w3' && objid != null && isTwohandledWeapon ( o ) )
{
onObjectDrop ( state . id , 'w10' ) ;
}
// dresser is fully rebuilt and transition applied later.
var imgElt = document . getElementById ( state . id . toString ( ) + slot . id ) ;
var needRebuild = ( imgElt == null ) ;
if ( slotid == 'w4' )
{
// unfit armor if fitted before.
state . fitArmor = false ;
}
state . fitSlots [ slot . index ] = null ;
state . upgradeSlots [ slot . index ] = null ;
state . charmSlots [ slot . index ] = null ;
state . addSlots [ slot . index ] = null ;
state . runeSlots [ slot . index ] = null ;
if ( slotid == 'w3' )
{
state . w3sharp = 0 ;
}
if ( slotid == 'w10' )
{
state . w10sharp = 0 ;
}
state . objCache [ slot . index ] = null ;
if ( needRebuild )
{
document . getElementById ( 'cab_' + state . id ) . innerHTML = getDresserInnerHtml ( state ) ;
}
state . objects [ slot . index ] = objid ;
if ( ( o != null ) && ( 'fakebase' in o ) )
{
state . upgradeSlots [ slot . index ] = objid + '_fake' ;
}
updateDresserSlot ( state , slot ) ;
}
function getFittedArmor ( armorObject )
{
var fittedArmor = cloneObject ( armorObject ) ;
if ( ! ( 'modify' in fittedArmor ) )
{
fittedArmor . modify = { hitpoints : 0 } ;
}
else if ( ! ( 'hitpoints' in fittedArmor . modify ) )
{
fittedArmor . modify . hitpoints = 0 ;
}
var armorLevel = ( ( 'required' in fittedArmor ) && ( 'level' in fittedArmor . required ) ) ? parseInt ( fittedArmor . required . level ) : 0 ;
fittedArmor . modify . hitpoints += ( ( armorLevel + 1 ) * 6 ) ;
fittedArmor . armorWasFit = true ;
2023-01-10 18:29:32 +02:00
fittedArmor . destiny = 'Броня подогнана под персонажа' ;
2022-12-19 22:22:19 +02:00
return fittedArmor ;
}
function getFittedObject ( objectToFit , setIdToFit )
{
var fittedObject = cloneObject ( objectToFit ) ;
if ( ! ( 'setlink' in fittedObject ) )
{
fittedObject . setlink = { name : setIdToFit } ;
}
else
{
fittedObject . setlink . name = setIdToFit ;
}
fittedObject . wasFit = true ;
if ( 'common' in fittedObject )
{
var upgradePrice = 0 ;
if ( 'eprice' in fittedObject . common )
{
upgradePrice = Math . floor ( fittedObject . common . eprice * 20 + 0.5 ) / 100.0 ;
}
else if ( 'price' in fittedObject . common )
{
upgradePrice = Math . floor ( fittedObject . common . price * 4 + 0.5 ) / 100.0 ;
}
if ( upgradePrice > 0 )
{
if ( 'eprice' in fittedObject . common )
{
fittedObject . common . eprice += upgradePrice ;
}
else
{
fittedObject . common . eprice = upgradePrice ;
}
}
}
return fittedObject ;
}
function getCharmedObject ( objectToCharm , modify )
{
var charmedObject = cloneObject ( objectToCharm ) ;
charmedObject . wasCharmed = true ;
charmedObject . charms = modify ;
if ( ! ( 'modify' in charmedObject ) )
{
charmedObject . modify = { } ;
}
for ( var mf in modify )
{
if ( mf in charmedObject . modify )
{
charmedObject . modify [ mf ] = parseInt ( charmedObject . modify [ mf ] ) + modify [ mf ] ;
}
else
{
charmedObject . modify [ mf ] = modify [ mf ] ;
}
}
return charmedObject ;
}
function getAddObject ( objectToCharm , modify )
{
var charmedObject = cloneObject ( objectToCharm ) ;
charmedObject . wasAdded = true ;
charmedObject . charms = modify ;
if ( ! ( 'modify' in charmedObject ) )
{
charmedObject . modify = { } ;
}
for ( var mf in modify )
{
if ( mf in charmedObject . modify )
{
charmedObject . modify [ mf ] = parseInt ( charmedObject . modify [ mf ] ) + modify [ mf ] ;
}
else
{
charmedObject . modify [ mf ] = modify [ mf ] ;
}
}
return charmedObject ;
}
function getCharmedObject2 ( objectToCharm , charm )
{
var modify = { } ;
var ss = charm . split ( '#' ) ;
for ( var i = 0 ; i < ss . length ; i += 2 )
{
var v = parseInt ( ss [ i + 1 ] ) ;
if ( ! isNaN ( v ) )
{
modify [ ss [ i ] ] = v ;
}
}
return getCharmedObject ( objectToCharm , modify ) ;
}
function getAddObject2 ( objectToCharm , charm )
{
var modify = { } ;
var ss = charm . split ( '#' ) ;
for ( var i = 0 ; i < ss . length ; i += 2 )
{
var v = parseInt ( ss [ i + 1 ] ) ;
if ( ! isNaN ( v ) )
{
modify [ ss [ i ] ] = v ;
}
}
return getAddObject ( objectToCharm , modify ) ;
}
function getRunedObject ( objectToRune , runeStr )
{
var appliedRune = '' ;
var appliedRuneOpt = '' ;
var ss = runeStr . split ( '#' ) ;
var v = parseInt ( ss [ 1 ] ) ;
if ( ! isNaN ( v ) )
{
if ( v < 1 ) { v = '0' ; }
appliedRune = ss [ 0 ] ;
appliedRuneOpt = v ;
}
var runedObject = cloneObject ( objectToRune ) ;
if ( ! appliedRune ) { return runedObject ; }
var o = getObjectById ( appliedRune ) ;
if ( ! ( 'opts' in o . modify ) ) { return runedObject ; }
if ( o . modify . opts [ appliedRuneOpt ] == null ) { return runedObject ; }
runedObject . wasRuned = true ;
runedObject . rune = appliedRune ;
runedObject . runeOpt = appliedRuneOpt ;
if ( ! ( 'modify' in runedObject ) )
{
runedObject . modify = { } ;
}
var modify = o . modify . opts [ appliedRuneOpt ] ;
for ( var mf in modify )
{
if ( mf in runedObject . modify )
{
runedObject . modify [ mf ] = parseInt ( runedObject . modify [ mf ] ) + modify [ mf ] ;
}
else
{
runedObject . modify [ mf ] = modify [ mf ] ;
}
}
return runedObject ;
}
function dropZeroInSection ( o , sn )
{
if ( ! ( sn in o ) ) return o ;
for ( var n in o [ sn ] )
{
if ( ! isNaN ( o [ sn ] [ n ] ) && o [ sn ] [ n ] == 0 ) delete o [ sn ] [ n ] ;
}
return o ;
}
function getUpgradeObject ( objectToUpgrade , upgradeIdToUpgrade )
{
if ( ! ( 'upgradecache' in objectToUpgrade ) )
{
objectToUpgrade . upgradecache = { } ;
}
if ( ! ( upgradeIdToUpgrade in objectToUpgrade . upgradecache ) )
{
var upgradeObject = { } ;
var upgrade = objectToUpgrade . upgrade [ upgradeIdToUpgrade ] ;
if ( 'fake' in upgrade )
{
upgrade . category = objectToUpgrade . category ;
upgrade . slot = objectToUpgrade . slot ;
upgrade . width = objectToUpgrade . width ;
upgrade . height = objectToUpgrade . height ;
upgradeObject = cloneObject ( upgrade ) ;
}
else
{
upgradeObject = cloneObject ( objectToUpgrade ) ;
upgradeObject = combineObjects ( upgradeObject , upgrade ) ;
upgradeObject = dropZeroInSection ( upgradeObject , 'modify' ) ;
upgradeObject = dropZeroInSection ( upgradeObject , 'properties' ) ;
upgradeObject = dropZeroInSection ( upgradeObject , 'required' ) ;
}
upgradeObject . caption = getUpgradeCaption ( objectToUpgrade , upgrade ) ;
if ( 'price' in upgrade )
{
if ( ! ( 'common' in upgradeObject ) )
{
upgradeObject . common = { eprice : 0 } ;
}
var oprice = ( 'eprice' in objectToUpgrade . common ) ? objectToUpgrade . common . eprice : 0 ;
if ( 'level' in upgrade )
{
for ( var oun in objectToUpgrade . upgrade )
{
var ou = objectToUpgrade . upgrade [ oun ] ;
var al = ( 'level' in ou ) ? ou . level : 0 ;
if ( ( al < upgrade . level ) && ( 'price' in ou ) )
{
oprice += ou . price ;
}
}
}
oprice += upgrade . price ;
upgradeObject . common . eprice = oprice ;
}
upgradeObject . wasUpgrade = true ;
objectToUpgrade . upgradecache [ upgradeIdToUpgrade ] = upgradeObject ;
}
return objectToUpgrade . upgradecache [ upgradeIdToUpgrade ] ;
}
var sharpStatValues = {
strength : 0 ,
dexterity : 0 ,
intuition : 0 ,
endurance : 0 ,
intellect : 0 ,
wisdom : 0
} ;
var sharpStatsPriority = {
strength : 10 ,
dexterity : 8 ,
intuition : 6 ,
endurance : 4 ,
intellect : 2 ,
wisdom : 1
} ;
var sharpStats = [ ] ;
function compareSharpStats ( x , y )
{
var r = sharpStatValues [ x ] - sharpStatValues [ y ] ;
if ( r == 0 )
{
r = sharpStatsPriority [ x ] - sharpStatsPriority [ y ] ;
}
return r ;
}
function getSharpenWeapon ( weaponObject , sharp )
{
if ( sharp == 0 || weaponObject == null )
{
return weaponObject ;
}
if ( parseInt ( sharp ) == 11 || parseInt ( sharp ) == 8 || parseInt ( sharp ) == 6 || parseInt ( sharp ) == 9 ) { sharp = 100 + parseInt ( sharp ) ; }
var oldmode = 1 ;
if ( sharp > 100 ) { sharp -= 100 ; oldmode = 0 ; }
var sharpenWeapon = cloneObject ( weaponObject ) ;
// drop sharpening for non-lv10 arts
//if (('artefact' in sharpenWeapon) && (oldmode != 1))
// {
// if ('required' in sharpenWeapon)
// {
// if ('level' in sharpenWeapon.required)
// {
// if (sharpenWeapon.required.level < 10 ) { return weaponObject; }
// }
// }
// }
var swcat = categories [ sharpenWeapon . category ] ;
var skillname = null ;
if ( 'required' in sharpenWeapon )
{
for ( var i = 0 ; i < knownWeaponSkills . length ; i ++ )
{
if ( knownWeaponSkills [ i ] in sharpenWeapon . required )
{
skillname = knownWeaponSkills [ i ] ;
break ;
}
}
}
if ( skillname == null && ( 'skillname' in swcat ) )
{
skillname = swcat . skillname ;
}
var increaseReq = ( skillname != null ) ;
if ( increaseReq && ( 'required' in weaponObject ) )
{
if ( 'multiplier' in weaponObject . required )
{
increaseReq = ( weaponObject . required . multiplier != 0 ) ;
}
}
if ( oldmode != 1 ) { increaseReq = false ; }
if ( increaseReq )
{
if ( ! ( 'required' in sharpenWeapon ) )
{
sharpenWeapon . required = { strength : sharp , dexterity : sharp } ;
}
else
{
sharpStatValues = {
strength : ( 'strength' in sharpenWeapon . required ) ? sharpenWeapon . required . strength : 0 ,
dexterity : ( 'dexterity' in sharpenWeapon . required ) ? sharpenWeapon . required . dexterity : 0 ,
intuition : ( 'intuition' in sharpenWeapon . required ) ? sharpenWeapon . required . intuition : 0 ,
endurance : ( 'endurance' in sharpenWeapon . required ) ? sharpenWeapon . required . endurance : 0 ,
intellect : ( 'intellect' in sharpenWeapon . required ) ? sharpenWeapon . required . intellect : 0 ,
wisdom : ( 'wisdom' in sharpenWeapon . required ) ? sharpenWeapon . required . wisdom : 0
} ;
sharpStats = new Array ( 'strength' , 'dexterity' , 'intuition' , 'endurance' , 'intellect' , 'wisdom' ) ;
sharpStats . sort ( compareSharpStats ) ;
sharpStats . reverse ( ) ;
sharpenWeapon . required [ sharpStats [ 0 ] ] = sharpStatValues [ sharpStats [ 0 ] ] + sharp ;
sharpenWeapon . required [ sharpStats [ 1 ] ] = sharpStatValues [ sharpStats [ 1 ] ] + sharp ;
}
if ( skillname != 'staffskill' )
{
var skillv = ( skillname in sharpenWeapon . required ) ? sharpenWeapon . required [ skillname ] : 0 ;
skillv += sharp ;
sharpenWeapon . required [ skillname ] = skillv ;
}
}
if ( ! ( 'common' in sharpenWeapon ) )
{
sharpenWeapon . common = { price : 0 } ;
}
else
{
if ( ! ( 'price' in sharpenWeapon . common ) )
{
sharpenWeapon . common . price = 0 ;
}
}
if ( oldmode != 1 )
{
if ( ! ( 'required' in sharpenWeapon ) )
{
sharpenWeapon . required = { level : 0 } ;
}
else
{
if ( ! ( 'level' in sharpenWeapon . required ) )
{
sharpenWeapon . required . level = 0 ;
}
}
if ( sharpenWeapon . required . level < minSharpLevels [ sharp ] ) { sharpenWeapon . required . level = minSharpLevels [ sharp ] ; }
}
if ( oldmode == 1 )
{
if ( sharp < 7 )
{
sharpenWeapon . common . price += 10 * Math . pow ( 2 , sharp ) ;
}
else
{
sharpenWeapon . common . price += ( 1000 * ( sharp - 6 ) ) ;
}
}
else
{
if ( 'properties' in sharpenWeapon )
{
if ( 'twohandled' in sharpenWeapon . properties )
{ sharpenWeapon . common . price += dblSharpPrices [ sharp ] ; }
else { sharpenWeapon . common . price += regSharpPrices [ sharp ] ; }
}
else { sharpenWeapon . common . price += regSharpPrices [ sharp ] ; }
}
var generalSharp = 1 ;
if ( 'category' in sharpenWeapon )
{
if ( sharpenWeapon . category == 'staffs' ) { generalSharp = 0 ; }
}
if ( generalSharp == 1 )
{
if ( ! ( 'properties' in sharpenWeapon ) )
{
sharpenWeapon . properties = { mindamage : 0 , maxdamage : 0 } ;
}
else
{
if ( ! ( 'mindamage' in sharpenWeapon . properties ) )
{
sharpenWeapon . properties . mindamage = 0 ;
}
if ( ! ( 'maxdamage' in sharpenWeapon . properties ) )
{
sharpenWeapon . properties . maxdamage = sharpenWeapon . properties . mindamage ;
}
}
if ( 'properties' in sharpenWeapon )
{
if ( ( 'twohandled' in sharpenWeapon . properties ) && ( oldmode != 1 ) )
{
sharpenWeapon . properties . mindamage += 2 * sharp ;
sharpenWeapon . properties . maxdamage += 2 * sharp ;
}
else
{
sharpenWeapon . properties . mindamage += sharp ;
sharpenWeapon . properties . maxdamage += sharp ;
}
}
}
else
{
if ( ! ( 'modify' in sharpenWeapon ) )
{
sharpenWeapon . modify = { magicpower : 0 } ;
}
else
{
if ( ! ( 'magicpower' in sharpenWeapon . modify ) )
{
sharpenWeapon . modify . magicpower = 0 ;
}
}
if ( oldmode != 1 ) { sharpenWeapon . modify . magicpower += sharp * 2 ; }
else { sharpenWeapon . modify . magicpower += sharp ; }
}
if ( oldmode == 1 ) { sharpenWeapon . caption += ' +' + sharp + '[old]' ; }
else { sharpenWeapon . caption += ' +' + sharp ; }
if ( ( sharp > 5 && oldmode == 1 ) || ( oldmode != 1 ) )
{
2023-01-10 18:29:32 +02:00
sharpenWeapon . destiny = 'Связано судьбой с персонажем, заточившим это оружие' ;
2022-12-19 22:22:19 +02:00
}
return sharpenWeapon ;
}
function onObjectDrop ( stateId , slotid )
{
setObjectForSlot ( dressStates [ stateId ] , slotid , null ) ;
}
function onDropAll ( )
{
var state = activeState ;
applyCleanItemsToState ( state ) ;
hardUpdateDresserState ( state ) ;
}
function onClearAllStats ( stateId )
{
var state = dressStates [ stateId ] ;
clearAllStats ( state ) ;
updateDresserState ( state ) ;
}
function updateDresserSlot ( state , slot )
{
state . objCache [ slot . index ] = null ;
var o = getObjectById ( state . objects [ slot . index ] ) ;
var oimg = ( o == null ) ? slot . id : o . id ;
var realItemImgPath = getRealImagePath ( o != null ? o . id : null , slot ) ;
var imgElt = document . getElementById ( state . id . toString ( ) + slot . id ) ;
if ( imgElt != null )
{
if ( dressOptions . useTransitionEffects )
{
imgElt . filters [ 'revealtrans' ] . apply ( ) ;
}
imgElt . name = 'x' + oimg ;
imgElt . src = format ( '{0}{1}.gif' , realItemImgPath , oimg ) ;
o = getObjectByStateSlot ( state , slot ) ;
var newFilter = getRealFilter ( getObjectFilter ( state , slot , o ) ) ;
if ( is . ie && newFilter != imgElt . style . filter )
{
imgElt . style . filter = newFilter ;
}
if ( dressOptions . useTransitionEffects )
{
imgElt . filters [ 'revealtrans' ] . play ( ) ;
}
}
updateDresserStateWanted ( ) ;
}
function onFitArmor ( stateId , fit )
{
var state = dressStates [ stateId ] ;
state . fitArmor = fit ;
updateDresserSlot ( state , slot _w4 ) ;
}
function onUnfitObject ( stateId , slotId )
{
var state = dressStates [ stateId ] ;
var slot = getSlotById ( slotId ) ;
state . fitSlots [ slot . index ] = null ;
updateDresserSlot ( state , slot ) ;
}
function onFitObject ( stateId , slotId , setId )
{
var state = dressStates [ stateId ] ;
var slot = getSlotById ( slotId ) ;
if ( state == null || slot == null )
{
return ;
}
if ( setId != null )
{
state . fitSlots [ slot . index ] = setId ;
updateDresserSlot ( state , slot ) ;
}
else
{
var menuHtml = '<table width="260px" border="0">' ;
var o = getObjectByStateSlot ( state , slot ) ;
if ( ( 'wasFit' in o ) && o . wasFit )
{
menuHtml += getRowMenuItemHtml ( localizer . unfitObject , format ( "onUnfitObject('{0}', '{1}')" , state . id , slot . id ) ) ;
}
if ( 'setlinks' in o )
{
for ( var seti = 1 ; seti < o . setlinks . length ; seti ++ ) // skip first
{
var set = dressSets [ o . setlinks [ seti ] ] ;
var sethtml = set . caption ;
menuHtml += getRowMenuItemHtml ( sethtml , format ( "onFitObject('{0}', '{1}', '{2}')" , state . id , slot . id , set . id ) ) ;
}
}
else
{
for ( var setn in dressSets )
{
var set = dressSets [ setn ] ;
if ( ( 'noadjust' in set ) && set . noadjust )
{
continue ;
}
if ( ( 'virtual' in set ) && set . virtual )
{
continue ;
}
if ( getSetItemsForSlot ( set , slot ) . length > 0 )
{
var sethtml = set . caption ;
menuHtml += getRowMenuItemHtml ( sethtml , format ( "onFitObject('{0}', '{1}', '{2}')" , state . id , slot . id , set . id ) ) ;
}
}
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml ) ;
}
}
function getUpgradeCaption ( o , upgrade )
{
var caption = o . caption ;
if ( 'caption' in upgrade )
{
caption = upgrade . caption ;
}
if ( ( 'old' in upgrade ) && upgrade . old )
{
caption = caption + ' [old]' ;
}
if ( 'level' in upgrade )
{
caption = caption + ' [' + upgrade . level + ']' ;
}
if ( 'fake' in upgrade )
{
2023-01-10 18:29:32 +02:00
caption = caption + ' [конструктор]' ;
2022-12-19 22:22:19 +02:00
}
return caption ;
}
function onUpgradeObject ( stateId , slotId , upgradeId )
{
var state = dressStates [ stateId ] ;
var slot = getSlotById ( slotId ) ;
if ( state == null || slot == null )
{
return ;
}
if ( upgradeId != '' )
{
state . upgradeSlots [ slot . index ] = upgradeId ;
updateDresserSlot ( state , slot ) ;
}
else
{
var menuHtml = '<table width="260px" border="0">' ;
var o = getObjectById ( state . objects [ slot . index ] ) ;
menuHtml += getRowMenuItemHtml ( localizer . noUpgrade , format ( "onUpgradeObject('{0}', '{1}', null)" , state . id , slot . id ) ) ;
for ( var upgraden in o . upgrade )
{
var upgrade = o . upgrade [ upgraden ] ;
menuHtml += getRowMenuItemHtml ( getUpgradeCaption ( o , upgrade ) , format ( "onUpgradeObject('{0}', '{1}', '{2}')" , state . id , slot . id , upgrade . id ) ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml ) ;
}
}
function onCharmObject ( stateId , slotId )
{
var state = dressStates [ stateId ] ;
var slot = getSlotById ( slotId ) ;
if ( state == null || slot == null )
{
return ;
}
showMenu ( getCharmChooserHtml ( slot . index ) , false ) ;
}
function onaddStats ( stateId , slotId , numb )
{
var state = dressStates [ stateId ] ;
var slot = getSlotById ( slotId ) ;
onUnaddStats ( stateId , slotId ) ;
if ( state == null || slot == null )
{
return ;
}
showMenu ( getASChooserHtml ( slot . index , numb ) , false ) ;
}
function doCharm ( sloti )
{
var state = activeState ;
var slot = getSlotByIndex ( sloti ) ;
hideMenu ( ) ;
if ( state == null || slot == null )
{
return ;
}
var charm _mf _name = document . getElementById ( 'charm_mf_name' ) . value ;
var charm _mf _value = document . getElementById ( 'charm_mf_value' ) . value ;
var charm _mf _replace = document . getElementById ( 'charm_mf_replace' ) . checked ;
if ( ! ( charm _mf _name in item _props ) || isNaN ( charm _mf _value ) || parseInt ( charm _mf _value ) == 0 )
{
return ;
}
var v = charm _mf _name + '#' + parseInt ( charm _mf _value ) ;
if ( state . charmSlots [ slot . index ] != null && ! charm _mf _replace )
{
v += '#' + state . charmSlots [ slot . index ] ;
}
state . charmSlots [ slot . index ] = v ;
updateDresserSlot ( state , slot ) ;
}
function doAddStats ( sloti )
{
var state = activeState ;
var slot = getSlotByIndex ( sloti ) ;
var statt = new Array ( 'strength' , 'dexterity' , 'intuition' , 'intellect' ) ;
hideMenu ( ) ;
if ( state == null || slot == null )
{
return ;
}
var stat _add _strength = document . getElementById ( 'add_strength' ) . value ;
var stat _add _dexterity = document . getElementById ( 'add_dexterity' ) . value ;
var stat _add _intuition = document . getElementById ( 'add_intuition' ) . value ;
var stat _add _intellect = document . getElementById ( 'add_intellect' ) . value ;
for ( i = 0 ; i < statt . length ; i ++ )
{
charm _mf _name = statt [ i ] ;
charm _mf _value = eval ( "stat_add_" + statt [ i ] ) ;
if ( charm _mf _value != 0 ) {
if ( ! ( charm _mf _name in item _props ) || isNaN ( charm _mf _value ) )
{
return ;
}
var v = charm _mf _name + '#' + parseInt ( charm _mf _value ) ;
if ( state . addSlots [ slot . index ] != null )
{
v += '#' + state . addSlots [ slot . index ] ;
}
state . addSlots [ slot . index ] = v ;
updateDresserSlot ( state , slot ) ;
}
}
}
function doPredefinedCharm ( sloti , v )
{
var state = activeState ;
var slot = getSlotByIndex ( sloti ) ;
hideMenu ( ) ;
if ( state == null || slot == null )
{
return ;
}
var charm _mf _replace = document . getElementById ( 'charm_mf_replace' ) . checked ;
if ( state . charmSlots [ slot . index ] != null && ! charm _mf _replace )
{
v += '#' + state . charmSlots [ slot . index ] ;
}
state . charmSlots [ slot . index ] = v ;
updateDresserSlot ( state , slot ) ;
}
function onUncharmObject ( stateId , slotId )
{
var state = dressStates [ stateId ] ;
var slot = getSlotById ( slotId ) ;
if ( state == null || slot == null )
{
return ;
}
state . charmSlots [ slot . index ] = null ;
updateDresserSlot ( state , slot ) ;
}
function onUnaddStats ( stateId , slotId )
{
var state = dressStates [ stateId ] ;
var slot = getSlotById ( slotId ) ;
if ( state == null || slot == null )
{
return ;
}
state . addSlots [ slot . index ] = null ;
updateDresserSlot ( state , slot ) ;
}
function onUnRuneObject ( stateId , slotId )
{
var state = dressStates [ stateId ] ;
var slot = getSlotById ( slotId ) ;
if ( state == null || slot == null )
{
return ;
}
state . runeSlots [ slot . index ] = null ;
updateDresserSlot ( state , slot ) ;
}
function onSharpWeapon ( stateId , slotId , sharp )
{
if ( parseInt ( sharp ) == 11 || parseInt ( sharp ) == 8 || parseInt ( sharp ) == 6 || parseInt ( sharp ) == 9 ) { sharp = 100 + parseInt ( sharp ) ; }
var state = dressStates [ stateId ] ;
var slot = getSlotById ( slotId ) ;
if ( state == null || slot == null )
{
return ;
}
if ( slot . id == 'w3' )
{
state . w3sharp = parseInt ( sharp ) ;
}
if ( slot . id == 'w10' )
{
state . w10sharp = parseInt ( sharp ) ;
}
updateDresserSlot ( state , slot ) ;
}
function getSetItemsForSlot ( set , slot )
{
var setid = set . id ;
var r = [ ] ;
for ( var catid in categories )
{
var cat = categories [ catid ] ;
if ( cat . slot != slot . id )
{
continue ;
}
for ( var itemIndex = 0 ; itemIndex < cat . items . length ; itemIndex ++ )
{
var item = cat . items [ itemIndex ] ;
if ( 'baseitem' in item )
{
continue ;
}
if ( ( 'setlink' in item ) && ( item . setlink . name == setid ) )
{
r . push ( item ) ;
}
}
}
return r ;
}
function getObjectsCountOfVariant ( v )
{
var r = 0 ;
for ( var i = 0 ; i < v . length ; i ++ )
{
if ( v [ i ] != null )
{
r ++ ;
}
}
return r ;
}
function pushVariantIfNotExists ( r , v )
{
var nv = v . concat ( [ ] ) ;
// exclude w10 if w3 twohandled
var w3o = nv [ slot _w3 . index ] ;
var w10o = nv [ slot _w10 . index ] ;
if ( ( w10o != null ) && isTwohandledWeapon ( w3o ) )
{
nv [ slot _w10 . index ] = null ;
w10o = null ;
}
for ( var i = 0 ; i < r . length ; i ++ )
{
var different = false ;
for ( var j = 0 ; j < r [ i ] . length ; j ++ )
{
if ( r [ i ] [ j ] != nv [ j ] )
{
different = true ;
break ;
}
}
if ( ! different )
{
return ;
}
}
r . push ( nv ) ;
}
function getCaptionOfVariant ( v , variants )
{
var cap = localizer . setEtc ;
for ( var i = slots . length - 1 ; i >= 0 ; i -- )
{
var slot = slots [ i ] ;
if ( v [ slot . index ] != null )
{
if ( variants [ slot . index ] . length > 1 )
{
cap = v [ slot . index ] . caption + ' + ' + cap ;
}
}
}
return cap ;
}
function getSetVariant ( set , slotIndexes )
{
var v = new Array ( slots . length ) ;
var sv = getSetVariants ( set ) ;
for ( var sloti = 0 ; sloti < slots . length ; sloti ++ )
{
var slot = slots [ sloti ] ;
if ( slotIndexes [ sloti ] != null && slotIndexes [ sloti ] < sv [ slot . index ] . length )
{
v [ slot . index ] = sv [ slot . index ] [ slotIndexes [ sloti ] ] ;
}
}
return v ;
}
function pushPopulatedSetVariantsR ( r , set , slotIndexes , currentIndex )
{
if ( currentIndex >= slots . length )
{
return ;
}
var slot = slots [ currentIndex ] ;
var sv = getSetVariants ( set ) ;
if ( sv [ slot . index ] . length == 0 )
{
pushPopulatedSetVariantsR ( r , set , slotIndexes , currentIndex + 1 ) ;
}
else
{
for ( slotIndexes [ currentIndex ] = 0 ; slotIndexes [ currentIndex ] < sv [ slot . index ] . length ; slotIndexes [ currentIndex ] += 1 )
{
pushPopulatedSetVariantsR ( r , set , slotIndexes , currentIndex + 1 ) ;
var v = getSetVariant ( set , slotIndexes ) ;
if ( getObjectsCountOfVariant ( v ) >= set . count )
{
pushVariantIfNotExists ( r , v ) ;
}
}
}
}
function getPopulatedSetVariants ( set )
{
if ( 'pvariants' in set )
{
return set . pvariants ;
}
showMenu ( localizer . pleaseWait ) ;
var r = [ ] ;
var slotIndexes = new Array ( slots . length ) ;
pushPopulatedSetVariantsR ( r , set , slotIndexes , 0 ) ;
set . pvariants = r ;
hideMenu ( ) ;
return r ;
}
function compareSets ( x , y )
{
if ( x == y )
{
return 0 ;
}
if ( x == null )
{
return - 1 ;
}
if ( y == null )
{
return 1 ;
}
var xlvl = ( ( 'required' in x ) && ( 'level' in x . required ) ) ? parseInt ( x . required . level ) : 0 ;
var ylvl = ( ( 'required' in y ) && ( 'level' in y . required ) ) ? parseInt ( y . required . level ) : 0 ;
if ( xlvl != ylvl )
{
return ( xlvl - ylvl ) ;
}
if ( x . caption != y . caption )
{
return ( x . caption < y . caption ) ? - 1 : 1 ;
}
return 0 ;
}
function onDressAnyCombatsSet ( )
{
cursorX -= 400 ;
if ( 'dressAnyCombatsSet' in menuhash )
{
showMenu ( menuhash . dressAnyCombatsSet ) ;
return ;
}
var menuHtml = '<table width="780" cellspacing="0" cellpadding="0" border="0">' ;
var state = activeState ;
if ( state == null )
{
return ;
}
var usets8 = [ ] ;
var usets9 = [ ] ;
var usets10 = [ ] ;
var isets = [ ] ;
var vsets = [ ] ;
for ( var setn in dressSets )
{
var set = dressSets [ setn ] ;
if ( ( 'virtual' in set ) && set . virtual )
{
vsets . push ( set ) ;
}
else
{
if ( ( 'imp1' in set ) && set . imp1 )
{
isets . push ( set ) ;
}
else
{
if ( set . required . level <= 8 ) { usets8 . push ( set ) ; }
if ( set . required . level == 9 ) { usets9 . push ( set ) ; }
if ( set . required . level > 9 ) { usets10 . push ( set ) ; }
}
}
}
usets8 . sort ( compareSets ) ;
usets9 . sort ( compareSets ) ;
usets10 . sort ( compareSets ) ;
isets . sort ( compareSets ) ;
vsets . sort ( compareSets ) ;
menuHtml += '<tr><td valign="top"><table width="260" cellspacing="0" cellpadding="0" border="0">' ;
for ( var setn in usets8 )
{
var set = usets8 [ setn ] ;
var sethtml = set . caption ;
menuHtml += getRowMenuItemHtml ( sethtml , format ( "onDressCombatsSet('{0}')" , set . id ) ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
for ( var setn in isets )
{
var set = isets [ setn ] ;
var sethtml = set . caption ;
menuHtml += getRowMenuItemHtml ( sethtml , format ( "onDressCombatsSet('{0}')" , set . id ) ) ;
}
menuHtml += '</table></td><td valign="top"><table width="260" cellspacing="0" cellpadding="0" border="0">' ;
for ( var setn in usets9 )
{
var set = usets9 [ setn ] ;
var sethtml = set . caption ;
menuHtml += getRowMenuItemHtml ( sethtml , format ( "onDressCombatsSet('{0}')" , set . id ) ) ;
}
menuHtml += '</table></td><td valign="top"><table width="260" cellspacing="0" cellpadding="0" border="0">' ;
for ( var setn in usets10 )
{
var set = usets10 [ setn ] ;
var sethtml = set . caption ;
menuHtml += getRowMenuItemHtml ( sethtml , format ( "onDressCombatsSet('{0}')" , set . id ) ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
for ( var setn in vsets )
{
var set = vsets [ setn ] ;
var sethtml = set . caption ;
menuHtml += getRowMenuItemHtml ( sethtml , format ( "onDressCombatsSet('{0}')" , set . id ) ) ;
}
menuHtml += '</table></td></tr>' ;
menuHtml += '<tr><td colspan="3"><table width="780" cellspacing="0" cellpadding="0" border="0">' ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table></td></tr></table>' ;
menuhash . dressAnyCombatsSet = menuHtml ;
showMenu ( menuHtml ) ;
}
function dressSetVariant ( state , setVariant )
{
for ( var i = slots . length - 1 ; i >= 0 ; i -- )
{
var slot = slots [ i ] ;
if ( setVariant [ slot . index ] != null )
{
setObjectForSlot ( state , slot . id , setVariant [ slot . index ] . id ) ;
}
}
}
function onDressCombatsSet ( setId , setVariantIndex )
{
if ( setId . indexOf ( "10" ) == - 1 )
{
var VsetId = setId ;
var addtl = "" ;
}
else
{
var LastPos = setId . indexOf ( "10" ) ;
var VsetId = setId . substr ( 0 , LastPos ) ;
var addtl = " [10]" ;
}
var state = activeState ;
var set = getSetById ( VsetId ) ;
if ( state == null || set == null )
{
return ;
}
var variants = getPopulatedSetVariants ( set ) ;
if ( variants . length == 0 )
{
return ;
}
if ( setVariantIndex == null && variants . length == 1 )
{
dressSetVariant ( state , variants [ 0 ] ) ;
// insert upgrade function here
if ( setId . indexOf ( "10" ) != - 1 ) { UpgradeSet ( state , setId ) ; }
return ;
}
if ( setVariantIndex != null )
{
dressSetVariant ( state , variants [ parseInt ( setVariantIndex ) ] ) ;
// insert upgrade function here
if ( setId . indexOf ( "10" ) != - 1 ) { UpgradeSet ( state , setId ) ; }
return ;
}
var menuHtml = '<table width="360px" border="0">' ;
menuHtml += set . caption . bold ( ) + addtl . bold ( ) + '<br /><center>' ;
for ( var vi = 0 ; vi < variants . length ; vi ++ )
{
var v = variants [ vi ] ;
menuHtml += getRowMenuItemHtml ( getCaptionOfVariant ( v , getSetVariants ( set ) ) , format ( "onDressCombatsSet('{0}', {1})" , setId , vi ) ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml ) ;
}
function UpgradeSet ( state , setId )
{
var batslots = new Array ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 19 ) ;
for ( i = 0 ; i < batslots . length ; i ++ )
{
var slotId = 'w' + batslots [ i ] ;
var slot = getSlotById ( slotId ) ;
var o = getObjectById ( state . objects [ slot . index ] ) ;
if ( ( o != null ) && ( 'upgrade' in o ) )
{
for ( var upgraden in o . upgrade )
{
var upgrade = o . upgrade [ upgraden ] ;
if ( 'setlink' in upgrade && upgrade . setlink . name == setId )
{
onUpgradeObject ( state . id , slot . id , upgrade . id ) ;
}
}
}
}
}
function itemCompare ( x , y )
{
if ( x == y )
{
return 0 ;
}
if ( x == null )
{
return - 1 ;
}
if ( y == null )
{
return 1 ;
}
var xeprice = ! ( ( 'imp1' in x ) && x . imp1 ) && ( ( 'common' in x ) && ( 'eprice' in x . common ) ) ? parseInt ( x . common . eprice ) : 0 ;
var yeprice = ! ( ( 'imp1' in y ) && y . imp1 ) && ( ( 'common' in y ) && ( 'eprice' in y . common ) ) ? parseInt ( y . common . eprice ) : 0 ;
if ( xeprice != yeprice )
{
return ( xeprice - yeprice ) ;
}
var xlvl = ( ( 'required' in x ) && ( 'level' in x . required ) ) ? parseInt ( x . required . level ) : 0 ;
var ylvl = ( ( 'required' in y ) && ( 'level' in y . required ) ) ? parseInt ( y . required . level ) : 0 ;
if ( xlvl != ylvl )
{
return ( xlvl - ylvl ) ;
}
var xprice = ( ( 'common' in x ) && ( 'price' in x . common ) ) ? parseInt ( x . common . price ) : 0 ;
var yprice = ( ( 'common' in y ) && ( 'price' in y . common ) ) ? parseInt ( y . common . price ) : 0 ;
if ( xprice != yprice )
{
return ( xprice - yprice ) ;
}
if ( x . caption != y . caption )
{
return ( x . caption < y . caption ) ? - 1 : 1 ;
}
return 0 ;
}
function getFilteredItems ( items )
{
var r = [ ] ;
var prop = null ;
if ( dressOptions . ffiltermf != null )
{
var propIndex = dressOptions . ffiltermf ;
var propList = item _props ;
for ( mfn in propList )
{
propIndex -- ;
if ( propIndex == 0 )
{
prop = mfn ;
break ;
}
}
}
for ( var i = 0 ; i < items . length ; i ++ )
{
var itm = items [ i ] ;
if ( itm == null )
{
continue ;
}
// exclude items that interpreted as upgrades.
if ( 'baseitem' in itm )
{
continue ;
}
// exclude old items
if ( ! dressOptions . fshowold && ( 'old' in itm ) && itm . old )
{
continue ;
}
if ( ! dressOptions . fshow _com && ( 'imp1' in itm ) && itm . imp1 && ! ( 'artefact' in itm ) )
{
continue ;
}
if ( ! dressOptions . fshow _ru && ( ! ( ( 'imp1' in itm ) && itm . imp1 ) ) && ! ( 'artefact' in itm ) )
{
continue ;
}
if ( ! dressOptions . fshow _artefacts && ( 'artefact' in itm ) && itm . artefact )
{
continue ;
}
if ( dressOptions . frewardonly )
{
if ( ! ( 'requireditems' in itm ) ) continue ;
if ( ! ( ( 's_luka' in itm . requireditems ) || ( 'luka' in itm . requireditems ) ) ) continue ;
}
var itemLevel1 = ( 'required' in itm ) && ( 'level' in itm . required ) ? parseInt ( itm . required . level ) : null ;
var itemLevel2 = itemLevel1 ;
if ( 'upgrade' in itm )
{
for ( var upn in itm . upgrade )
{
var u = itm . upgrade [ upn ] ;
var itemLevelUp = ( 'required' in u ) && ( 'level' in u . required ) ? parseInt ( u . required . level ) : null ;
if ( itemLevelUp == null ) continue ;
if ( itemLevel1 > itemLevelUp ) itemLevel1 = itemLevelUp ;
if ( itemLevel2 < itemLevelUp ) itemLevel2 = itemLevelUp ;
}
}
if ( itemLevel1 != null )
{
if ( dressOptions . fmaxlevel != null )
{
if ( itemLevel1 > dressOptions . fmaxlevel )
{
continue ;
}
}
}
if ( dressOptions . fminlevel != null )
{
if ( ( itemLevel2 == null ) || itemLevel2 < dressOptions . fminlevel )
{
continue ;
}
}
if ( prop != null )
{
var propFound = ( 'modify' in itm ) && ( prop in itm . modify ) && ( itm . modify [ prop ] > 0 ) ;
if ( ! propFound ) propFound = ( 'properties' in itm ) && ( prop in itm . properties ) && ( itm . properties [ prop ] > 0 ) ;
if ( ! propFound )
{
continue ;
}
}
r . push ( items [ i ] ) ;
}
r . sort ( itemCompare ) ;
return r ;
}
function enableCategoryItems ( )
{
var filterWindow = document . getElementById ( 'filterWindow' ) ;
var itemsView = document . getElementById ( 'itemsView' ) ;
if ( filterWindow == null )
{
return ;
}
filterWindow . innerHTML = '' ;
filterWindow . style . visibility = 'hidden' ;
if ( is . ie && itemsView . filters )
{
itemsView . filters [ 0 ] . Enabled = false ;
itemsView . filters [ 1 ] . Enabled = false ;
}
else
{
itemsView . style . backgroundColor = '' ;
}
reshowMenu ( ) ;
}
function applyFilter2 ( )
{
applyFilter3 ( ) ;
enableCategoryItems ( ) ;
}
function applyFilter3 ( )
{
var filterWindow = document . getElementById ( 'filterWindow' ) ;
storeFilterDialog ( ) ;
filterDialogProps . fminlevel = parseInt ( filterDialogProps . fminlevel ) ;
filterDialogProps . fmaxlevel = parseInt ( filterDialogProps . fmaxlevel ) ;
if ( isNaN ( filterDialogProps . fminlevel ) || ( filterDialogProps . fminlevel < 0 ) || ( filterDialogProps . fminlevel > 21 ) )
{
filterDialogProps . fminlevel = null ;
}
if ( isNaN ( filterDialogProps . fmaxlevel ) || ( filterDialogProps . fmaxlevel < 0 ) || ( filterDialogProps . fmaxlevel > 21 ) )
{
filterDialogProps . fmaxlevel = null ;
}
if ( ( filterDialogProps . fminlevel != null ) && ( filterDialogProps . fmaxlevel != null ) && ( filterDialogProps . fmaxlevel < filterDialogProps . fminlevel ) )
{
var tempv = filterDialogProps . fminlevel ;
filterDialogProps . fminlevel = filterDialogProps . fmaxlevel ;
filterDialogProps . fmaxlevel = tempv ;
}
if ( isNaN ( filterDialogProps . ffiltermf ) || ( filterDialogProps . ffiltermf == 0 ) )
{
filterDialogProps . ffiltermf = null ;
}
filterWindow . innerHTML = '' ;
dressOptions . fminlevel = filterDialogProps . fminlevel ;
dressOptions . fmaxlevel = filterDialogProps . fmaxlevel ;
dressOptions . fshowold = filterDialogProps . fshowold ;
dressOptions . fshow _com = filterDialogProps . fshow _com ;
dressOptions . fshow _ru = filterDialogProps . fshow _ru ;
dressOptions . fshow _artefacts = filterDialogProps . fshow _artefacts ;
dressOptions . ffiltermf = filterDialogProps . ffiltermf ;
dressOptions . frewardonly = filterDialogProps . frewardonly ;
setupFilterFialog ( ) ;
applyItemsToCategoryView ( ) ;
showCurrentFilter ( ) ;
saveOptions ( ) ;
}
function onSetInlineFilter ( )
{
var filterWindow = document . getElementById ( 'filterWindow' ) ;
var itemsView = document . getElementById ( 'itemsView' ) ;
if ( filterWindow == null )
{
return ;
}
if ( is . ie && itemsView . filters )
{
itemsView . filters [ 0 ] . Enabled = true ;
itemsView . filters [ 1 ] . Enabled = true ;
}
else
{
itemsView . style . backgroundColor = '#E2E0E0' ;
}
showCurrentFilter ( ) ;
filterWindow . style . visibility = 'visible' ;
reshowMenu ( false ) ;
}
function getFilterHash ( )
{
var r = 'hash.' ;
r += dressOptions . fminlevel ;
r += '.' ;
r += dressOptions . fmaxlevel ;
r += '.' ;
r += dressOptions . fshowold ;
r += '.' ;
r += dressOptions . fshow _com ;
r += '.' ;
r += dressOptions . fshow _ru ;
r += '.' ;
r += dressOptions . fshow _artefacts ;
r += '.' ;
r += dressOptions . ffiltermf ;
r += '.' ;
r += dressOptions . frewardonly ;
return r ;
}
function onResetInlineFilter ( )
{
var filterWindow = document . getElementById ( 'filterWindow' ) ;
filterWindow . innerHTML = '' ;
dressOptions . fminlevel = null ;
dressOptions . fmaxlevel = null ;
dressOptions . fshowold = false ;
dressOptions . fshow _com = true ;
dressOptions . fshow _ru = true ;
dressOptions . fshow _artefacts = true ;
dressOptions . ffiltermf = null ;
dressOptions . frewardonly = false ;
setupFilterFialog ( ) ;
applyItemsToCategoryView ( ) ;
enableCategoryItems ( ) ;
saveOptions ( ) ;
}
function getDresserFilterTabHtml ( tabText , tabFunc , on )
{
var html = '' ;
var classn = on ? 'activeLink' : 'usualLink' ;
var onclick = on ? '' : ( ' onclick="' + tabFunc + '"' ) ;
html += format ( '<li class="{0}"><a href="javascript:;"{1}>{2}</li>' , classn , onclick , tabText ) ;
return html ;
}
function getDresserFilterTabsHtml ( tabIndex )
{
var windowWidth = ( 8 * 60 ) - 8 ;
var html = '' ;
html += '<div class="dtab"><ul class="dtab">' ;
html += getDresserInfoPaneTabHtml ( localizer . filterGeneralTab , 'showCommonFilter()' , ( tabIndex == 0 ) ) ;
html += getDresserInfoPaneTabHtml ( localizer . filterMfTab , 'showMfFilter()' , ( tabIndex == 1 ) ) ;
// html += getDresserInfoPaneTabHtml(localizer.filterSortTab, 'showItemSort()', (tabIndex == 2));
html += '</ul></div>' ;
return html ;
}
function getFilterHeaderHtml ( )
{
var windowWidth = ( 8 * 60 ) - 8 ;
var html = '' ;
html += '<div style="width: ' + windowWidth + 'px; padding: 2px 2px 2px 2px;">' ;
windowWidth -= 4 ;
html += format ( localizer . filter , clanImgPath ) ;
html += getDresserFilterTabsHtml ( dressOptions . currentFilterTab ) ;
html += '<table width="' + windowWidth + '" border="0" cellspacing="0" cellpadding="0" class="tab-content"><tr><td colspan="2">' ;
html += '<table width="100%" border="0" cellspacing="0" class="tcontent" style="padding: 2px 8px 0px 0px;">' ;
html += '<tr><td>' ;
return html ;
}
function getFilterFooterHtml ( )
{
var html = '' ;
html += '</td></tr>' ;
html += '</table>' ;
html += '</td></tr>' ;
html += '</table>' ;
html += '</td></tr></table>' ;
html += ' <input class="inpButton" type="button" value=" OK " onclick="applyFilter2()" />' ;
html += ' <input class="inpButton" type="button" value="' + localizer . apply + '" onclick="applyFilter3()" />' ;
html += ' <input class="inpButton" type="button" value="' + localizer . cancel + '" onclick="enableCategoryItems()" />' ;
html += '</div>' ;
return html ;
}
function setupFilterFialog ( )
{
filterDialogProps = {
fminlevel : dressOptions . fminlevel ,
fmaxlevel : dressOptions . fmaxlevel ,
fshowold : dressOptions . fshowold ,
fshow _com : dressOptions . fshow _com ,
fshow _ru : dressOptions . fshow _ru ,
fshow _artefacts : dressOptions . fshow _artefacts ,
ffiltermf : dressOptions . ffiltermf ,
frewardonly : dressOptions . frewardonly
} ;
}
function storeFilterDialog ( )
{
var fminlevel = document . getElementById ( 'fminlevel' ) ;
if ( fminlevel != null )
{
filterDialogProps . fminlevel = fminlevel . value ;
}
var fmaxlevel = document . getElementById ( 'fmaxlevel' ) ;
if ( fmaxlevel != null )
{
filterDialogProps . fmaxlevel = fmaxlevel . value ;
}
var fshowold = document . getElementById ( 'fshowold' ) ;
if ( fshowold != null )
{
filterDialogProps . fshowold = fshowold . checked ;
}
var fshow _com = document . getElementById ( 'fshow_com' ) ;
if ( fshow _com != null )
{
filterDialogProps . fshow _com = fshow _com . checked ;
}
var fshow _ru = document . getElementById ( 'fshow_ru' ) ;
if ( fshow _ru != null )
{
filterDialogProps . fshow _ru = fshow _ru . checked ;
}
var fshow _artefacts = document . getElementById ( 'fshow_artefacts' ) ;
if ( fshow _artefacts != null )
{
filterDialogProps . fshow _artefacts = fshow _artefacts . checked ;
}
var ffiltermf = document . getElementById ( 'ffiltermf' ) ;
if ( ffiltermf != null )
{
filterDialogProps . ffiltermf = ffiltermf . value ;
}
var frewardonly = document . getElementById ( 'frewardonly' ) ;
if ( frewardonly != null )
{
filterDialogProps . frewardonly = frewardonly . checked ;
}
}
function getCommonFilterHtml ( )
{
var html = '' ;
html += getFilterHeaderHtml ( ) ;
html += format ( '<label for="fminlevel">{1}: </label><input id="fminlevel" name="fminlevel" type="text" value="{0}" class="ABText80" />' , ( filterDialogProps . fminlevel != null ) ? filterDialogProps . fminlevel : '' , localizer . fminlevel ) ;
html += '<br />' ;
html += format ( '<label for="fmaxlevel">{1}: </label><input id="fmaxlevel" name="fmaxlevel" type="text" value="{0}" class="ABText80" />' , ( filterDialogProps . fmaxlevel != null ) ? filterDialogProps . fmaxlevel : '' , localizer . fmaxlevel ) ;
html += '<hr class="dashed" />' ;
html += ' <input id="fshowold" name="fshowold" type="checkbox" value="showold"' + ( filterDialogProps . fshowold ? 'checked="yes"' : '' ) + ' /><label for="fshowold"> ' + localizer . fshowold + '</label>' ;
html += ' <input id="fshow_com" name="fshow_com" type="checkbox" value="show_com"' + ( filterDialogProps . fshow _com ? 'checked="yes"' : '' ) + ' /><label for="fshow_com"> ' + localizer . fshow _com + '</label>' ;
html += ' <input id="fshow_ru" name="fshow_ru" type="checkbox" value="show_ru"' + ( filterDialogProps . fshow _ru ? 'checked="yes"' : '' ) + ' /><label for="fshow_ru"> ' + localizer . fshow _ru + '</label>' ;
html += ' <input id="fshow_artefacts" name="fshow_artefacts" type="checkbox" value="show_artefacts"' + ( filterDialogProps . fshow _artefacts ? 'checked="yes"' : '' ) + ' /><label for="fshow_artefacts"> ' + localizer . fshow _artefacts + '</label>' ;
html += '<br /><input id="frewardonly" name="frewardonly" type="checkbox" value="frewardonly"' + ( filterDialogProps . frewardonly ? 'checked="yes"' : '' ) + ' /><label for="frewardonly"> ' + localizer . frewardonly + '</label>' ;
html += getFilterFooterHtml ( ) ;
return html ;
}
function showCommonFilter ( )
{
dressOptions . currentFilterTab = 0 ;
storeFilterDialog ( ) ;
var filterWindow = document . getElementById ( 'filterWindow' ) ;
filterWindow . innerHTML = getCommonFilterHtml ( ) ;
}
function getMfFilterHtml ( )
{
var mfi = 0 ;
var html = '' ;
html += getFilterHeaderHtml ( ) ;
html += format ( '<label for="ffiltermf">{0}: </label><br /><select id="ffiltermf" name="ffiltermf">' , localizer . ffiltermf ) ;
html += '<option value="0"' + ( ( filterDialogProps . ffiltermf == null || filterDialogProps . ffiltermf == 0 ) ? ' selected="yes"' : '' ) + '>' + localizer . noFilterMf + '</option>' ;
mfi = 0 ;
for ( var mfn in item _props )
{
var prop = item _props [ mfn ] ;
mfi ++ ;
if ( ! ( 'inprpg' in prop ) && ! ( 'inmfg' in prop ) )
{
continue ;
}
html += '<option value="' + mfi + '"' + ( ( filterDialogProps . ffiltermf == mfi ) ? ' selected="yes"' : '' ) + '>' + prop . lbl + '</option>' ;
}
html += '</select><br />' ;
html += localizer . ffiltermfHint ;
html += getFilterFooterHtml ( ) ;
return html ;
}
function showMfFilter ( )
{
dressOptions . currentFilterTab = 1 ;
storeFilterDialog ( ) ;
var filterWindow = document . getElementById ( 'filterWindow' ) ;
filterWindow . innerHTML = getMfFilterHtml ( ) ;
}
function getItemSortHtml ( )
{
var html = '' ;
html += getFilterHeaderHtml ( ) ;
2023-01-10 18:29:32 +02:00
html += 'Пока не реализовано.' ;
2022-12-19 22:22:19 +02:00
html += getFilterFooterHtml ( ) ;
return html ;
}
function showItemSort ( )
{
dressOptions . currentFilterTab = 2 ;
storeFilterDialog ( ) ;
var filterWindow = document . getElementById ( 'filterWindow' ) ;
filterWindow . innerHTML = getItemSortHtml ( ) ;
}
function showCurrentFilter ( )
{
switch ( dressOptions . currentFilterTab )
{
case 2 :
showItemSort ( ) ;
break ;
case 1 :
showMfFilter ( ) ;
break ;
default :
showCommonFilter ( ) ;
break ;
}
}
function ShowCatRunes ( catid , stateId , slotId )
{
var state = dressStates [ stateId ] ;
var slot = getSlotById ( slotId ) ;
if ( state == null || slot == null )
{
return ;
}
if ( ! ( catid in categories ) || ( ! catid in catRunes ) )
{
return ;
}
var html = '' ;
var tableWidth = 5 * 60 ;
var subRunes = catRunes [ catid ] ;
html += '<table width="' + ( tableWidth + 1 ) + '" style="table-layout:fixed;" cellspacing="0" cellpadding="0" border="0"><tr><td align="left" valign="top" width="' + tableWidth + '">' ;
html += '<table width="' + tableWidth + '" style="table-layout:fixed;" cellspacing="0" cellpadding="0" border="0">' ;
for ( var subCatRune in subRunes )
{
html += '<tr>' ;
for ( var i = 0 ; i <= ( subRunes [ subCatRune ] . length ) - 1 ; i ++ )
{
var onclick = format ( "hideMenu(); ShowRuneOptions('{0}', '{1}', '{2}');" , stateId , slotId , subRunes [ subCatRune ] [ i ] ) ;
html += '<td>' + getPersObjectImageHtml ( state , slot , subRunes [ subCatRune ] [ i ] , dressOptions . showImages , onclick , 1 ) + '</td>' ;
}
html += '<td> </td></tr>' ;
}
for ( var i = 0 ; i <= superRunes . length - 1 ; i ++ )
{
if ( i == 0 ) { html += '<tr>' ; }
if ( i > 0 && ( ( i / 5 ) == Math . floor ( i / 5 ) ) ) { html += '</tr><tr>' ; }
var onclick = format ( "onSetRune('{0}', '{1}', '{2}', '0')" , state . id , slot . id , superRunes [ i ] ) ;
html += '<td>' + getPersObjectImageHtml ( state , slot , superRunes [ i ] , dressOptions . showImages , onclick , 1 ) + '</td>' ;
if ( i == superRunes . length - 1 ) { html += '</tr>' ; }
}
html += '</table></td>' ;
html += '<td width="1"><img src="' + blankImgPath + '" width="1" height="100" border="0" /></td></tr>' ;
html += getRowMenuSeparatorHtml ( ) ;
html += getRowMenuItemHtml ( localizer . unRune , format ( "onUnRuneObject('{0}', '{1}', '')" , state . id , slot . id ) ) ;
html += getRowMenuSeparatorHtml ( ) ;
html += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) + '</table>' ;
showMenu ( html ) ;
if ( is . ie )
{
window . event . returnValue = false ;
}
return false ;
}
function ShowRuneOptions ( stateId , slotId , runeId )
{
var state = dressStates [ stateId ] ;
var slot = getSlotById ( slotId ) ;
var o = getObjectById ( runeId ) ;
if ( state == null || slot == null || ! ( 'modify' in o ) )
{
return ;
}
if ( ! ( 'opts' in o . modify ) ) { return ; }
if ( o . modify . opts . length < 1 ) { return ; }
var html = '' ;
html = '<table width="300px" border="0">' ;
html += '<tr><td align="center">' + o . caption . bold ( ) + '</td></tr>' ;
for ( var a = 0 ; a <= o . modify . opts . length - 1 ; a ++ )
{
for ( var imod in o . modify . opts [ a ] )
{
if ( ! item _props [ imod ] )
{ continue ; }
html += getRowMenuItemHtml ( getHtmlOfSignedProp ( o . modify . opts [ a ] , item _props [ imod ] , imod , null , null , null ) , format ( "onSetRune('{0}', '{1}', '{2}', '{3}')" , state . id , slot . id , o . id , a ) ) ;
}
}
//html += getRowMenuItemHtml(localizer.noSharpening, format("onSharpWeapon('{0}', '{1}', 0)", state.id, slot.id));
html += getRowMenuSeparatorHtml ( ) ;
html += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) + '</table>' ;
showMenu ( html ) ;
if ( is . ie )
{
window . event . returnValue = false ;
}
return false ;
}
function onSetRune ( stateId , slotId , runeId , optId )
{
hideMenu ( ) ;
var state = dressStates [ stateId ] ;
var slot = getSlotById ( slotId ) ;
var o = getObjectById ( runeId ) ;
if ( state == null || slot == null || ! ( 'modify' in o ) )
{
return ;
}
if ( ! ( 'opts' in o . modify ) ) { return ; }
if ( o . modify . opts [ optId ] == null ) { return ; }
state . runeSlots [ slot . index ] = runeId + '#' + optId ;
updateDresserSlot ( state , slot ) ;
}
function applyItemsToCategoryView ( )
{
var hashv = getFilterHash ( ) ;
var state = activeState ;
var itemsView = document . getElementById ( 'itemsView' ) ;
var html = '' ;
var catid = document . getElementById ( 'chosenCategory' ) . value ;
if ( ! ( catid in catlistsources ) )
{
catlistsources [ catid ] = { } ;
}
var cathash = catlistsources [ catid ] ;
if ( hashv in cathash )
{
html = cathash [ hashv ] ;
}
else
{
var tableWidth = 8 * 60 ;
var slotid = document . getElementById ( 'chosenSlot' ) . value ;
var cat = categories [ catid ] ;
var slot = getSlotById ( slotid ) ;
var perRow = ( dressOptions . showImages ) ? ( tableWidth / slot . width ) : 3 ;
var fitems = getFilteredItems ( cat . items ) ;
html += '<table width="' + ( tableWidth + 1 ) + '" style="table-layout:fixed;" cellspacing="0" cellpadding="0" border="0"><tr><td align="left" valign="top" width="' + tableWidth + '">' ;
html += '<table width="' + tableWidth + '" style="table-layout:fixed;" cellspacing="0" cellpadding="0" border="0"><tr>' ;
for ( var i = 0 ; i < fitems . length ; i ++ )
{
var onclick = format ( "hideMenu(); onItemWear('{0}', '{1}')" , slotid , fitems [ i ] . id ) ;
html += '<td>' +
getPersObjectImageHtml ( state , slot , fitems [ i ] . id , dressOptions . showImages , onclick ) ;
html += '</td>' ;
if ( ( i % perRow ) == ( perRow - 1 ) )
{
html += '</tr><tr>' ;
}
}
html += '</tr></table></td>' ;
html += '<td width="1"><img src="' + blankImgPath + '" width="1" height="200" border="0" /></td></tr></table>' ;
cathash [ hashv ] = html ;
}
itemsView . innerHTML = html ;
}
function onCategorySelect ( stateid , slotid , catId )
{
setupFilterFialog ( ) ;
clearMenuOnceWhenClosed = true ;
var cat = categories [ catId ] ;
var state = dressStates [ stateid ] ;
var slot = getSlotById ( slotid ) ;
if ( state == null || slot == null || cat == null )
{
return ;
}
var menuHtml = '' ;
if ( catId in catselsources )
{
menuHtml = catselsources [ catId ] ;
}
else
{
var tableWidth = 8 * 60 ;
tableWidth += 1 ;
menuHtml += '<div id="filterWindow" style="position:absolute; visibility: hidden; left:4px; top:20px; width:' + ( tableWidth - 8 ) + 'px; z-index:12; background-color:white; border:1px solid black; filter:alpha(opacity = 95, style = 4), blendtrans(duration = 0.3) progid:DXImageTransform.Microsoft.Shadow(color=' + "'#666666'" + ', Direction=135, Strength=4); font-size:10px"></div>' ;
menuHtml += '<div style="width:' + tableWidth + 'px; ">' ;
menuHtml += '<table width="' + tableWidth + '" cellspacing="0" cellpadding="0" border="0"><tr><td><b style="font-size: 16px;">' ;
menuHtml += cat . caption ;
menuHtml += '</b></td>' ;
menuHtml += getCellMenuItemHtml _Core ( '<span style="font-size: 10px;">' + localizer . setFilter + '</span>' , 'onSetInlineFilter()' ) ;
menuHtml += getCellMenuSeparatorHtml ( ) ;
menuHtml += getCellMenuItemHtml _Core ( '<span style="font-size: 10px;">' + localizer . resetFilter + '</span>' , 'onResetInlineFilter()' ) ;
menuHtml += '</tr></table>' ;
menuHtml += '<input type="hidden" id="chosenSlot" value="' + slotid + '" />' ;
menuHtml += '<input type="hidden" id="chosenCategory" value="' + catId + '" />' ;
menuHtml += '<table width="' + tableWidth + '" style="cellspacing="0" cellpadding="0" border="0"><tr><td valign="top">' ;
2023-01-10 18:29:32 +02:00
//menuHtml += '<div id="itemsView" style="width: 500px; height:250px; overflow:auto; filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1,enabled=false) progid:DXImageTransform.Microsoft.Alpha(opacity=50,style=0,enabled=false);"><center>Идёт фильтрация...</center></div>';
menuHtml += '<div id="itemsView" style="width: 100%; filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1,enabled=false) progid:DXImageTransform.Microsoft.Alpha(opacity=50,style=0,enabled=false);"><center>Идёт фильтрация...</center></div>' ;
2022-12-19 22:22:19 +02:00
menuHtml += '</td></tr><tr><td valign="bottom"><hr class="dashed" />' ;
menuHtml += '</td></tr>' ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table>' ;
menuHtml += '</div>' ;
catselsources [ catId ] = menuHtml ;
}
showMenu ( menuHtml ) ;
applyItemsToCategoryView ( ) ;
}
function onItemWear ( slotid , objId )
{
var state = activeState ;
if ( state == null ) return ;
setObjectForSlot ( state , slotid , objId ) ;
if ( objId == null ) return ;
var o = getObjectById ( objId ) ;
if ( o == null ) return ;
if ( slotid == 'w3' && isSecondaryWeapon ( o ) )
{
if ( state . objects [ slot _w10 . index ] == null )
{
setObjectForSlot ( state , 'w10' , objId ) ;
}
}
if ( slotid == 'w10' && isSecondaryWeapon ( o ) )
{
if ( state . objects [ slot _w3 . index ] == null )
{
setObjectForSlot ( state , 'w3' , objId ) ;
}
}
if ( slotid == 'w6' )
{
if ( state . objects [ slot _w7 . index ] == null )
{
setObjectForSlot ( state , 'w7' , objId ) ;
}
if ( state . objects [ slot _w8 . index ] == null )
{
setObjectForSlot ( state , 'w8' , objId ) ;
}
}
if ( slotid == 'w7' )
{
if ( state . objects [ slot _w6 . index ] == null )
{
setObjectForSlot ( state , 'w6' , objId ) ;
}
if ( state . objects [ slot _w8 . index ] == null )
{
setObjectForSlot ( state , 'w8' , objId ) ;
}
}
if ( slotid == 'w8' )
{
if ( state . objects [ slot _w6 . index ] == null )
{
setObjectForSlot ( state , 'w6' , objId ) ;
}
if ( state . objects [ slot _w7 . index ] == null )
{
setObjectForSlot ( state , 'w7' , objId ) ;
}
}
}
function onItemWearFrom ( slotid , slotfromid )
{
var state = activeState ;
var slotTo = getSlotById ( slotid ) ;
var slotFrom = getSlotById ( slotfromid ) ;
if ( state == null || slotTo == null || slotFrom == null )
{
return ;
}
state . objects [ slotTo . index ] = state . objects [ slotFrom . index ] ;
state . upgradeSlots [ slotTo . index ] = state . upgradeSlots [ slotFrom . index ] ;
state . fitSlots [ slotTo . index ] = state . fitSlots [ slotFrom . index ] ;
state . charmSlots [ slotTo . index ] = state . charmSlots [ slotFrom . index ] ;
state . addSlots [ slotTo . index ] = state . addSlots [ slotFrom . index ] ;
state . runeSlots [ slotTo . index ] = state . runeSlots [ slotFrom . index ] ;
state . objCache [ slotTo . index ] = state . objCache [ slotFrom . index ] ;
updateDresserSlot ( state , slotTo ) ;
}
function showItemProps ( imgElt )
{
var o = null ;
var state = getImgEltState ( imgElt ) ;
if ( state == null )
{
state = activeState ;
}
var slot = null ;
if ( isImgInSlot ( imgElt ) )
{
slot = getImgEltSlot ( imgElt ) ;
o = getObjectByStateSlot ( state , getImgEltSlot ( imgElt ) ) ;
}
if ( o == null )
{
var oid = imgElt . name . substr ( 1 ) ;
o = getObjectById ( oid ) ;
}
showPopup ( getObjectDescHtml ( state , o ) ) ;
}
function showItemProps2 ( stateid , oid )
{
var state = dressStates [ stateid ] ;
var o = getObjectById ( oid ) ;
showPopup ( getObjectDescHtml ( state , o ) ) ;
}
function showSetProps ( stateid , setid )
{
var state = dressStates [ stateid ] ;
var setd = getSetAndCountById ( setid ) ;
var html = getObjectDescHtml ( state , setd . count )
var ahtml = '' ;
for ( var scn in setd . set . details )
{
if ( scn == setd . count . id ) continue ;
if ( ahtml != '' )
{
ahtml += '<hr class="dashed" width="120" />' ;
}
ahtml += getObjectDescHtml ( state , setd . set . details [ scn ] ) ;
}
if ( ahtml != '' )
{
html += '<hr width="120" /><i>' + localizer . setVariantsAvailable + '</i><blockquote>' + ahtml + '</blockquote>' ;
}
showPopup ( html ) ;
}
function showStrengtheningProps ( stateid , strengtheningid )
{
var state = dressStates [ stateid ] ;
var strengthening = getStrengtheningById ( strengtheningid ) ;
showPopup ( getObjectDescHtml ( state , strengthening ) ) ;
}
function getObjectByStateSlot ( state , slot )
{
if ( state == null || slot == null )
{
return null ;
}
var obj = state . objCache [ slot . index ] ;
if ( obj != null )
{
return obj ;
}
obj = getObjectById ( state . objects [ slot . index ] ) ;
if ( state . upgradeSlots [ slot . index ] != null )
{
obj = getUpgradeObject ( obj , state . upgradeSlots [ slot . index ] ) ;
}
if ( state . fitSlots [ slot . index ] != null )
{
obj = getFittedObject ( obj , state . fitSlots [ slot . index ] ) ;
}
if ( state . charmSlots [ slot . index ] != null )
{
obj = getCharmedObject2 ( obj , state . charmSlots [ slot . index ] ) ;
}
if ( state . addSlots [ slot . index ] != null )
{
obj = getAddObject2 ( obj , state . addSlots [ slot . index ] ) ;
}
if ( state . runeSlots [ slot . index ] != null )
{
obj = getRunedObject ( obj , state . runeSlots [ slot . index ] ) ;
}
if ( state . fitArmor && ( slot . id == 'w4' ) )
{
obj = getFittedArmor ( obj ) ;
}
else if ( ( state . w3sharp > 0 ) && ( slot . id == 'w3' ) )
{
obj = getSharpenWeapon ( obj , state . w3sharp ) ;
}
else if ( ( state . w10sharp > 0 ) && ( slot . id == 'w10' ) )
{
obj = getSharpenWeapon ( obj , state . w10sharp ) ;
}
state . objCache [ slot . index ] = obj ;
return obj ;
}
function getObjectFilter ( state , slot , o )
{
var r = '' ;
if ( o == null )
{
return r ;
}
if ( slot . id == 'w3' && state . w3sharp > 0 )
{
r += 'blur ' ;
}
if ( slot . id == 'w10' && state . w10sharp > 0 )
{
r += 'blur ' ;
}
if ( ( 'armorWasFit' in o ) && o . armorWasFit )
{
r += 'glo2 ' ;
}
if ( ( 'wasFit' in o ) && o . wasFit )
{
r += 'glo2 ' ;
}
if ( ( 'wasUpgrade' in o ) && o . wasUpgrade )
{
if ( 'fake' in o )
{
r += 'blueshadow ' ;
}
else
{
r += 'goldshadow ' ;
}
}
if ( ( 'wasCharmed' in o ) && o . wasCharmed )
{
r += 'purpleshadow ' ;
}
if ( ( 'wasAdded' in o ) && o . wasAdded )
{
r += 'redshadow ' ;
}
if ( ( 'wasRuned' in o ) && o . wasRuned )
{
r += 'redshadow ' ;
}
return r ;
}
function isImportantStateArray ( a )
{
for ( var i = 0 ; i < a . length ; i ++ )
{
if ( a [ i ] != null )
{
return true ;
}
}
return false ;
}
function getPackedObjectsRepresentation ( a )
{
var r = '' ;
var rl = 0 ;
for ( var i = 0 ; i < a . length ; i ++ )
{
if ( a [ i ] != null )
{
rl = i + 1 ;
}
}
for ( var i = 0 ; i < rl ; i ++ )
{
if ( i > 0 )
{
r += '/' ;
}
if ( a [ i ] != null )
{
r += a [ i ] ;
}
}
return r ;
}
function getUnpackedObjectsRepresentation ( pa )
{
var r = new Array ( slots . length ) ;
var a = pa . split ( '/' ) ;
for ( var i = 0 ; i < a . length ; i ++ )
{
if ( a [ i ] != '' )
{
r [ i ] = a [ i ] ;
}
}
return r ;
}
function getSerializableState ( state )
{
var r = { } ;
r . version = serializableStateFormatVersion ;
if ( state . name != '' )
{
r . name = state . name ;
}
if ( state . align != '0' )
{
r . align = state . align ;
}
if ( state . clan != '' )
{
r . clan = state . clan ;
}
if ( state . sex != 0 )
{
r . sex = state . sex ;
}
if ( state . image != '0' )
{
r . image = state . image ;
}
if ( state . sign != '' )
{
r . sign = state . sign ;
}
r . natural = { } ;
for ( var i = 0 ; i < knownNaturalEditors . length ; i ++ )
{
var propName = knownNaturalEditors [ i ] ;
if ( propName == '-' )
{
continue ;
}
if ( propName in state . natural )
{
var v = state . natural [ propName ] ;
if ( v > 0 )
{
r . natural [ propName ] = v ;
}
}
}
if ( isImportantStateArray ( state . objects ) )
{
// r.objects = cloneArray(state.objects);
r . o1 = getPackedObjectsRepresentation ( state . objects ) ;
}
if ( state . w3sharp > 0 )
{
r . w3sharp = state . w3sharp ;
}
if ( state . w10sharp > 0 )
{
r . w10sharp = state . w10sharp ;
}
if ( state . fitArmor )
{
r . fitArmor = state . fitArmor ;
}
if ( isImportantStateArray ( state . fitSlots ) )
{
// r.fitSlots = cloneArray(state.fitSlots);
r . fs1 = getPackedObjectsRepresentation ( state . fitSlots ) ;
}
if ( isImportantStateArray ( state . upgradeSlots ) )
{
// r.upgradeSlots = cloneArray(state.upgradeSlots);
r . us1 = getPackedObjectsRepresentation ( state . upgradeSlots ) ;
}
if ( isImportantStateArray ( state . charmSlots ) )
{
// r.charmSlots = cloneArray(state.charmSlots);
r . cs1 = getPackedObjectsRepresentation ( state . charmSlots ) ;
}
if ( isImportantStateArray ( state . addSlots ) )
{
// r.charmSlots = cloneArray(state.charmSlots);
r . cs1 = getPackedObjectsRepresentation ( state . addSlots ) ;
}
if ( isImportantStateArray ( state . runeSlots ) )
{
// r.charmSlots = cloneArray(state.charmSlots);
r . cs2 = getPackedObjectsRepresentation ( state . runeSlots ) ;
}
if ( state . statElix != null )
{
r . statElix = state . statElix ;
}
if ( state . spellIntel > 0 )
{
r . spellIntel = state . spellIntel ;
}
if ( state . spellBD > 0 )
{
r . spellBD = state . spellBD ;
}
if ( state . spellHitpoints > 0 )
{
r . spellHitpoints = state . spellHitpoints ;
}
var hasPowerUps = false ;
for ( var powerupn in state . spellPowerUps )
{
hasPowerUps = true ;
break ;
}
if ( hasPowerUps )
{
r . spellPowerUps = state . spellPowerUps ;
}
var hasDamageElixes = false ;
for ( var powerupn in state . damageElixes )
{
hasDamageElixes = true ;
break ;
}
if ( hasDamageElixes )
{
r . damageElixes = state . damageElixes ;
}
var hasDefElixes = false ;
for ( var powerupn in state . defElixes )
{
hasDefElixes = true ;
break ;
}
if ( hasDefElixes )
{
r . defElixes = state . defElixes ;
}
if ( state . pet != null )
{
r . pet = state . pet ;
}
if ( isImportantStateArray ( state . trickSlots ) )
{
r . ts1 = getPackedObjectsRepresentation ( state . trickSlots ) ;
}
return r ;
}
function getRightSizeArray ( a , rightSize )
{
if ( a . length == rightSize )
{
return a ;
}
var r = new Array ( rightSize ) ;
for ( var i = 0 ; ( i < rightSize ) && ( i < a . length ) ; i ++ )
{
r [ i ] = a [ i ] ;
}
return r ;
}
function applyDeserializedState ( stateid , r )
{
if ( r == null )
{
return ;
}
if ( r . version != serializableStateFormatVersion )
{
alert ( "incompatible version of serialized state. expected " + serializableStateFormatVersion + " but got " + v ) ;
return ;
}
var replaceMode = ( stateid != null ) && ( ( stateid in dressStates ) || ( stateid in droppedDressStates ) ) ;
var state = createNewDresserState ( stateid ) ;
if ( 'name' in r )
{
state . name = r . name ;
}
if ( 'align' in r )
{
state . align = r . align ;
}
if ( 'clan' in r )
{
state . clan = r . clan ;
}
if ( 'sex' in r )
{
state . sex = r . sex ;
}
if ( 'image' in r )
{
state . image = r . image ;
}
if ( 'sign' in r )
{
state . sign = r . sign ;
}
state . natural = r . natural ;
if ( ! ( 'pstat' in state . natural ) )
{
state . natural . pstat = 0 ;
state . natural . pskil = 0 ;
}
if ( 'objects' in r )
{
state . objects = getRightSizeArray ( r . objects , slots . length ) ;
}
if ( 'o1' in r )
{
state . objects = getRightSizeArray ( getUnpackedObjectsRepresentation ( r . o1 ) , slots . length ) ;
}
if ( 'w3sharp' in r )
{
state . w3sharp = parseInt ( r . w3sharp ) ;
}
if ( 'w10sharp' in r )
{
state . w10sharp = parseInt ( r . w10sharp ) ;
}
if ( 'fitArmor' in r )
{
state . fitArmor = r . fitArmor ;
}
if ( 'fitSlots' in r )
{
state . fitSlots = getRightSizeArray ( r . fitSlots , slots . length ) ;
}
if ( 'fs1' in r )
{
state . fitSlots = getRightSizeArray ( getUnpackedObjectsRepresentation ( r . fs1 ) , slots . length ) ;
}
if ( 'upgradeSlots' in r )
{
state . upgradeSlots = getRightSizeArray ( r . upgradeSlots , slots . length ) ;
}
if ( 'us1' in r )
{
state . upgradeSlots = getRightSizeArray ( getUnpackedObjectsRepresentation ( r . us1 ) , slots . length ) ;
}
if ( 'charmSlots' in r )
{
state . charmSlots = getRightSizeArray ( r . charmSlots , slots . length ) ;
}
if ( 'addSlots' in r )
{
state . addSlots = getRightSizeArray ( r . addSlots , slots . length ) ;
}
if ( 'charmSlots' in r )
{
state . charmSlots = getRightSizeArray ( r . charmSlots , slots . length ) ;
}
if ( 'runeSlots' in r )
{
state . runeSlots = getRightSizeArray ( r . runeSlots , slots . length ) ;
}
if ( 'cs1' in r )
{
state . charmSlots = getRightSizeArray ( getUnpackedObjectsRepresentation ( r . cs1 ) , slots . length ) ;
}
if ( 'cs2' in r )
{
state . runeSlots = getRightSizeArray ( getUnpackedObjectsRepresentation ( r . cs2 ) , slots . length ) ;
}
if ( ( 'statElix' in r ) && ( r . statElix . elixn in knownElix ) )
{
state . statElix = r . statElix ;
}
if ( 'spellIntel' in r )
{
state . spellIntel = parseInt ( r . spellIntel ) ;
}
if ( 'spellBD' in r )
{
state . spellBD = parseInt ( r . spellBD ) ;
}
if ( 'spellHitpoints' in r )
{
state . spellHitpoints = parseInt ( r . spellHitpoints ) ;
}
if ( 'spellPowerUps' in r )
{
state . spellPowerUps = r . spellPowerUps ;
}
if ( 'damageElixes' in r )
{
state . damageElixes = r . damageElixes ;
}
if ( 'defElixes' in r )
{
state . defElixes = r . defElixes ;
}
if ( 'pet' in r )
{
state . pet = r . pet ;
}
if ( 'ts1' in r )
{
state . trickSlots = getRightSizeArray ( getUnpackedObjectsRepresentation ( r . ts1 ) , 20 ) ;
}
for ( var i = 0 ; i < slots . length ; i ++ )
{
if ( state . objects [ i ] == null )
{
continue ;
}
var o = getObjectById ( state . objects [ i ] ) ;
if ( o == null )
{
state . objects [ i ] = null ;
state . fitSlots [ i ] = null ;
state . upgradeSlots [ i ] = null ;
state . charmSlots [ i ] = null ;
state . addSlots [ i ] = null ;
state . runeSlots [ i ] = null ;
continue ;
}
if ( state . upgradeSlots [ i ] != null )
{
if ( ! ( 'upgrade' in o ) || ! ( getJSName ( state . upgradeSlots [ i ] ) in o . upgrade ) )
{
state . upgradeSlots [ i ] = null ;
}
}
}
for ( var ti = 0 ; i < state . trickSlots . length ; i ++ )
{
var trick = state . trickSlots [ ti ] ;
if ( trick != null )
{
if ( ! ( getJSName ( trick ) in tricks ) )
{
state . trickSlots [ ti ] = null ;
}
}
}
activeState = state ;
updateTabs ( false ) ;
if ( replaceMode )
{
hardUpdateDresserState ( state ) ;
}
else
{
recalcDresserState ( state ) ;
updateCabs ( ) ;
}
changeCab ( state . id ) ;
someStatesLoaded = true ;
}
function loadEnteredSet ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var telt = document . getElementById ( 'setArea' ) ;
if ( telt == null )
{
return ;
}
var text = telt . value ;
if ( text . indexOf ( absoluteDressRoomUrl ) === 0 )
{
// its friendlink.
text = text . substr ( absoluteDressRoomUrl . length + '?data=' . length ) ;
text = unescape ( text ) ;
}
if ( text == '' )
{
2023-01-10 18:29:32 +02:00
alert ( 'Введите сперва текст, описывающий состав комплекта.' ) ;
2022-12-19 22:22:19 +02:00
return ;
}
var dstate = deserializeObject ( text ) ;
applyDeserializedState ( state . id , dstate ) ;
}
function onLoadSet ( stateid )
{
var menuHtml = '<table width="340" border="0"><tr><td>' ;
menuHtml += format ( localizer . loadSetHint , clanImgPath ) ;
menuHtml += '<br /><textarea id="setArea" cols="60" rows="8" wrap="VIRTUAL">' ;
menuHtml += '</textarea></td></tr>' ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . loadSet , "loadEnteredSet()" ) ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , "hideMenu()" ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml , false ) ;
var telt = document . getElementById ( 'setArea' ) ;
if ( telt != null )
{
telt . focus ( ) ;
telt . select ( ) ;
}
}
function saveOnServer ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var text = serializeObject ( getSerializableState ( state ) ) ;
var url = format ( saveSetOnServerUrl , escape ( text ) ) ;
window . open ( url , '_blank' ) ;
}
function onSaveSet ( stateid )
{
var state = dressStates [ stateid ] ;
if ( state == null )
{
return ;
}
var menuHtml = '<table width="340" border="0"><tr><td>' ;
var text = serializeObject ( getSerializableState ( state ) ) ;
menuHtml += format ( localizer . saveSetHint , clanImgPath ) ;
menuHtml += '<br /><textarea id="setArea" class="inpText" cols="60" rows="8" wrap="VIRTUAL" readonly="true">' ;
menuHtml += text ;
menuHtml += '</textarea></td></tr>' ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . saveSetOnServer , "saveOnServer()" ) ;
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , "hideMenu()" ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml , false ) ;
var telt = document . getElementById ( 'setArea' ) ;
if ( telt != null )
{
telt . focus ( ) ;
telt . select ( ) ;
}
}
function getNextGoodSlot ( o , slot )
{
if ( slot . id == 'w3' )
{
if ( isSecondaryWeapon ( o ) )
{
return getSlotById ( 'w10' ) ;
}
}
else
{
var ngsSpellsData = [ ] ;
for ( var i = 100 ; i <= 109 ; i ++ )
{
ngsSpellsData . push ( 'w' + i ) ;
}
var ngsData = new Array (
new Array ( 'w6' , 'w7' , 'w8' ) ,
new Array ( 'w14' , 'w15' , 'w16' ) ,
ngsSpellsData
) ;
for ( var i = 0 ; i < ngsData . length ; i ++ )
{
var ngsDataRow = ngsData [ i ] ;
for ( j = 0 ; j < ( ngsDataRow . length - 1 ) ; j ++ )
{
if ( slot . id == ngsDataRow [ j ] )
{
return getSlotById ( ngsDataRow [ j + 1 ] ) ;
}
}
}
}
return null ;
}
function testShortInfoRe ( state , o , s , re , sharp , minvname , maxvname )
{
var m = s . match ( re ) ;
if ( m != null )
{
var ou = null ;
var minm = parseInt ( m [ 1 ] ) ;
var maxm = parseInt ( m [ 2 ] ) ;
for ( var upgraden in o . upgrade )
{
var uobj = getUpgradeObject ( o , upgraden ) ;
if ( ! ( 'level' in uobj ) || ( uobj . level > state . natural . level ) )
{
continue ;
}
if ( sharp > 0 )
{
uobj = getSharpenWeapon ( uobj , sharp ) ;
}
if ( 'properties' in uobj )
{
var pou = null ;
if ( minvname in uobj . properties )
{
if ( uobj . properties [ minvname ] > minm )
{
break ;
}
pou = upgraden ;
}
if ( maxvname in uobj . properties )
{
if ( uobj . properties [ maxvname ] > maxm )
{
break ;
}
if ( ( minvname in uobj . properties ) && pou == null )
{
continue ;
}
pou = upgraden ;
}
if ( pou != null ) ou = pou ;
}
if ( 'modify' in uobj )
{
var pou = null ;
if ( minvname in uobj . modify )
{
if ( uobj . modify [ minvname ] > minm )
{
break ;
}
pou = upgraden ;
}
if ( maxvname in uobj . modify )
{
if ( uobj . modify [ maxvname ] > maxm )
{
break ;
}
if ( ( minvname in uobj . modify ) && pou == null )
{
continue ;
}
pou = upgraden ;
}
if ( pou != null ) ou = pou ;
}
}
return { upgraden : ou , found : true } ;
}
return { upgraden : null , found : false } ;
}
function testShortInfoRe1 ( state , o , s , re , sharp , vname )
{
var m = s . match ( re ) ;
if ( m != null )
{
var ou = null ;
var m1 = parseInt ( m [ 1 ] ) ;
for ( var upgraden in o . upgrade )
{
var uobj = getUpgradeObject ( o , upgraden ) ;
if ( ! ( 'level' in uobj ) || ( uobj . level > state . natural . level ) )
{
continue ;
}
if ( sharp > 0 )
{
uobj = getSharpenWeapon ( uobj , sharp ) ;
}
if ( 'properties' in uobj )
{
if ( vname in uobj . properties )
{
if ( uobj . properties [ vname ] > m1 )
{
break ;
}
ou = upgraden ;
}
}
if ( 'modify' in uobj )
{
if ( vname in uobj . modify )
{
if ( uobj . modify [ vname ] > m1 )
{
break ;
}
ou = upgraden ;
}
}
}
return { upgraden : ou , found : true } ;
}
return { upgraden : null , found : false } ;
}
function applyAssortedObject ( state , oid , odic )
{
var o = getObjectById ( oid ) ;
if ( o == null )
{
return ;
}
var ou = null ;
if ( 'baseitem' in o )
{
ou = o . id ;
o = getObjectById ( o . baseitem ) ;
}
var baseSlot = getSlotById ( o . slot ) ;
for ( var slot = baseSlot ; slot != null ; slot = getNextGoodSlot ( o , slot ) )
{
if ( state . objects [ slot . index ] == null )
{
state . objects [ slot . index ] = o . id ;
var odicname = ( odic . length > 0 ) ? odic [ 0 ] : '' ;
if ( baseSlot . id == 'w3' )
{
// look for sharpness
var sharps = odicname . match ( reSharpness ) ;
if ( sharps != null )
{
state [ slot . id + 'sharp' ] = parseInt ( sharps [ 1 ] ) ;
}
if ( ( 'upgrade' in o ) && ( ou == null ) )
{
for ( var i = 1 ; i < odic . length ; i ++ )
{
var r = testShortInfoRe ( state , o , odic [ i ] , reDamage , state [ slot . id + 'sharp' ] , 'mindamage' , 'maxdamage' ) ;
if ( r . found )
{
ou = r . upgraden ;
break ;
}
}
}
}
else
{
if ( ( 'upgrade' in o ) && ( ou == null ) )
{
for ( var i = 1 ; i < odic . length ; i ++ )
{
var r = testShortInfoRe1 ( state , o , odic [ i ] , reHitPoints , 0 , 'hitpoints' ) ;
if ( r . found )
{
ou = r . upgraden ;
break ;
}
r = testShortInfoRe ( state , o , odic [ i ] , reHeadArmor , 0 , 'headarmor1' , 'headarmor2' ) ;
if ( r . found )
{
ou = r . upgraden ;
break ;
}
r = testShortInfoRe ( state , o , odic [ i ] , reBodyArmor , 0 , 'bodyarmor1' , 'bodyarmor2' ) ;
if ( r . found )
{
ou = r . upgraden ;
break ;
}
r = testShortInfoRe ( state , o , odic [ i ] , reWaistArmor , 0 , 'waistarmor1' , 'waistarmor2' ) ;
if ( r . found )
{
ou = r . upgraden ;
break ;
}
r = testShortInfoRe ( state , o , odic [ i ] , reLegArmor , 0 , 'legarmor1' , 'legarmor2' ) ;
if ( r . found )
{
ou = r . upgraden ;
break ;
}
}
}
}
if ( ou != null )
{
state . upgradeSlots [ slot . index ] = ou ;
}
state . objCache [ slot . index ] = null ;
break ;
}
}
}
function _x _cabTo ( id , val )
{
var tval = val ? 'activeLink' : 'usualLink' ;
document . getElementById ( id ) . className = tval ;
}
function _x _cabOn ( id )
{
document . getElementById ( id ) . className = 'activeLink' ;
}
function _x _cabOff ( id )
{
document . getElementById ( id ) . className = 'usualLink' ;
}
function changeCab ( cabid )
{
activeState = null ;
hidePopup ( ) ;
hideMenu ( ) ;
var stateCount = 0 ;
for ( var staten in dressStates )
{
stateCount ++ ;
}
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
var tval = ( state . id == cabid ) ? 'activeLink' : 'usualLink' ;
var dval = ( state . id == cabid ) ? '' : 'none' ;
_x _cabTo ( 'tab_' + state . id , ( state . id == cabid ) , dressOptions . useTransitionEffects ) ;
if ( state . id == cabid )
{
activeState = state ;
fastUpdateDresserState ( state ) ;
}
document . getElementById ( 'cab_' + state . id ) . style . display = dval ;
}
if ( cabid == 'summary' )
{
_x _cabOn ( 'tabx_summary' , dressOptions . useTransitionEffects ) ;
showSummary ( ) ;
}
else
{
_x _cabOff ( 'tabx_summary' , dressOptions . useTransitionEffects ) ;
hideSummary ( ) ;
}
if ( cabid == 'exptable' )
{
_x _cabOn ( 'tabx_exptable' , dressOptions . useTransitionEffects ) ;
showExpTable ( ) ;
}
else if ( dressOptions . showExp )
{
_x _cabOff ( 'tabx_exptable' , dressOptions . useTransitionEffects ) ;
hideExpTable ( ) ;
}
if ( cabid == 'healer' )
{
_x _cabOn ( 'tabx_healer' , dressOptions . useTransitionEffects ) ;
showHealer ( ) ;
}
else if ( dressOptions . showHealer )
{
_x _cabOff ( 'tabx_healer' , dressOptions . useTransitionEffects ) ;
hideHealer ( ) ;
}
if ( cabid == 'battles' )
{
_x _cabOn ( 'tabx_battles' , dressOptions . useTransitionEffects ) ;
showBattles ( ) ;
}
else
{
_x _cabOff ( 'tabx_battles' , dressOptions . useTransitionEffects ) ;
hideBattles ( ) ;
}
if ( cabid == 'builder' )
{
_x _cabOn ( 'tabx_builder' , dressOptions . useTransitionEffects ) ;
showBuilder ( ) ;
}
else if ( dressOptions . showBuilder )
{
_x _cabOff ( 'tabx_builder' , dressOptions . useTransitionEffects ) ;
hideBuilder ( ) ;
}
}
function createCab ( )
{
var state = createNewDresserState ( null ) ;
activeState = null ;
updateTabs ( true ) ;
updateCabs ( ) ;
activeState = null ;
updateDresserState ( state ) ;
changeCab ( state . id ) ;
}
function removeCab2 ( cabId )
{
var stateCount = 0 ;
for ( var staten in dressStates )
{
stateCount ++ ;
}
if ( stateCount < 2 )
{
2023-01-10 18:29:32 +02:00
alert ( 'Удаление единственной кабинки не разрешается' ) ;
2022-12-19 22:22:19 +02:00
return ;
}
if ( activeState . id == cabId )
{
activeState = null ;
}
var nextActiveState = null ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
if ( state . id == cabId )
{
droppedDressStates [ staten ] = cabId ;
document . getElementById ( 'cab_' + state . id ) . style . display = 'none' ;
delete dressStates [ staten ] ;
break ;
}
nextActiveState = state ;
}
if ( nextActiveState == null )
{
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
nextActiveState = state ;
break ;
}
}
if ( activeState == null )
{
activeState = nextActiveState ;
}
updateTabs ( false ) ;
changeCab ( activeState . id ) ;
}
function getTabsHtml ( tabActive )
{
var html = '' ;
var stateCount = 0 ;
var classn ;
var i = 1 ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
classn = ( activeState != null && state . id == activeState . id ) ? 'activeLink' : 'usualLink' ;
html += format ( '<li id="tab_{5}" class="{2}"><a href="javascript:;" onclick="changeCab({4})"><nobr>{0} {1} <img onclick="removeCab2({4})" src="{3}closeCab.gif" width="10" height="10" border="0" title="{6}" /></nobr></a></li>' , localizer . upperCab , i , classn , hereItemImgPath , "'" + state . id + "'" , state . id , localizer . closeCab ) ;
stateCount ++ ;
i ++ ;
}
html += format ( '<li id="tabx_newcab"><a title="{1}" onclick="createCab()" href="javascript:;"><nobr>{0}</nobr></a></li>' , localizer . newCab , localizer . newCabHint ) ;
html += format ( '<li id="tabx_summary"><a title="{1}" onclick="changeCab({2})" href="javascript:;"><nobr>{0}</nobr></a></li>' , localizer . summaryTableCab , localizer . summaryTableHint , "'summary'" ) ;
if ( dressOptions . showExp )
{
html += format ( '<li id="tabx_exptable"><a title="{1}" onclick="changeCab({2})" href="javascript:;"><nobr>{0}</nobr></a></li>' , localizer . expTableCab , '' , "'exptable'" ) ;
}
if ( dressOptions . showHealer )
{
2023-01-10 18:29:32 +02:00
html += format ( '<li id="tabx_healer"><a title="{1}" onclick="changeCab({2})" href="javascript:;"><nobr>{0}</nobr></a></li>' , localizer . healerCab , 'Комната Знахаря позволит рассчитать порядок и стоимость перекидки статов в комнате Знахаря для перехода от одного комплекта к другому.' , "'healer'" ) ;
2022-12-19 22:22:19 +02:00
}
if ( dressOptions . showBuilder )
{
2023-01-10 18:29:32 +02:00
html += format ( '<li id="tabx_builder"><a title="{1}" onclick="changeCab({2})" href="javascript:;"><nobr>{0}</nobr></a></li>' , localizer . designerCab , 'Конструктор позволит Вам создать уникальные предметы и их модификации.' , "'builder'" ) ;
2022-12-19 22:22:19 +02:00
}
2023-01-10 18:29:32 +02:00
html += format ( '<li id="tabx_battles"><a title="{1}" onclick="changeCab({2})" href="javascript:;"><nobr>{0}</nobr></a></li>' , localizer . battlesCab , 'Позволяет провести тестовые поединки.' , "'battles'" ) ;
2022-12-19 22:22:19 +02:00
return html ;
}
function getCabsHtml ( )
{
var html = '' ;
for ( var staten in dressStates )
{
var state = dressStates [ staten ] ;
if ( state . rendered )
{
continue ;
}
if ( staten in droppedDressStates )
{
delete droppedDressStates [ staten ] ;
state . rendered = true ;
hardUpdateDressState ( state ) ;
continue ;
}
html += format ( '<div id="cab_{0}" style="display: none">{1}</div>' , state . id , getDresserInnerHtml ( state ) ) ;
state . rendered = true ;
}
return html ;
}
function updateTabs ( tabActive )
{
document . getElementById ( 'nav' ) . innerHTML = getTabsHtml ( tabActive ) ;
}
function updateCabs ( )
{
var cabs = document . getElementById ( 'dressCabs' ) ;
var appendum = getCabsHtml ( ) ;
if ( cabs . insertAdjacentHTML )
{
cabs . insertAdjacentHTML ( 'beforeEnd' , appendum ) ;
}
else
{
cabs . innerHTML = cabs . innerHTML + appendum ;
}
}
function showScriptStatus ( msg )
{
informAboutProgress ( msg ) ;
}
function showDressHint ( )
{
var i = Math . floor ( Math . random ( ) * dressHints . length ) ;
informAboutProgress ( '<font color="red">' + localizer . tip + ':</font> ' + dressHints [ i ] ) ;
}
function getSerializedDresser ( )
{
var dresser = [ ] ;
for ( staten in dressStates )
{
var state = dressStates [ staten ] ;
var serState = getSerializableState ( state ) ;
dresser . push ( serState ) ;
}
dressExData . fakeDefs = { } ;
for ( var i in dressExData . fakes )
{
var fid = dressExData . fakes [ i ] ;
var fake = getFake ( fid ) ;
dressExData . fakeDefs [ getJSName ( fid ) ] = fake ;
}
dresser . push ( dressExData ) ;
return serializeArray ( dresser ) ;
}
function applyDeserializedDresser ( serDresser )
{
if ( serDresser == '' )
{
return ;
}
var dresser = deserializeArray ( serDresser ) ;
for ( var i = 0 ; i < dresser . length ; i ++ )
{
var serState = dresser [ i ] ;
if ( 'exdata' in serState )
{
if ( serState . exdata != 4 )
{
continue ;
}
dressExData = serState ;
// do something
for ( var i in dressExData . fakes )
{
var fid = dressExData . fakes [ i ] ;
var fake = dressExData . fakeDefs [ getJSName ( fid ) ] ;
if ( fake != null )
{
createFake ( fid , fake ) ;
}
else
{
delete dressExData . fakes [ i ] ;
}
}
break ;
}
}
for ( var i = 0 ; i < dresser . length ; i ++ )
{
var serState = dresser [ i ] ;
if ( ! ( 'exdata' in serState ) )
{
applyDeserializedState ( null , serState ) ;
}
}
}
function loadFav ( )
{
if ( isOfflineMode ( ) )
{
return ;
}
var favstore = document . getElementById ( favStoreId ) ;
favstore . value = favstore . getAttribute ( "sPersistAttr" ) || '' ;
applyDeserializedDresser ( favstore . value ) ;
}
function saveFav ( )
{
if ( isOfflineMode ( ) )
{
return ;
}
var favstore = document . getElementById ( favStoreId ) ;
favstore . value = getSerializedDresser ( ) ;
favstore . setAttribute ( "sPersistAttr" , favstore . value ) ;
}
function loadHistory ( )
{
if ( dressOptions . embeddedMode && window . external && window . external . storage )
{
applyDeserializedDresser ( window . external . storage . getPersistentVariable ( historyStoreId ) ) ;
return ;
}
if ( isOfflineMode ( ) )
{
return ;
}
if ( is . ie )
{
var historystore = document . getElementById ( historyStoreId ) ;
historystore . load ( historyStoreId ) ;
historystore . value = historystore . getAttribute ( "sPersistAttr" ) || '' ;
applyDeserializedDresser ( historystore . value ) ;
}
else if ( is . ff2 ) //typeof (globalStorage) != 'undefined')
{
var storage = globalStorage [ window . location . hostname ] ;
var dcdresser = storage . getItem ( 'dcdresser' ) ;
if ( dcdresser && 'historyStoreId' in dcdresser )
{
applyDeserializedDresser ( storage . dcdresser [ historyStoreId ] ) ;
}
}
}
function saveHistory ( )
{
if ( dressOptions . embeddedMode && window . external && window . external . storage )
{
window . external . storage . setPersistentVariable ( historyStoreId , getSerializedDresser ( ) ) ;
return ;
}
if ( isOfflineMode ( ) )
{
return ;
}
if ( is . ie )
{
var historystore = document . getElementById ( historyStoreId ) ;
historystore . value = getSerializedDresser ( ) ;
historystore . setAttribute ( "sPersistAttr" , historystore . value ) ;
historystore . save ( historyStoreId ) ;
}
else if ( is . ff2 ) //typeof (globalStorage) != 'undefined')
{
var storage = globalStorage [ window . location . hostname ] ;
var dcdresser = { } ;
if ( storage . getItem ( 'dcdresser' ) )
{
dcdresser = storage . getItem ( 'dcdresser' ) ;
}
dcdresser [ historyStoreId ] = getSerializedDresser ( ) ;
storage . setItem ( 'dcdresser' , dcdresser ) ;
}
}
window . onunload = saveHistory ;
function isOfflineMode ( )
{
return ( location . protocol != 'http:' ) ;
}
function isEmbeddedMode ( )
{
return ( dressOptions . embeddedMode ) ;
}
function prepareEmbeddedMode ( )
{
baseImgPath = window . external . getCombatsClientEnv ( 'BaseImgPath' ) ;
itemImgPath = window . external . getCombatsClientEnv ( 'ItemImgPath' ) ;
hereItemImgPath = window . external . getCombatsClientEnv ( 'HereItemImgPath' ) ;
charImgPath = window . external . getCombatsClientEnv ( 'CharImgPath' ) ;
clanImgPath = window . external . getCombatsClientEnv ( 'ClanImgPath' ) ;
zodiacImgPath = window . external . getCombatsClientEnv ( 'ZodiacImgPath' ) ;
brandImgPath = window . external . getCombatsClientEnv ( 'BrandImgPath' ) ;
brand2ImgPath = window . external . getCombatsClientEnv ( 'Brand2ImgPath' ) ;
hpMeterGreenImg = window . external . getCombatsClientEnv ( 'HpMeterGreenImg' ) ;
manaMeterImg = window . external . getCombatsClientEnv ( 'ManaMeterImg' ) ;
infospaceImgPath = 'images/infospace/' ;
dressImgPath = 'images/dress/' ;
blankImgPath = 'images/blank.gif' ;
zodiacImgPath = 'images/dress/z/' ;
saveSetOnServerUrl = absoluteDressRoomUrl + '?action=save&saveset=1&offline=1&texttosave={0}' ;
getCharacterInfoUrlFormat = 'http://www.darkclan.ru/cgi/get_ci.pl?nick={0}' ;
}
function prepareOfflineMode ( )
{
if ( ! isOfflineMode ( ) )
{
return ;
}
if ( isEmbeddedMode ( ) )
{
prepareEmbeddedMode ( ) ;
}
else
{
baseImgPath = '' ;
itemImgPath = '' ;
hereItemImgPath = '' ;
charImgPath = 'http://img.combats.com/i/chars/' ;
clanImgPath = '' ;
zodiacImgPath = '' ;
brandImgPath = 'brand/' ;
brand2ImgPath = 'misc/' ;
trickImgPath = '' ;
trickResourceImgPath = '' ;
hpMeterGreenImg = 'bk_life_green.gif' ;
manaMeterImg = 'bk_life_beg_33.gif' ;
infospaceImgPath = 'images/infospace/' ;
dressImgPath = 'dress/' ;
blankImgPath = 'blank.gif' ;
zodiacImgPath = 'dress/z/' ;
saveSetOnServerUrl = absoluteDressRoomUrl + '?action=save&saveset=1&offline=1&texttosave={0}' ;
getCharacterInfoUrlFormat = 'http://www.darkclan.ru/cgi/get_ci.pl?nick={0}' ;
}
}
function GetOfflineCookie ( dressOptionsCookieName )
{
if ( dressOptions . embeddedMode && window . external && window . external . storage )
{
return window . external . storage . getPersistentVariable ( dressOptionsCookieName ) ;
}
if ( isOfflineMode ( ) )
{
return null ;
}
var offlineCookie = document . getElementById ( offlineCookieId ) ;
offlineCookie . load ( offlineCookieId ) ;
return offlineCookie . getAttribute ( dressOptionsCookieName ) || null ;
}
function SetOfflineCookie ( dressOptionsCookieName , v , exp )
{
if ( dressOptions . embeddedMode && window . external && window . external . storage )
{
window . external . storage . setPersistentVariable ( dressOptionsCookieName , v ) ;
}
if ( isOfflineMode ( ) )
{
return ;
}
var offlineCookie = document . getElementById ( offlineCookieId ) ;
offlineCookie . setAttribute ( dressOptionsCookieName , v ) ;
offlineCookie . save ( offlineCookieId ) ;
}
function isCompatibleBrowser ( )
{
if ( ! is . ie )
{
var ffstr = 'Firefox/' ;
if ( navigator . userAgent . indexOf ( ffstr ) >= 0 )
{
return ( parseFloat ( navigator . userAgent . substr ( navigator . userAgent . indexOf ( ffstr ) + ffstr . length ) ) >= 1.5 ) ;
}
if ( is . opera )
{
return true ;
}
return false ;
}
var msiestr = 'MSIE ' ;
return ( parseFloat ( is . version . substr ( is . version . indexOf ( msiestr ) + msiestr . length ) ) >= 5.5 ) ;
}
function cloneRings ( )
{
for ( var i = 7 ; i <= 8 ; i ++ )
{
var r = {
caption : categories . rings . caption ,
slot : ( 'w' + i ) ,
items : categories . rings . items ,
basecat : categories . rings
} ;
categories [ 'rings' + i ] = r ;
}
}
function cloneFlowers ( )
{
var r = {
caption : categories . flowers . caption ,
slot : 'w10' ,
items : categories . flowers . items ,
basecat : categories . flowers
} ;
categories [ 'flowersw10' ] = r ;
}
function cloneFirs ( )
{
var r = {
caption : categories . firs . caption ,
slot : 'w10' ,
items : categories . firs . items ,
basecat : categories . firs
} ;
categories [ 'firsw10' ] = r ;
}
function getSetVariants ( set )
{
if ( ! ( 'variants' in set ) )
{
var slotItems = [ ] ;
for ( var i = 0 ; i < slots . length ; i ++ )
{
var slot = slots [ i ] ;
slotItems [ slot . index ] = getSetItemsForSlot ( set , slot ) ;
}
set . variants = slotItems ;
}
return set . variants ;
}
2023-01-10 18:29:32 +02:00
function cloneScrolls ( ) //свитки в слоты
2022-12-19 22:22:19 +02:00
{
for ( var i = 101 ; i <= 109 ; i ++ )
{
var cscrolls = {
caption : categories . combatscrolls . caption ,
slot : ( 'w' + i ) ,
items : categories . combatscrolls . items ,
basecat : categories . combatscrolls
} ;
categories [ 'combatscrolls' + i ] = cscrolls ;
var ascrolls = {
caption : categories . auxiliaryscrolls . caption ,
slot : ( 'w' + i ) ,
items : categories . auxiliaryscrolls . items ,
basecat : categories . auxiliaryscrolls
} ;
categories [ 'auxiliaryscrolls' + i ] = ascrolls ;
var sscrolls = {
caption : categories . summonscrolls . caption ,
slot : ( 'w' + i ) ,
items : categories . summonscrolls . items ,
basecat : categories . summonscrolls
} ;
categories [ 'summonscrolls' + i ] = sscrolls ;
var tscrolls = {
caption : categories . tacticalscrolls . caption ,
slot : ( 'w' + i ) ,
items : categories . tacticalscrolls . items ,
basecat : categories . tacticalscrolls
} ;
categories [ 'tacticalscrolls' + i ] = tscrolls ;
2023-01-10 18:29:32 +02:00
// var escrolls = { //зачарование
2022-12-19 22:22:19 +02:00
// caption: categories.enchantscrolls.caption,
// slot: ('w' + i),
// items: categories.enchantscrolls.items,
// basecat: categories.enchantscrolls
// };
// categories['enchantscrolls' + i] = escrolls;
}
}
function cloneCItems ( )
{
for ( var i = 15 ; i <= 15 ; i ++ )
{
var citems = {
caption : categories . carmanitems . caption ,
slot : ( 'w' + i ) ,
items : categories . carmanitems . items ,
basecat : categories . carmanitems
} ;
categories [ 'carmanitems' + i ] = citems ;
}
}
function initializeDresserAfterItemsLoaded ( )
{
for ( var catn in categories )
{
var cat = categories [ catn ] ;
if ( cat . slot == 'w3' )
{
cat . statBonuses = { strength : 100 } ;
}
}
2023-01-10 18:29:32 +02:00
// зависимость урона от типа пушки?
2022-12-19 22:22:19 +02:00
categories . legendaryweapon . canBeSharpen = true ;
categories . knives . canBeSharpen = true ;
categories . knives . skillname = 'knifeskill' ;
categories . knives . statBonuses = { strength : 60 , dexterity : 40 } ;
categories . axes . canBeSharpen = true ;
categories . axes . skillname = 'axeskill' ;
categories . axes . statBonuses = { strength : 70 , dexterity : 20 } ;
categories . clubs . canBeSharpen = true ;
categories . clubs . skillname = 'clubskill' ;
categories . clubs . statBonuses = { strength : 100 } ;
categories . swords . canBeSharpen = true ;
categories . swords . skillname = 'swordskill' ;
categories . swords . statBonuses = { strength : 60 , intuition : 40 } ;
categories . staffs . skillname = 'staffskill' ;
categories . staffs . statBonuses = { intellect : 33 } ;
categories . staffs . canBeSharpen = true ;
2023-01-10 18:29:32 +02:00
dressStrengthenings . neutralPower = { id : 'neutralPower' , caption : 'Сила Нейтрала' ,
2022-12-19 22:22:19 +02:00
required : { noWeapon : 1 , neutralAlign : 1 } ,
modify : { mindamage : 0 , maxdamage : 1 }
} ;
cloneFlowers ( ) ;
cloneFirs ( ) ;
cloneRings ( ) ;
cloneScrolls ( ) ;
cloneCItems ( ) ;
createVirtualSets ( ) ;
//buildSetVariants();
var hi = new Array ( 'cat' , 'bottle' , 'hands' , 'nude' , 'armored' ) ;
for ( var i = 0 ; i < hi . length ; i ++ )
{
dc _preimg ( dressImgPath + hi [ i ] + '_press.gif' ) ;
}
document . getElementById ( 'dressCabs' ) . innerHTML = '' ;
//dressItems.spell_godprotect10.buylink = knownECRPowerUps.spell_godprotect10.buylink;
knownAdds . food _l41 = dressItems . food _l41 ;
knownAdds . food _l61 = dressItems . food _l61 ;
knownAdds . food _l71 = dressItems . food _l71 ;
knownAdds . food _l8 = dressItems . food _l8 ;
knownAdds . food _8m1 = dressItems . food _8m1 ;
knownAdds . food _8m2 = dressItems . food _8m2 ;
knownAdds . food _l5 _eng = dressItems . food _l5 _eng ;
knownAdds . pot _base _0 _8m1 = dressItems . pot _base _0 _8m1 ;
knownAdds . food _l10 _e = dressItems . food _l10 _e ;
knownAdds . food _l11 _e = dressItems . food _l11 _e ;
knownAdds . pot _base _0 _2007 _1 = dressItems . pot _base _0 _2007 _1 ;
knownAdds . pot _base _0 _2007 _6 = dressItems . pot _base _0 _2007 _6 ;
knownAdds . pot _base _0 _2007 _4 = dressItems . pot _base _0 _2007 _4 ;
knownAdds . pot _base _0 _2007 _2 = dressItems . pot _base _0 _2007 _2 ;
knownAdds . pot _base _0 _2007 _3 = dressItems . pot _base _0 _2007 _3 ;
knownAdds . pot _base _0 _2007 _8 = dressItems . pot _base _0 _2007 _8 ;
knownAdds . pot _base _0 _2007 _7 = dressItems . pot _base _0 _2007 _7 ;
knownAdds . pot _base _0 _2007 _5 = dressItems . pot _base _0 _2007 _5 ;
knownAdds . pot _base _0 _8m3 = dressItems . pot _base _0 _8m3 ;
dresInitialized = true ;
}
function getTricksOfCategory ( catno )
{
var tc = trickCategories [ catno ] ;
if ( ! ( 'trickCache' in tc ) )
{
var r = [ ] ;
var cid = tc . id ;
for ( var trickn in tricks )
{
var trick = tricks [ trickn ] ;
if ( trick . school != cid ) continue ;
r . push ( trick ) ;
}
tc . trickCache = r ;
}
return tc . trickCache ;
}
function getFilteredTricks ( state , catno )
{
var r = [ ] ;
var ct = getTricksOfCategory ( catno ) ;
for ( var ti = 0 ; ti < ct . length ; ti ++ )
{
var trick = ct [ ti ] ;
if ( 'required' in trick )
{
if ( 'level' in trick . required )
{
if ( trick . required . level > state . natural . level )
{
continue ;
}
}
}
var alreadyWeared = false ;
for ( var i = 0 ; i < state . trickSlots . length ; i ++ )
{
if ( state . trickSlots [ i ] == trick . name )
{
alreadyWeared = true ;
break ;
}
}
if ( alreadyWeared )
{
continue ;
}
r . push ( trick ) ;
}
return r ;
}
function showTrickProps ( trickName )
{
if ( trickName == 'clear' )
{
showPopup ( localizer . noTrickHint ) ;
return ;
}
var trick = tricks [ trickName ] ;
showPopup ( getObjectDescHtml ( activeState , trick ) ) ;
}
function getFullTrickId ( state , id )
{
return 'trickslot_' + state . id + '_' + id ;
}
function getTrickImageHtml _Core ( name , onclick , width , i )
{
var caption = localizer . noTrick ;
var iname ;
var path = trickImgPath ;
if ( name == null )
{
if ( i >= 10 )
{
name = 'clear' ;
iname = 'booklearn_slot7' ;
// iname = 'booklearn_slot' + (i - 3);
path = itemImgPath ;
}
else
{
name = iname = 'clear' ;
}
}
else
{
caption = tricks [ name ] . caption ;
if ( 'iname' in tricks [ name ] )
{
iname = tricks [ name ] . iname ;
}
else
{
iname = name ;
}
}
if ( width == null )
{
width = 40 ;
}
var html = format ( '<img src="{0}{2}.gif" width="40" height="25" border="0" onmouseover="showTrickProps(' + "'{1}'" + ')" onmouseout="hidePopup()" />' , path , name , iname ) ;
if ( onclick != '' )
{
html = '<a href="#" onclick="' + onclick + '">' + html + '</a>' ;
}
return html ;
}
function getTrickImageHtml ( state , name , onclick , width , id )
{
var rhtml = '<td' ;
if ( id != null )
{
rhtml += ' id="' + getFullTrickId ( state , id ) + '"' ;
}
rhtml += ' width="' + width + '">' + getTrickImageHtml _Core ( name , onclick , width , id ) + '</td>' ;
return rhtml ;
}
function getSingleTrickSlotHtml ( state , trickNumber , trickSlotData )
{
var onclick = 'hideMenu(); onChooseTrick(' + trickNumber + '); return false' ;
return getTrickImageHtml ( state , trickSlotData , onclick , 40 , trickNumber ) ;
}
function updateSingleTrickSlotHtml ( trickNumber )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var onclick = 'hideMenu(); onChooseTrick(' + trickNumber + '); return false' ;
var html = getTrickImageHtml _Core ( state . trickSlots [ trickNumber ] , onclick , 40 , trickNumber ) ;
document . getElementById ( getFullTrickId ( state , trickNumber ) ) . innerHTML = html ;
fastUpdateDresserState ( activeState ) ;
}
function onChooseTrick _InCat ( trickNumber , catno )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var tableWidth = ( 8 * 60 ) ;
var perRow = ( tableWidth / 40 ) ;
var ftricks = getFilteredTricks ( state , catno ) ;
var menuHtml = format ( '<b>{0}</b>' , trickCategories [ catno ] . caption ) ;
menuHtml += '<table cellspacing="0" width="' + tableWidth + '" cellpadding="0" border="0"><tr><td>' ;
menuHtml += '<table style="table-layout:fixed;" cellspacing="0" width="' + tableWidth + '" cellpadding="0" border="0"><tr>' ;
for ( var i = 0 ; i < ftricks . length ; i ++ )
{
var onclick = format ( "hideMenu(); onWearTrick({1}, '{0}'); return false" , ftricks [ i ] . name , trickNumber ) ;
menuHtml += getTrickImageHtml ( state , ftricks [ i ] . name , onclick , 40 ) ;
if ( ( i % perRow ) == ( perRow - 1 ) )
{
menuHtml += '</tr><tr>' ;
}
}
menuHtml += '</tr></table>' ;
menuHtml += '</td></tr><tr><td>' ;
menuHtml += '<hr class="dashed" />' ;
menuHtml += '</td></tr>' ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table>' ;
showMenu ( menuHtml ) ;
}
function onChooseTrick ( trickNumber )
{
var state = activeState ;
if ( state == null )
{
return ;
}
var menuHtml = format ( '<b>{0}</b>' , localizer . tricks ) ;
menuHtml += '<table cellspacing="0" cellpadding="0" border="0">' ;
for ( var i = 0 ; i < trickCategories . length ; i ++ )
{
var ftricks = getFilteredTricks ( state , i ) ;
if ( ftricks . length == 0 ) continue ;
var onclick = format ( "hideMenu(); onChooseTrick_InCat({0}, {1}); return false" , trickNumber , i ) ;
menuHtml += getRowMenuItemHtml (
trickCategories [ i ] . caption ,
onclick
) ;
}
if ( state . trickSlots [ trickNumber ] != null )
{
menuHtml += getRowMenuSeparatorHtml ( ) ;
var onclick = format ( "hideMenu(); onWearTrick({0})" , trickNumber ) ;
menuHtml += getRowMenuItemHtml ( localizer . dropTrick , onclick ) ;
}
var AnyTricksOn = 0 ;
for ( var i = 0 ; i < state . trickSlots . length ; i ++ )
{ if ( state . trickSlots [ i ] != null ) { AnyTricksOn = 1 ; } }
if ( AnyTricksOn == 1 )
{
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . HideAllTricks , 'onWearTrickAll()' ) ;
}
menuHtml += getRowMenuSeparatorHtml ( ) ;
menuHtml += getRowMenuItemHtml ( localizer . closeMenu , 'hideMenu()' ) ;
menuHtml += '</table>' ;
cursorY -= 60 ;
showMenu ( menuHtml ) ;
}
function onWearTrick ( trickNumber , name )
{
var state = activeState ;
if ( state == null )
{
return ;
}
state . trickSlots [ trickNumber ] = name ;
updateSingleTrickSlotHtml ( trickNumber ) ;
}
function onWearTrickAll ( )
{
var state = activeState ;
if ( state == null )
{
return ;
}
for ( var i = 0 ; i < state . trickSlots . length ; i ++ )
{
if ( state . trickSlots [ i ] != null )
{
state . trickSlots [ i ] = null ;
updateSingleTrickSlotHtml ( i ) ;
}
}
}
function getSimplePersObjectImageHtml ( state , slot )
{
var r ;
var style = 'filter:' ;
var objid = state . objects [ slot . index ] ;
var oimg = ( objid == null ) ? slot . id : objid ;
var o = getObjectByStateSlot ( state , slot ) ;
var filter = getObjectFilter ( state , slot , o ) ;
style += getRealFilter ( filter ) ;
r = '<td valign="top">' ;
var realItemImgPath = getRealImagePath ( objid , slot ) ;
r += format (
'<img name="x{1}" src="{0}{1}.gif" width="{2}" height="{3}" style="{4}" border="0" />' ,
realItemImgPath ,
oimg ,
slot . width ,
slot . height ,
style
) ;
r += '</td>' ;
return r ;
}
function onUseTrick ( trickNumber )
{
// does nothing yet.
}
function getSimplePersImageHtml ( state , showTricks )
{
var oimg ;
var i ;
var hp = ( 'hitpoints' in state . inbattle ) ? state . inbattle . hitpoints : 0 ;
var mhp = ( 'hitpoints' in state . results ) ? state . results . hitpoints : 0 ;
hp = hp . toString ( ) ;
hp = hp + '/' + mhp ;
var r = '' ;
r += '<table border="0" cellspacing="0" cellpadding="0"' ;
if ( state . sign != '' )
{
r += ' style="background-image: url(' ;
r += zodiacImgPath + state . sign ;
r += '.gif); background-repeat: no-repeat; background-position: top right;"' ;
}
r += '>' ;
r += format ( '<tr><td id="{1}{0}" align="center" >{2}</td></tr>' , state . id , 'nick' , getPersNickString ( state ) ) ;
r += format ( '<tr><td id="{1}{0}" width="240" align="right" nowrap="yes" style="font-size: 10px;">' , state . id , hpMeterSuffix ) ;
r += format ( '<span id="{1}{0}v">{2}</span> ' , state . id , hpMeterSuffix , hp ) ;
var w = 240 - ( ( hp . length + 2 ) * 7 ) ;
r += format ( '<img id="{4}{3}i" src="{0}" width="{2}" height="8" alt="{1} (100%)" border="0" />' , hpMeterGreenImg , getItemPropLabel ( 'hitpoints' ) , w , state . id , hpMeterSuffix ) ;
r += format ( '<img src="{0}herz.gif" width="10" height="9" alt="{1}"/>' , baseImgPath , getItemPropLabel ( 'hitpoints' ) ) ;
var mana = ( 'mana' in state . inbattle ) ? state . inbattle . mana : 0 ;
var mmana = ( 'mana' in state . results ) ? state . results . mana : 0 ;
mana = mana . toString ( ) ;
mana = mana + '/' + mmana ;
var manaDisplayMode = ( mmana > 0 ) ? '' : 'none' ;
r += format ( '</td></tr><tr><td id="{1}{0}" width="240" align="right" nowrap="yes" style="font-size: 10px; display: {2}">' , state . id , manaMeterSuffix , manaDisplayMode ) ;
r += format ( '<span id="{1}{0}v">{2}</span> ' , state . id , manaMeterSuffix , mana ) ;
w = 240 - ( ( mana . length + 2 ) * 7 ) ;
r += format ( '<img id="{4}{3}i" src="{0}" width="{2}" height="8" alt="{1} (100%)" border="0" />' , manaMeterImg , getItemPropLabel ( 'mana' ) , w , state . id , manaMeterSuffix ) ;
r += format ( '<img src="{0}Mherz.gif" width="10" height="9" alt="{1}"/>' , baseImgPath , getItemPropLabel ( 'mana' ) ) ;
r += '</td></tr><tr height="4"><td height="4"></td></tr>' ;
if ( showTricks )
{
r += '<tr><td><table border="0" cellspacing="0" cellpadding="0"><tr>' ;
// w100 - w109
for ( i = 100 ; i < 105 ; i ++ )
{
r += getSimplePersObjectImageHtml ( state , getSlotById ( 'w' + i ) ) ;
}
// this slot is handled as book slot.
r += getSimplePersObjectImageHtml ( state , slot _wbook ) ;
// r += format('<td><img style="filter:alpha(opacity = 40, style = 3)" src="{0}w{1}.gif" width="40" height="25" border="0" /></td>', itemImgPath, 109);
r += '</tr><tr>' ;
for ( i = 105 ; i < 110 ; i ++ )
{
r += getSimplePersObjectImageHtml ( state , getSlotById ( 'w' + i ) ) ;
}
// this slot is handled separately like as BK.
r += format ( '<td><img style="opacity: 0.4; MozOpacity: 0.4; KhtmlOpacity: 0.4; filter:alpha(opacity = 40, style = 3)" src="{0}w{1}.gif" width="40" height="25" border="0" /></td>' , itemImgPath , 109 ) ;
r += '</tr></table></td></tr>' ;
}
r += '<tr><td><table border="0" cellspacing="0" cellpadding="0"><tr><td width="60"><table width="60" border="0" cellpadding="0" cellspacing="0"><tr>' ;
// w9
r += getSimplePersObjectImageHtml ( state , slot _w9 ) ;
r += '</tr><tr>' ;
// w13
r += getSimplePersObjectImageHtml ( state , slot _w13 ) ;
r += '</tr><tr>' ;
// w3
r += getSimplePersObjectImageHtml ( state , slot _w3 ) ;
r += '</tr><tr>' ;
// w4
r += getSimplePersObjectImageHtml ( state , slot _w4 ) ;
r += '</tr><tr>' ;
// w5
r += getSimplePersObjectImageHtml ( state , slot _w5 ) ;
r += '</tr></table></td>' ;
r += '<td width="120"><table width="120" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="3" height="220" align="right" valign="bottom" style="background-image:url(' ;
r += charImgPath + state . sex + '/' + state . image ;
r += '.gif); background-repeat: no-repeat; background-position: center center;">' ;
if ( state . pet != null )
{
var pet = pets [ state . pet . n ] ;
r += format ( '<img src="{0}{2}/{1}.gif" alt="" title="" onmouseover="showPetProps()" onmouseout="hidePopup()" width="40" height="73" border="0" />' , charImgPath , pet . image . def , pet . image . sex ) ;
}
r += '</td></tr><tr>' ;
r += getSimplePersObjectImageHtml ( state , slot _w14 ) ;
// w16 is skipped
r += format ( '<td height="20"><img style="opacity: 0.4; MozOpacity: 0.4;KhtmlOpacity: 0.4; filter:alpha(opacity = 40, style = 3)" src="{0}w14.gif" width="40" height="20" border="0" /></td>' , itemImgPath ) ;
r += getSimplePersObjectImageHtml ( state , slot _w15 ) ;
r += '</tr><tr>' ;
r += format ( '<td height="20"><img style="opacity: 0.4; MozOpacity: 0.4;KhtmlOpacity: 0.4; filter:alpha(opacity = 40, style = 3)" src="{0}w20_1.gif" width="40" height="20" border="0" /></td>' , itemImgPath ) ;
r += format ( '<td height="20"><img style="opacity: 0.4; MozOpacity: 0.4;KhtmlOpacity: 0.4; filter:alpha(opacity = 40, style = 3)" src="{0}w20_1.gif" width="40" height="20" border="0" /></td>' , itemImgPath ) ;
r += format ( '<td height="20"><img style="opacity: 0.4; MozOpacity: 0.4;KhtmlOpacity: 0.4; filter:alpha(opacity = 40, style = 3)" src="{0}w20_1.gif" width="40" height="20" border="0" /></td>' , itemImgPath ) ;
r += '</tr></table></td><td width="60"><table width="60" border="0" cellpadding="0" cellspacing="0"><tr>' ;
// w1
r += getSimplePersObjectImageHtml ( state , slot _w1 ) ;
r += '</tr><tr>' ;
// w2
r += getSimplePersObjectImageHtml ( state , slot _w2 ) ;
r += '</tr><tr><td><table border="0" cellspacing="0" cellpadding="0"><tr>' ;
// w6
r += getSimplePersObjectImageHtml ( state , slot _w6 ) ;
// w7
r += getSimplePersObjectImageHtml ( state , slot _w7 ) ;
// w8
r += getSimplePersObjectImageHtml ( state , slot _w8 ) ;
r += '</tr></table></td></tr><tr>' ;
// w11
r += getSimplePersObjectImageHtml ( state , slot _w11 ) ;
r += '</tr><tr>' ;
// w10
r += getSimplePersObjectImageHtml ( state , slot _w10 ) ;
r += '</tr><tr>' ;
// w19
r += getSimplePersObjectImageHtml ( state , slot _w19 ) ;
r += '</tr><tr>' ;
// w12
r += getSimplePersObjectImageHtml ( state , slot _w12 ) ;
r += '</tr></table></td>' ;
r += '<td width="60" valign="bottom"><table width="60" border="0" cellpadding="0" cellspacing="0"><tr>' ;
// w18
r += getSimplePersObjectImageHtml ( state , slot _w18 ) ;
r += '</tr><tr>' ;
// wshirt (w0)
r += getSimplePersObjectImageHtml ( state , slot _w0 ) ;
r += '</tr><tr>' ;
// w17
r += getSimplePersObjectImageHtml ( state , slot _w17 ) ;
r += '</tr></tr></table></td></tr></table></td></tr>' ;
if ( showTricks )
{
r += '<tr><td><table border="0" cellspacing="0" cellpadding="0">' ;
for ( var ci = 0 ; ci < 2 ; ci ++ )
{
r += '<tr>' ;
for ( var i = 0 ; i < 7 ; i ++ )
{
//if (ci==2 && i==6) {continue;}
var trickNumber = ( ci * 7 ) + i ;
var onclick = 'hideMenu(); onUseTrick(' + trickNumber + '); return false' ;
r += getTrickImageHtml ( state , state . trickSlots [ trickNumber ] , onclick , 50 ) ;
}
r += '</tr>' ;
}
r += '</table></td></tr>' ;
}
r += '</table>' ;
return r ;
}
function getEmbeddedDresserFrameHtml ( )
{
return '<IFRAME SRC="http://www.darkclan.ru/dressroom/counter.php?type=embedded" SCROLLING="no" WIDTH="100%" HEIGHT="100" BORDER="0" />' ;
}
function getAutoCombatsDresserFrameHtml ( )
{
return '<IFRAME SRC="http://www.darkclan.ru/dressroom/counter.php?type=autocombats" SCROLLING="no" WIDTH="100%" HEIGHT="100" BORDER="0" />' ;
}
function getOfflineDresserFrameHtml ( )
{
return '<IFRAME SRC="http://www.darkclan.ru/dressroom/counter.php?type=offline" SCROLLING="no" WIDTH="100%" HEIGHT="100" BORDER="0" />' ;
}
function initializeDresserForBenderOmsk ( )
{
dressOptions . benderOmskMode = true ;
hereItemImgPath = '' ;
charImgPath = 'http://img.combats.com/i/chars/' ;
brandImgPath = 'brand/' ;
brand2ImgPath = 'misc/' ;
infospaceImgPath = 'images/infospace/' ;
dressImgPath = 'dress/' ;
blankImgPath = 'blank.gif' ;
zodiacImgPath = 'dress/z/' ;
saveSetOnServerUrl = absoluteDressRoomUrl + '?action=save&saveset=1&offline=1&texttosave={0}' ;
}