JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
Your character type will grant you an extra point in a specific stat every two levels. You start in the city as: <<button "Warrior">><<generateitem $items "weapon" "sword_iron" 1 "common" 1>><<generateitem $items "armor" "shieldR_iron" 1 "common" 1>><<generateitem $items "armor" "helm_iron2" 1 "common" 1>><<generateitem $items "armor" "boots_iron1" 1 "common" 1>><<generateitem $items "armor" "brygantine_leather" 1 "common" 1>><<set $playerStats.class ="warrior">><<set $menu to 1>><<set $bars to 1>><<goto "valenford_town">><</button>> + Strength - weapon damage <<button "Knight">><<generateitem $items "weapon" "sword_iron" 1 "common" 1>><<generateitem $items "armor" "shieldR_iron" 1 "common" 1>><<generateitem $items "armor" "helm_iron2" 1 "common" 1>><<generateitem $items "armor" "boots_iron1" 1 "common" 1>><<generateitem $items "armor" "brygantine_leather" 1 "common" 1>><<set $playerStats.class ="knight">><<set $menu to 1>><<set $bars to 1>><<goto "valenford_town">><</button>> + Constitution - HP amount and damage resistance <<button "Ranger">><<generateitem $items "weapon" "bow" 1 "common" 1>><<generateitem $items "armor" "helm_iron2" 1 "common" 1>><<generateitem $items "armor" "boots_iron1" 1 "common" 1>><<generateitem $items "armor" "brygantine_leather" 1 "common" 1>><<set $playerStats.class ="ranger">><<set $menu to 1>><<set $bars to 1>><<goto "valenford_town">><</button>> + Dexterity - chance to hit and dodge <<button "Sorcerer">><<generateitem $items "weapon" "wand_fire" 1 "common" 1>><<generateitem $items "armor" "shieldR_iron" 1 "common" 1>><<generateitem $items "armor" "robe" 1 "common" 1>><<generateitem $items "armor" "hood_leather" 1 "common" 1>><<generateitem $items "armor" "boots_leather1" 1 "common" 1>><<set $playerStats.class ="sorcerer">><<set $menu to 1>><<set $bars to 1>><<goto "valenford_town">><</button>> + Intelligence - magic weapon damage <<button "Mage">><<generateitem $items "weapon" "staff_ice" 1 "common" 1>><<generateitem $items "armor" "robe" 1 "common" 1>><<generateitem $items "armor" "hood_leather" 1 "common" 1>><<generateitem $items "armor" "boots_leather1" 1 "common" 1>><<set $playerStats.class ="mage">><<set $menu to 1>><<set $bars to 1>><<goto "valenford_town">><</button>> + Wisdom - resistance to magic damage and MP amount <<button "Merchant">><<generateitem $items "weapon" "sword_iron" 1 "common" 1>><<generateitem $items "armor" "shieldR_iron" 1 "common" 1>><<generateitem $items "armor" "helm_iron2" 1 "common" 1>><<generateitem $items "armor" "boots_iron1" 1 "common" 1>><<generateitem $items "armor" "brygantine_leather" 1 "common" 1>><<set $playerStats.class ="merchant">><<set $menu to 1>><<set $bars to 1>><<goto "valenford_town">><</button>> + Charisma - store prices and the amount of money for rewards <<generateitem $items "item" "meat" 1 "common" 25>> <<generateitem $items "item" "vegetables" 1 "common" 25>> <<generateitem $items "item" "travel_supplies" 1 "common" 3>> <<generateitem $items "item" "potion_hp_tiny" 1 "common" 2>> <<generateitem $items "item" "ancient_letter" 1 "rare" 1>>
<<nobr>><<set $gamebg="inventory.jpg">><<set $bgdark=0.75>><<set $inlabyrinth=0>><<if $playerWeight>$playerWeightMax>><div class="rank-promotion"><b>You are overloaded</b>Current weight: <<=$playerWeight.toFixed(1)>> / <<=$playerWeightMax.toFixed(1)>> kg.<br>Drop, use or store items before continuing.<<if $transportId&&$transportAvailable==1>><br><br><<link "Open Transport">><<goto "transport">><</link>><</if>></div><</if>> <div class="ui-row ui-row-between ui-row-center ui-card-nav"> <<link '<img src="resources/img/journal.jpg" class="card-nav-icon"> Journal'>><<goto "journal">><</link>><<if $transportAvailable==1&&$transportId&&$transportCatalog[$transportId]>><<link '<img @src="\'resources/img/characters/\'+$transportCatalog[$transportId].image" class="card-nav-icon"> Caravan storage'>><<goto "transport">><</link>><</if>><<link 'Character <img src="resources/img/character.jpg" class="card-nav-icon">'>><<goto "character">><</link>></div> <div class="inventory"> <h2>Equipped</h2> <<set _equippedSlots=[{key:"helmet",label:"Helmet",item:$helmitems},{key:"armor",label:"Armor",item:$armoritems},{key:"boots",label:"Boots",item:$bootsitems},{key:"shield",label:"Shield",item:$shielditems},{key:"weapon",label:"Weapon",item:$weaponitems}]>> <table class="inventory-table inventory-table-equipped"><thead><tr> <th class="inventory-col-icon"></th> <th>Name</th> <th class="inventory-col-power">⚔️🛡️</th> <th class="inventory-col-weight">⚖️</th> <th class="inventory-col-value">Value</th> <th class="inventory-col-details"></th> <th>Attribute</th> <th class="inventory-col-action"></th> </tr></thead><tbody> <<for _slot range _equippedSlots>><<capture _slot>><tr> <<if _slot.item>> <<set _item=_slot.item>> <td class="inventory-col-icon"><<itemicon _item.image _item.rarity>></td> <td><strong><<=_item.name>></strong></td> <td class="inventory-col-power"><<tooltipbox>><<=_item.power>>----<<if _item.type=="weapon">>Damage type: <strong> <<if _item.damageType=="magic">> <<=String(_item.category||"magic").replace(/_/g," ").replace(/\b\w/g,function(c){return c.toUpperCase();})>> <<else>> Physical <</if>> </strong><<else>>Armor class: <strong><<if _item.category=="armor_heavy">>Heavy<<elseif _item.category=="armor_medium">>Medium<<elseif _item.category=="armor_light">>Light<<else>>-<</if>></strong><</if>><</tooltipbox>></td> <td class="inventory-col-weight"><<=_item.weight>></td> <td class="inventory-col-value"><<if _item.value!=null>><<currencytooltip _item.value true>><<else>>-<</if>></td> <td class="inventory-col-details"><<tooltipbox>><<if _item.type=="weapon">><strong><<if Number(_item.slot)==2||_item.slot=="2h">>2h<<else>>1h<</if>></strong><<else>><strong><<if _item.category=="armor_heavy">>Heavy<<elseif _item.category=="armor_medium">>Medium<<elseif _item.category=="armor_light">>Light<<else>>-<</if>></strong><</if>> - level: <strong><<=_item.level||1>></strong>----Material: <strong><<=String(_item.material||"-").replace(/_/g," ").replace(/\b\w/g,function(c){return c.toUpperCase();})>></strong><br> Rarity: <strong><<=_item.rarityName||"-">></strong><</tooltipbox>></td> <td><<attributetooltip _item>></td> <td class="inventory-col-action"><<link "Unequip">> <<if _slot.key=="helmet">><<iunequip $helmitems>><<elseif _slot.key=="armor">><<iunequip $armoritems>><<elseif _slot.key=="boots">><<iunequip $bootsitems>><<elseif _slot.key=="shield">><<iunequip $shielditems>><<elseif _slot.key=="weapon">><<iunequip $weaponitems>><</if>> <<goto "inventory">><</link>></td> <<else>> <td class="inventory-col-icon"></td> <td class="inventory-col-name inventory-empty-slot"><em><<=_slot.label>></em></td> <td></td><td></td><td></td><td></td><td></td><td class="inventory-col-action"></td> <</if>></tr><</capture>><</for>></tbody></table> <<set $totalDefense=0>><<set $totalAttack=0>> <<for _slot range _equippedSlots>><<if _slot.item>><<if _slot.key=="weapon">><<set $totalAttack+=Number(_slot.item.power||0)>><<else>><<set $totalDefense+=Number(_slot.item.power||0)>><</if>><</if>><</for>> <div class="inventory-summary"><strong>Total Defense:</strong> <<=$totalDefense>> | <strong>Total Attack:</strong> <<=$totalAttack>> | <strong>Money:</strong> <<currencytooltip $playerMoney>></div> <<if $items&&$items.length>0>> <<set _groups={}>> <<for _item range $items>> <<set _type=_item.type=="armour"?"armor":_item.type>> <<if _type=="helmet"||_type=="boots"||_type=="shield">><<set _type="armor">><</if>> <<if !_groups[_type]>><<set _groups[_type]=[]>><</if>> <<run _groups[_type].push(_item)>> <</for>> <<set _armorTypeOrder={helmet:0,armor:1,armour:1,boots:2,shield:3}>> <<set _armorCategoryOrder={armor_light:0,armor_medium:1,armor_heavy:2}>> <<if _groups.armor>> <<run _groups.armor.sort(function(a,b){ var typeA=Object.prototype.hasOwnProperty.call(_armorTypeOrder,a.type)?_armorTypeOrder[a.type]:99; var typeB=Object.prototype.hasOwnProperty.call(_armorTypeOrder,b.type)?_armorTypeOrder[b.type]:99; if(typeA!==typeB){return typeA-typeB;} var categoryA=Object.prototype.hasOwnProperty.call(_armorCategoryOrder,a.category)?_armorCategoryOrder[a.category]:99; var categoryB=Object.prototype.hasOwnProperty.call(_armorCategoryOrder,b.category)?_armorCategoryOrder[b.category]:99; if(categoryA!==categoryB){return categoryA-categoryB;} var levelA=Number(a.level||1),levelB=Number(b.level||1); if(levelA!==levelB){return levelA-levelB;} var rarityA=Number(a.rarity||1),rarityB=Number(b.rarity||1); if(rarityA!==rarityB){return rarityA-rarityB;} return String(a.name||"").localeCompare(String(b.name||"")); })>> <</if>> <<set _weaponCategoryOrder={sword:0,blunt:1,axe:2,bow:3,crossbow:4,fire:5,ice:6,lightning:7}>> <<if _groups.weapon>> <<run _groups.weapon.sort(function(a,b){ var categoryA=Object.prototype.hasOwnProperty.call(_weaponCategoryOrder,a.category)?_weaponCategoryOrder[a.category]:99; var categoryB=Object.prototype.hasOwnProperty.call(_weaponCategoryOrder,b.category)?_weaponCategoryOrder[b.category]:99; if(categoryA!==categoryB){return categoryA-categoryB;} var levelA=Number(a.level||1),levelB=Number(b.level||1); if(levelA!==levelB){return levelA-levelB;} var rarityA=Number(a.rarity||1),rarityB=Number(b.rarity||1); if(rarityA!==rarityB){return rarityA-rarityB;} return String(a.name||"").localeCompare(String(b.name||"")); })>> <</if>> <<set _typeOrder=["armor","weapon","food","parts","ore","quest","transport"]>> <<for _type range _typeOrder>><<if _groups[_type]&&_groups[_type].length>0>> <<if _type=="armor">><h2 class="inventory-section-title">🛡️ Armor</h2> <<elseif _type=="weapon">><h2 class="inventory-section-title">⚔️ Weapons</h2> <<elseif _type=="food">><h2 class="inventory-section-title">🍎 Food</h2> <<elseif _type=="parts">><h2 class="inventory-section-title">🔧 Parts</h2> <<elseif _type=="ore">><h2 class="inventory-section-title">⛏️ Ores and Resources</h2> <<elseif _type=="quest">><h2 class="inventory-section-title">📜 Quest</h2> <<elseif _type=="transport">><h2 class="inventory-section-title">📦 Transport Goods</h2><</if>> <<if _type=="food"||_type=="ore"||_type=="parts"||_type=="quest">> <table class="inventory-table"><thead><tr> <th class="inventory-col-icon"></th> <th>Name</th> <th class="inventory-col-weight">⚖️</th> <th class="inventory-col-value">Value</th> <th class="inventory-col-quantity">Qty</th> <th class="inventory-col-action"></th> </tr></thead><tbody> <<for _item range _groups[_type]>><<capture _item>><tr> <td class="inventory-col-icon"><<itemicon _item.image _item.rarity>></td> <td><strong><<=_item.name>></strong></td> <td class="inventory-col-weight"><<tooltipbox>><<=_item.weight||0>>----Single item: <<=_item.weight||0>><br>Stack: <<=(Number(_item.weight||0)*Number(_item.quantity||1)).toFixed(1)>><</tooltipbox>></td> <td class="inventory-col-value"><<if _item.value!=null>><<currencytooltip _item.value true>><<else>>-<</if>></td> <td class="inventory-col-quantity"><strong><<=Number(_item.quantity||1)>></strong></td> <td class="inventory-col-action"><<itemcontrols _item>></td> </tr><</capture>><</for>></tbody></table> <<else>> <table class="inventory-table inventory-table-compact"><thead><tr> <th class="inventory-col-icon"></th> <th>Name</th> <th class="inventory-col-power"><<if _type=="weapon">>⚔️<<else>>🛡️<</if>></th> <th class="inventory-col-weight">⚖️</th> <th class="inventory-col-value">Value</th> <th class="inventory-col-details"></th> <th>Attribute</th> <th class="inventory-col-quantity">Qty</th> <th class="inventory-col-action"></th> </tr></thead><tbody> <<for _item range _groups[_type]>><<capture _item>><tr> <td class="inventory-col-icon"><<itemicon _item.image _item.rarity>></td> <td><strong><<=_item.name>></strong></td> <td class="inventory-col-power"><<tooltipbox>><<=_item.power>>----<<if _item.type=="weapon">>Damage type: <strong> <<if _item.damageType=="magic">> <<=String(_item.category||"magic").replace(/_/g," ").replace(/\b\w/g,function(c){return c.toUpperCase();})>> <<else>> Physical <</if>> </strong><<else>>Armor class: <strong><<if _item.category=="armor_heavy">>Heavy<<elseif _item.category=="armor_medium">>Medium<<elseif _item.category=="armor_light">>Light<<else>>-<</if>></strong><</if>><</tooltipbox>></td> <td class="inventory-col-weight"><<tooltipbox>><<=_item.weight>>----Single item: <<=_item.weight>><br>Stack: <<=(Number(_item.weight||0)*Number(_item.quantity||1)).toFixed(1)>><</tooltipbox>></td> <td class="inventory-col-value"><<if _item.value!=null>><<currencytooltip _item.value true>><<else>>-<</if>></td> <td class="inventory-col-details"><<tooltipbox>><<if _item.type=="weapon">><strong><<if Number(_item.slot||1)==2||_item.slot=="2h">>2h<<else>>1h<</if>></strong><<else>><strong><<if _item.category=="armor_heavy">>Heavy<<elseif _item.category=="armor_medium">>Medium<<elseif _item.category=="armor_light">>Light<<else>>-<</if>></strong><</if>> - level: <strong><<=_item.level||1>></strong>----Material: <strong><<=String(_item.material||"-").replace(/_/g," ").replace(/\b\w/g,function(c){return c.toUpperCase();})>></strong><br> Rarity: <strong><<=_item.rarityName||"-">></strong><</tooltipbox>></td> <td><<attributetooltip _item>></td> <td class="inventory-col-quantity"><strong><<=Number(_item.quantity||1)>></strong></td> <td class="inventory-col-action"><<itemcontrols _item>></td> </tr><</capture>><</for>></tbody></table> <</if>><</if>><</for>> <p class="inventory-total-weight"><strong>Total Weight:</strong> <<=$playerWeight.toFixed(1)>> / <<=$playerWeightMax.toFixed(1)>> kg</p><<if $transportAvailable==1&&$transportId&&$transportCatalog[$transportId]>><<link "Transport">><<goto "transport">><</link>><</if>> <<else>> <div class="inventory-empty-slot">Your inventory is empty.</div><<if $transportAvailable==1&&$transportId&&$transportCatalog[$transportId]>><<link "Transport">><<goto "transport">><</link>><</if>> <</if>> </div> <</nobr>>
<<widget "icurrency">><<nobr>><<set _data=setup.getCurrencyData(_args[0])>><<set _lineBreak=Boolean(_args[1])>><<set _result="">><<for _i=0;_i<_data.length;_i++>><<set _part=_data[_i]>><<if _part.amount>0>><<set _result+=_part.amount+_part.icon>><<if _lineBreak&&_i==1&&(_data[2].amount>0||_data[3].amount>0)>><<set _result+="<br>">><</if>><</if>><</for>><<if _result=="">><<set _result="0🟠">><</if>><<print _result>><</nobr>><</widget>> -------------------------------------------------- <<widget "currencytooltip">><<nobr>><<set _value=Math.max(0,Math.floor(Number(_args[0]||0)))>><<set _lineBreak=Boolean(_args[1])>><<set _data=setup.getCurrencyData(_value)>><<set _text="">><<for _part range _data>><<if _part.amount>0>><<if _text!="">><<set _text+="<br>">><</if>><<set _text+='<span style="color:'+_part.color+';">'+_part.amount+' '+_part.name+'</span>'>><</if>><</for>><<if _text=="">><<set _text='<span style="color:#D97A2B;">0 Copper</span>'>><</if>><span class="game-tooltip"><<icurrency _value _lineBreak>><span class="game-tooltip-text"><<=_text>></span></span><</nobr>><</widget>> -------------------------------------------------- <<widget "tooltipbox" container>><<nobr>><<set _parts to _contents.split("----")>><<set _style to ($args[0] || "normal")>><span @class="'game-tooltip tooltipbox-' + _style"><<= _parts[0]>><span class="game-tooltip-text"><<if _parts.length > 1>><<= _parts.slice(1).join("----")>><</if>></span></span><</nobr>><</widget>> -------------------------------------------------- <<widget "characterstat" container>><<nobr>><<set _positionClass to $args[0]>><<set _panelId to $args[1]>><div @class="'character-stat ' + _positionClass + ' character-stat-hover'" @data-panel-id="_panelId">_contents</div><</nobr>><</widget>> -------------------------------------------------- <<widget "questLocal" container>><<nobr>><<set _questState=_args[0]>><<set _questTitle=_args[1]>><<if _questState>=1&&_questState<99>><div class="journal-entry journal-local"><div class="ui-row ui-row-between ui-row-center ui-journal-header"><div class="ui-title ui-journal-title"><<print _questTitle>></div><div class="journal-entry-type">Local Quest</div></div><div class="journal-entry-description">_contents</div></div><</if>><</nobr>><</widget>> -------------------------------------------------- <<widget "questMain" container>><<nobr>><<set _questState=_args[0]>><<set _questTitle=_args[1]>><<if _questState>=1&&_questState<99>><div class="journal-entry journal-main"><div class="ui-row ui-row-between ui-row-center ui-journal-header"><div class="ui-title ui-journal-title"><<print _questTitle>></div><div class="journal-entry-type">Main Quest</div></div><div class="journal-entry-description">_contents</div></div><</if>><</nobr>><</widget>> -------------------------------------------------- <<widget "questGuild" container>><<nobr>><<set _questState=_args[0]>><<set _questTitle=_args[1]>><<if _questState>=1&&_questState<99>><div class="journal-entry journal-guild"><div class="ui-row ui-row-between ui-row-center ui-journal-header"><div class="ui-title ui-journal-title"><<print _questTitle>></div><div class="journal-entry-type">Guild Quest</div></div><div class="journal-entry-description">_contents</div></div><</if>><</nobr>><</widget>> -------------------------------------------------- <<widget "questCompleted" container>><<nobr>><<set _questState=_args[0]>><<set _questTitle=_args[1]>><<if _questState==99>><div class="journal-entry journal-completed"><div class="ui-row ui-row-between ui-row-center ui-journal-header"><div class="ui-title ui-journal-title"><<print _questTitle>></div><div class="journal-entry-type">Completed</div></div><div class="journal-entry-description">_contents</div></div><</if>><</nobr>><</widget>> -------------------------------------------------- <<widget "checkpoint">><<nobr>><<set _saveName to String($args[0] || "Checkpoint")>><<set _saveSlot to Number($args[1])>><<if Number.isInteger(_saveSlot) && _saveSlot >= 0>><<run try { if ( Save.browser && Save.browser.slot && typeof Save.browser.slot.save === "function") { /* SugarCube 2.37+ */ Save.browser.slot.save(_saveSlot, _saveName); } else { /* SugarCube 2.36 i starsze */ Save.slots.save(_saveSlot, _saveName);} } catch (error) { console.error("Checkpoint save failed:", error); UI.alert("The game could not be saved."); } >><<else>><<run console.error("Invalid checkpoint slot:", _saveSlot)>><</if>><</nobr>><</widget>> -------------------------------------------------- <<widget "resourcebar">><<nobr>><<set _current=Math.max(0,Number(_args[0]||0))>><<set _maximum=Math.max(1,Number(_args[1]||1))>><<set _type=String(_args[2]||"hp")>><<set _current=Math.min(_current,_maximum)>><<set _percent=Math.max(0,Math.min(100,_current/_maximum*100))>><div @class="'ui-progress ui-progress-'+_type+' ui-resource-bar'"><div class="ui-progress-fill" @style="'width:'+_percent+'%'"></div><div class="ui-progress-text"><<=_current>> / <<=_maximum>></div></div><</nobr>><</widget>> -------------------------------------------------- <<widget "hpbar">><<resourcebar $playerStats.hp $playerStats.hp_max "hp">><</widget>> -------------------------------------------------- <<widget "manabar">><<resourcebar $playerStats.mp $playerStats.mp_max "mana">><</widget>> -------------------------------------------------- <<widget "labyrinthMinimap">><<nobr>><<set _map to setup.labyrinthGetMap()>><<set _position to setup.labyrinthGetPosition()>><div id="labyrinth-minimap" class="labyrinth-minimap"><<for _offsetY=-2; _offsetY<=2; _offsetY++>><<for _offsetX=-2; _offsetX<=2; _offsetX++>><<set _x to _position.x+_offsetX>><<set _y to _position.y+_offsetY>><<if setup.labyrinthHasCell(_map,_x,_y)>><<set _value to Number(_map[_y][_x])>><<if _value>=0>><<set _type to Math.abs(_value)>><div @class="setup.labyrinthTileClass(_type)"><<if _offsetX===0 and _offsetY===0>><img class="labyrinth-player" src="resources/img/bg/dungeon/player.png" alt="Gracz"><</if>></div><<else>><div class="labyrinth-tile labyrinth-tile-hidden"></div><</if>><<else>><div class="labyrinth-tile labyrinth-tile-empty"></div><</if>><</for>><</for>></div><</nobr>><</widget>> -------------------------------------------------- <<widget "labyrinthFullMap">><<nobr>><<set _map to setup.labyrinthGetMap()>><<set _position to setup.labyrinthGetPosition()>><<set _columns to 0>><<for _row range _map>><<if Array.isArray(_row) and _row.length>_columns>><<set _columns to _row.length>><</if>><</for>><div id="labyrinth-full-map" class="labyrinth-full-map" @style="'grid-template-columns:repeat('+_columns+',32px)'"><<for _y=0; _y<_map.length; _y++>><<for _x=0; _x<_columns; _x++>><<if setup.labyrinthHasCell(_map,_x,_y)>><<set _value to Number(_map[_y][_x])>><<if _value>=0>><<set _type to Math.abs(_value)>><div @class="setup.labyrinthTileClass(_type)"><<if _x===_position.x and _y===_position.y>><img class="labyrinth-player" src="resources/img/bg/dungeon/player.png" alt="Gracz"><</if>></div><<else>><div class="labyrinth-tile labyrinth-tile-hidden"></div><</if>><<else>><div class="labyrinth-tile labyrinth-tile-empty"></div><</if>><</for>><</for>></div><</nobr>><</widget>> -------------------------------------------------- <<widget "labyrinthstairs">><<set _direction to _args[0]>><<set _found to false>><<set _foundX to 0>><<set _foundY to 0>><<if _direction is "down">><<set _targetLevel to $labyrinthLevel+1>><<set _targetTile to 23>><<elseif _direction is "up">><<set _targetLevel to $labyrinthLevel-1>><<set _targetTile to 24>><<else>><<run window.showMessage("Unknown stairs direction.")>><<set _targetLevel to -1>><</if>><<if _targetLevel > 0>><<if $labyrinthMaps[_targetLevel]>><<set _targetMap to $labyrinthMaps[_targetLevel]>><<for _y=0; _y<_targetMap.length; _y++>><<for _x=0; _x<_targetMap[_y].length; _x++>><<if !_found && Math.abs(Number(_targetMap[_y][_x])) is _targetTile>><<set _found to true>><<set _foundX to _x>><<set _foundY to _y>><</if>><</for>><</for>><<if _found>><<if !$labyrinthPositions>><<set $labyrinthPositions to {}>><</if>><<set $labyrinthLevel to _targetLevel>><<set $labyrinthPositions[_targetLevel] to {x:_foundX,y:_foundY}>><<goto "Labyrinth">><<else>><<run window.showMessage("Stairs were not found on level "+_targetLevel+".")>><</if>><<else>><<run window.showMessage("Labyrinth level "+_targetLevel+" does not exist.")>><</if>><</if>><</widget>> -------------------------------------------------- <<widget "locationview" container>><<nobr>><<set _locationName=String(_args[0]||"Unknown Location")>><div class="location-screen"><div class="location-description"><div class="location-name"><<=_locationName>></div><div class="location-content">_contents</div></div></div><</nobr>><</widget>> -------------------------------------------------- <<widget "devitemgenerator">><<nobr>><<set _devGeneratorType=String(_args[0]||"item").toLowerCase()>><<set _devGeneratorTitle=String(_args[1]||"Item Generator")>><div class="dev-item-generator"><h3><<=_devGeneratorTitle>></h3><<if _devGeneratorType=="weapon">><<set _devWeaponKeys=Object.keys($weaponCatalog||{})>><<if (!$devWeaponId||!$weaponCatalog[$devWeaponId])&&_devWeaponKeys.length>><<set $devWeaponId=_devWeaponKeys[0]>><</if>><<if !Number.isFinite(Number($devWeaponLevel))||Number($devWeaponLevel)<1>><<set $devWeaponLevel=1>><</if>><<if !$devWeaponRarity>><<set $devWeaponRarity="common">><</if>><<if !Number.isFinite(Number($devWeaponQuantity))||Number($devWeaponQuantity)<1>><<set $devWeaponQuantity=1>><</if>><div class="dev-item-generator-row"><label>Weapon</label><select onchange="SugarCube.State.variables.devWeaponId=this.value"><<for _devWeaponKey range _devWeaponKeys>><<set _devWeaponTemplate=$weaponCatalog[_devWeaponKey]>><option @value="_devWeaponKey" @selected="$devWeaponId==_devWeaponKey?'selected':null"><<=_devWeaponTemplate.name||_devWeaponKey>> [<<=_devWeaponKey>>]</option><</for>></select></div><div class="dev-item-generator-row"><label>Level</label><<numberbox "$devWeaponLevel" 1>></div><div class="dev-item-generator-row"><label>Rarity</label><<listbox "$devWeaponRarity">><<option "Common" "common">><<option "Uncommon" "uncommon">><<option "Rare" "rare">><<option "Epic" "epic">><<option "Legendary" "legendary">><</listbox>></div><div class="dev-item-generator-row"><label>Quantity</label><<numberbox "$devWeaponQuantity" 1>></div><div class="dev-item-generator-action"><<button "Add to inventory">><<set $devWeaponLevel=Math.max(1,Math.min(21,Math.floor(Number($devWeaponLevel)||1)))>><<set $devWeaponQuantity=Math.max(1,Math.floor(Number($devWeaponQuantity)||1))>><<generateitem $items "weapon" $devWeaponId $devWeaponLevel $devWeaponRarity $devWeaponQuantity>><<if _generatedAmount>0>><<run showMessage("Added "+_generatedAmount+" × "+String($weaponCatalog[$devWeaponId]&&$weaponCatalog[$devWeaponId].name||$devWeaponId)+".")>><<else>><<run showMessage("The weapon could not be generated.")>><</if>><</button>></div><<elseif _devGeneratorType=="armor"||_devGeneratorType=="armour">><<set _devArmorKeys=Object.keys($armorCatalog||{})>><<if (!$devArmorId||!$armorCatalog[$devArmorId])&&_devArmorKeys.length>><<set $devArmorId=_devArmorKeys[0]>><</if>><<if !Number.isFinite(Number($devArmorLevel))||Number($devArmorLevel)<1>><<set $devArmorLevel=1>><</if>><<if !$devArmorRarity>><<set $devArmorRarity="common">><</if>><<if !Number.isFinite(Number($devArmorQuantity))||Number($devArmorQuantity)<1>><<set $devArmorQuantity=1>><</if>><div class="dev-item-generator-row"><label>Armor</label><select onchange="SugarCube.State.variables.devArmorId=this.value"><<for _devArmorKey range _devArmorKeys>><<set _devArmorTemplate=$armorCatalog[_devArmorKey]>><option @value="_devArmorKey" @selected="$devArmorId==_devArmorKey?'selected':null"><<=_devArmorTemplate.name||_devArmorKey>> [<<=_devArmorKey>>]</option><</for>></select></div><div class="dev-item-generator-row"><label>Level</label><<numberbox "$devArmorLevel" 1>></div><div class="dev-item-generator-row"><label>Rarity</label><<listbox "$devArmorRarity">><<option "Common" "common">><<option "Uncommon" "uncommon">><<option "Rare" "rare">><<option "Epic" "epic">><<option "Legendary" "legendary">><</listbox>></div><div class="dev-item-generator-row"><label>Quantity</label><<numberbox "$devArmorQuantity" 1>></div><div class="dev-item-generator-action"><<button "Add to inventory">><<set $devArmorLevel=Math.max(1,Math.min(21,Math.floor(Number($devArmorLevel)||1)))>><<set $devArmorQuantity=Math.max(1,Math.floor(Number($devArmorQuantity)||1))>><<generateitem $items "armor" $devArmorId $devArmorLevel $devArmorRarity $devArmorQuantity>><<if _generatedAmount>0>><<run showMessage("Added "+_generatedAmount+" × "+String($armorCatalog[$devArmorId]&&$armorCatalog[$devArmorId].name||$devArmorId)+".")>><<else>><<run showMessage("The armor could not be generated.")>><</if>><</button>></div><<else>><<set _devItemKeys=Object.keys($itemCatalog||{})>><<if (!$devItemId||!$itemCatalog[$devItemId])&&_devItemKeys.length>><<set $devItemId=_devItemKeys[0]>><</if>><<if !Number.isFinite(Number($devItemQuantity))||Number($devItemQuantity)<1>><<set $devItemQuantity=1>><</if>><div class="dev-item-generator-row"><label>Item</label><select onchange="SugarCube.State.variables.devItemId=this.value"><<for _devItemKey range _devItemKeys>><<set _devItemTemplate=$itemCatalog[_devItemKey]>><option @value="_devItemKey" @selected="$devItemId==_devItemKey?'selected':null"><<=_devItemTemplate.name||_devItemKey>> [<<=_devItemKey>>]</option><</for>></select></div><div class="dev-item-generator-row"><label>Quantity</label><<numberbox "$devItemQuantity" 1>></div><div class="dev-item-generator-action"><<button "Add to inventory">><<set $devItemQuantity=Math.max(1,Math.floor(Number($devItemQuantity)||1))>><<generateitem $items "item" $devItemId 1 "common" $devItemQuantity>><<if _generatedAmount>0>><<run showMessage("Added "+_generatedAmount+" × "+String($itemCatalog[$devItemId]&&$itemCatalog[$devItemId].name||$devItemId)+".")>><<else>><<run showMessage("The item could not be generated.")>><</if>><</button>></div><</if>></div><</nobr>><</widget>>
<<set $helmitems to null>><<set $armoritems to null>><<set $bootsitems to null>><<set $shielditems to null>><<set $weaponitems to null>> <<set $start to 0>><<set $refTurn to 0>> <<set $trap to 0>><<set $labyrinthstep to 1>><<set $labyrinthstep_last to 1>><<set $lppX to 0>><<set $lppY to 0>><<set $lppt to 0>> <<set $playerTitle to "">> <<set $playerName to "Player">> <<set $labyrinthTeleportLevel=0>><<set $labyrinthTeleportX=0>><<set $labyrinthTeleportY=0>> <<set $playerMoney to 0>> <<set $playerStatsLevelUp to 0>> <<set $playerStats to {strength: 5 ,constitution: 5 ,dexterity: 5 ,charisma: 5 ,intelligence: 5 ,wisdom: 5, hp: 25, hp_max: 25, mp: 25, mp_max: 25, xp: 0 ,level: 1, rank: "F", armor_light_xp: 0, armor_light_lvl: 0, armor_medium_xp: 0, armor_medium_lvl: 0, armor_heavy_xp: 0, armor_heavy_lvl: 0, sword_xp: 0, sword_lvl: 0, axe_xp: 0, axe_lvl: 0, bow_xp: 0, bow_lvl: 0, crossbow_xp: 0, crossbow_lvl: 0, blunt_xp: 0, blunt_lvl: 0, fire_xp: 0, fire_lvl: 0, ice_xp: 0, ice_lvl: 0, lightning_xp: 0, lightning_lvl: 0}>> <<set $items to []>> <<set $quests to { village_missing: 0 }>> <<set $merchants={ blacksmith_valenford:{title:"Walter Hartwell",image:"blacksmith10",merchantType:"blacksmith",respawn:600,stockMultiplier:100,items:[],lastRefresh:0,itemLevel:0}, armorer_valenford:{title:"Tristan Navarro",image:"armorer3",merchantType:"armorer",respawn:600,stockMultiplier:100,items:[],lastRefresh:0,itemLevel:0}, fletcher_valenford:{title:"Hector Gallo",image:"fletcher7",merchantType:"fletcher",respawn:600,stockMultiplier:100,items:[],lastRefresh:0,itemLevel:0}, tailor_valenford:{title:"Carlos Serrano",image:"tailor5",merchantType:"tailor",respawn:600,stockMultiplier:100,items:[],lastRefresh:0,itemLevel:0}, mage_valenford:{title:"Oliver Fairbrook",image:"mage3",merchantType:"mage",respawn:600,stockMultiplier:100,items:[],lastRefresh:0,itemLevel:0}, potion_valenford:{title:"Rosalie Ashwell",image:"potion10",merchantType:"potion",respawn:100,stockMultiplier:100,items:[],lastRefresh:0,itemLevel:0}, guild_valenford:{title:"Adèle Dumont",image:"guild1",merchantType:"guild",respawn:200,stockMultiplier:100,items:[],lastRefresh:0,itemLevel:0}, food_valenford:{title:"Sebastian Windmere",image:"stall2",merchantType:"food",respawn:100,stockMultiplier:100,items:[],lastRefresh:0,itemLevel:0} }>> <<set $tradeBuyQty={}>><<set $tradeSellQty={}>><<set $tradeMessage="">> <<set $labyrinthLootSources to {}>><<set $lootSourceOpen to false>><<set $lootSourceType to "">> <<set $inlabyrinth to 0>><<set $labyrinthLevel to 1>><<set $labyrinthPositions to []>> <<set $labyrinthMaps to [[],[ [-99,-99,-99,-99,-99,-99,-99], [-99,-99,-99,-99,-99,-16,-99], [-99,-99,-99,-99,-99,-60,-11,-54,-99,-17,-99], [-99,-99,-99,-99,-99,-21,-99,-11,-99,-12,-99], [-99,-99,-99,-99,-51,-51,-99,-54,-60,-51,-99], [-99,-99,-25,-99,-11,-99,-99,-99,-12,-99], [-99,-23,-59,-22,-49,-99,-32,-99,-60,-12,-68,-11,-12,-18,-99], [-99,-99,-99,-99,-12,-99,-52,-60,-51,-99,-10,-99], [-99,-99,-99,-39,-63,-99,-99,-12,-99,-99,-11,-99], [-99,-99,-99,-99,-52,-52,-99,-52,-52,-99,-22,-99,-20,-99], [-99,-99,-99,-99,-99,-10,-99,-99,-11,-99,-12,-99,-63,-37,-99], [-99,-99,-99,-99,-99,-70,-24,-99,-10,-99,-52,-10,-51,-99], [-99,-34,-27,-64,-10,-51,-99,-99,-12,-99,-99,-98,-99], [-99,-99,-99,-31,-99,-99,-99,-99,-64,-29,-99,-19,-99], [-99,-99,-99,-99,-99,-99,-99,-99,-20,-99], [-99,-99,-99,-99,-99,-99,-99,-99,-99,-99] ] ]>> <<include "ItemsInit">> <<include "MonstersInit">> <<include "labyrinth rest of levels">>
<<silently>><<set $rpas="camp">><<set $gamebg=$gamebg_camp>> <<if $camplit==null>><<set $camplit=0>><</if>> <<if $createRestCheckpoint==true>><<set $createRestCheckpoint=false>><<checkpoint "Last Rest" 0>><</if>> <<set _vegetablesQty=0>><<set _meatQty=0>><<set _travelSuppliesQty=0>> <<set _vegetablesImage="vegetables">><<set _meatImage="meat">><<set _travelSuppliesImage="travelsupplies">> <<if !Array.isArray($items)>><<set $items=[]>><</if>> <<for _campItem range $items>><<if _campItem.category=="vegetables">><<set _vegetablesQty+=Math.max(0,Number(_campItem.quantity||0))>><<set _vegetablesImage=_campItem.image||"vegetables">><<elseif _campItem.category=="meat">><<set _meatQty+=Math.max(0,Number(_campItem.quantity||0))>><<set _meatImage=_campItem.image||"meat">><<elseif _campItem.category=="travelsupplies">><<set _travelSuppliesQty+=Math.max(0,Number(_campItem.quantity||0))>><<set _travelSuppliesImage=_campItem.image||"travelsupplies">><</if>><</for>> <</silently>><<nobr>> <div class="camp-sprite-anchor"> <div class="camp-sprite-position camp-fire-position"> <<if $camplit==1>> <<tooltipbox "link">><<link "<img src='resources/img/sprite/campfire_lit.png' class='ui-image-reset ui-hover-image camp-campfire-sprite'>">><<set $camplit=0>><<goto "camp">><</link>> ---- Extinguish the campfire. <</tooltipbox>> <div class="camp-pot-link"> <<tooltipbox "link">><<link "<img src='resources/img/sprite/pot.png' class='ui-image-reset ui-hover-image camp-pot-sprite'>">> <<if _vegetablesQty>=10&&_meatQty>=5>> <<consumeitemcategory "vegetables" 5>> <<consumeitemcategory "meat" 5>> <<generateitem $items "item" "travel_supplies" 1 "common" 1>> <<if _generatedAmount>0>> <<run showMessage("Travel Supplies ready!")>> <<goto "camp">> <<else>> <<run UI.alert("Travel Supplies could not be created.")>> <</if>> <<else>> <<run UI.alert("You need 5 vegetables and 5 meat to make 1 Travel Supplies.")>> <</if>> <</link>> ---- Use 5 vegetables and 5 meat to prepare 1 Travel Supplies. <</tooltipbox>> </div> <<else>> <<tooltipbox "link">><<link "<img src='resources/img/sprite/campfire.png' class='ui-image-reset ui-hover-image camp-campfire-sprite'>">><<set $camplit=1>><<goto "camp">><</link>> ---- Light the campfire. <</tooltipbox>> <img src="resources/img/sprite/pot.png" class="ui-image-reset ui-hover-image camp-pot-sprite camp-pot-disabled"> <</if>> </div> <div class="camp-sprite-position camp-tent-position"> <<if $camplit==1>> <<tooltipbox "link">><<link "<img src='resources/img/sprite/tent_lit.png' class='ui-image-reset ui-hover-image camp-tent-sprite'>">> <<if _travelSuppliesQty<1>> <<run UI.alert("You need 1 Travel Supplies to rest.")>> <<elseif Number($playerStats.hp||0)>=Number($playerStats.hp_max||0)&&Number($playerStats.mp||0)>=Number($playerStats.mp_max||0)>> <<run showMessage("You are already fully rested!")>> <<else>> <<consumeitemcategory "travelsupplies" 1>> <<set $playerStats.hp=Math.max(0,Number($playerStats.hp_max||0))>> <<set $playerStats.mp=Math.max(0,Number($playerStats.mp_max||0))>> <<run showMessage("HP and MP fully restored!")>> <<set $createRestCheckpoint=true>> <<goto "camp">> <</if>> <</link>> ---- Resting consumes 1 Travel Supplies and restores HP and MP. <</tooltipbox>> <<else>> <img src="resources/img/sprite/tent.png" class="ui-image-reset ui-hover-image camp-tent-sprite camp-tent-disabled"> <</if>> </div> </div> <div class="camp-interface"> <<if $camplit==1>> <<set $bgdark=0>> <div class="camp-supplies"> <div class="camp-supplies-title">Camp Supplies</div> <div class="camp-supply-row"> <div class="ui-flex-center ui-reset-spacing"><<itemicon _vegetablesImage 1>></div> <div class="camp-supply-name">Vegetables</div> <div class="camp-supply-quantity">× <<=_vegetablesQty>></div> </div> <div class="camp-supply-row"> <div class="ui-flex-center ui-reset-spacing"><<itemicon _meatImage 1>></div> <div class="camp-supply-name">Meat</div> <div class="camp-supply-quantity">× <<=_meatQty>></div> </div> <div class="camp-supply-separator"></div> <div class="camp-supply-row camp-travel-supplies"> <div class="ui-flex-center ui-reset-spacing"><<itemicon _travelSuppliesImage 1>></div> <div class="camp-supply-name">Travel Supplies</div> <div class="camp-supply-quantity">× <<=_travelSuppliesQty>></div> </div> </div> <div class="ui-row ui-row-center ui-camp-navigation"> [[Valenford Town->valenford_town]] </div> <<else>> <<if $gamebg=="camp_cave.jpg">><<set $bgdark=0.7>><<else>><<set $bgdark=0.3>><</if>> <div class="camp-fire-message">Light the campfire to cook or rest.</div> <div class="ui-row ui-row-center ui-camp-navigation"> [[Valenford Town->valenford_town]] </div> <</if>> </div> <</nobr>>
<<nobr>><<set $gamebg="character.jpg">><<set $bgdark=0.75>><<set $inlabyrinth to 0>> <div class="ui-row ui-row-between ui-row-center ui-card-nav"> <<link '<img src="resources/img/equipment.jpg" class="card-nav-icon"> Inventory'>><<goto "inventory">><</link>> <<link 'Journal <img src="resources/img/journal.jpg" class="card-nav-icon">'>><<goto "journal">><</link>> </div> <<set _xpNeeded=200+(($playerStats.level-1)*50)>> <div class="character-page"> <div class="character-wheel"> <img @src="'resources/img/character_bust'+$playerStats.rank+'.png'" class="character-portrait"> <<characterstat "stat-strength" "strength-info">> <div class="character-stat-name">Strength</div> <div class="character-stat-value"> <<print $playerStats.strength>> <<if $playerStatsLevelUp>0>> <<link '<span class="stat-plus">+</span>'>> <<set $playerStats.strength++>> <<set $playerStatsLevelUp-->> <<goto "character">> <</link>> <</if>> </div> <</characterstat>> <<characterstat "stat-constitution" "constitution-info">> <div class="character-stat-name">Constitution</div> <div class="character-stat-value"> <<print $playerStats.constitution>> <<if $playerStatsLevelUp>0>> <<link '<span class="stat-plus">+</span>'>><<set _gain=setup.getResourceGain($playerStats.rank)>> <<set $playerStats.constitution++>> <<set $playerStats.hp_max+=_gain>> <<set $playerStats.hp=Math.min($playerStats.hp+_gain,$playerStats.hp_max)>> <<set $playerStatsLevelUp-->> <<goto "character">> <</link>> <</if>> </div> <</characterstat>> <<characterstat "stat-dexterity" "dexterity-info">> <div class="character-stat-name">Dexterity</div> <div class="character-stat-value"> <<print $playerStats.dexterity>> <<if $playerStatsLevelUp>0>> <<link '<span class="stat-plus">+</span>'>> <<set $playerStats.dexterity++>> <<set $playerStatsLevelUp-->> <<goto "character">> <</link>> <</if>> </div> <</characterstat>> <<characterstat "stat-charisma" "charisma-info">> <div class="character-stat-name">Charisma</div> <div class="character-stat-value"> <<print $playerStats.charisma>> <<if $playerStatsLevelUp>0>> <<link '<span class="stat-plus">+</span>'>> <<set $playerStats.charisma++>> <<set $playerStatsLevelUp-->> <<goto "character">> <</link>> <</if>> </div> <</characterstat>> <<characterstat "stat-intelligence" "intelligence-info">> <div class="character-stat-name">Intelligence</div> <div class="character-stat-value"> <<print $playerStats.intelligence>> <<if $playerStatsLevelUp>0>> <<link '<span class="stat-plus">+</span>'>> <<set $playerStats.intelligence++>> <<set $playerStatsLevelUp-->> <<goto "character">> <</link>> <</if>> </div> <</characterstat>> <<characterstat "stat-wisdom" "wisdom-info">> <div class="character-stat-name">Wisdom</div> <div class="character-stat-value"> <<print $playerStats.wisdom>> <<if $playerStatsLevelUp>0>> <<link '<span class="stat-plus">+</span>'>> <<set _gain=setup.getResourceGain($playerStats.rank)>> <<set $playerStats.wisdom++>> <<set $playerStats.mp_max+=_gain>> <<set $playerStats.mp=Math.min($playerStats.mp+_gain,$playerStats.mp_max)>> <<set $playerStatsLevelUp-->> <<goto "character">> <</link>> <</if>> </div> <</characterstat>> <<if $playerStatsLevelUp>0>> <<characterstat "stat-levelup" "points-info">><div class="character-stat-name">Points:<br><b style="color:red;"><<print $playerStatsLevelUp>></b></div><</characterstat>> <<else>> <<characterstat "stat-levelup" "rank-info">><div class="character-stat-name">Rank:</div><b @class="'rank-'+$playerStats.rank"><<print $playerStats.rank>></b><</characterstat>> <</if>> <div id="strength-info" class="character-hover-panel hidden"><div class="character-hover-panel-title">Strength</div>Increases Physical Attack.<br>Influences carrying capacity.</div> <div id="constitution-info" class="character-hover-panel hidden"><div class="character-hover-panel-title">Constitution</div>Increases Physical Defense.<br>Increases maximum health.</div> <div id="dexterity-info" class="character-hover-panel hidden"><div class="character-hover-panel-title">Dexterity</div>Increases hit and evasion chances.</div> <div id="charisma-info" class="character-hover-panel hidden"><div class="character-hover-panel-title">Charisma</div>It affects both the prices of goods<br>and the amount of the reward.</div> <div id="intelligence-info" class="character-hover-panel hidden"><div class="character-hover-panel-title">Intelligence</div>Increases Magical Attack.</div> <div id="wisdom-info" class="character-hover-panel hidden"><div class="character-hover-panel-title">Wisdom</div>Increases Magical Defense.<br>Increases maximum mana.</div> <div id="points-info" class="character-hover-panel hidden"><div class="character-hover-panel-title">Stat points</div>Amount of points to allocate.</div> <div id="rank-info" class="character-hover-panel hidden"><div class="character-hover-panel-title">Your rank</div>Rank from F to S.</div> </div> <<if $playerStats.rank is "F" and $playerStats.level>=17>><br> <div class="rank-promotion"><b>Guild Promotion Available</b>You have reached the level required for promotion from <b class="rank-F">Rank F</b> to <b class="rank-E">Rank E</b>. Visit the nearest Adventurers' Guild branch to take the promotion examination and officially receive your new rank.</div> <<elseif $playerStats.rank is "E" and $playerStats.level>=34>><br> <div class="rank-promotion"><b>Guild Promotion Available</b>You have reached the level required for promotion from <b class="rank-E">Rank E</b> to <b class="rank-D">Rank D</b>. Visit the nearest Adventurers' Guild branch to take the promotion examination and officially receive your new rank.</div> <<elseif $playerStats.rank is "D" and $playerStats.level>=51>><br> <div class="rank-promotion"><b>Guild Promotion Available</b>You have reached the level required for promotion from <b class="rank-D">Rank D</b> to <b class="rank-C">Rank C</b>. Visit the nearest Adventurers' Guild branch to take the promotion examination and officially receive your new rank.</div> <<elseif $playerStats.rank is "C" and $playerStats.level>=68>><br> <div class="rank-promotion"><b>Guild Promotion Available</b>You have reached the level required for promotion from <b class="rank-C">Rank C</b> to <b class="rank-B">Rank B</b>. Visit the nearest Adventurers' Guild branch to take the promotion examination and officially receive your new rank.</div> <<elseif $playerStats.rank is "B" and $playerStats.level>=85>><br> <div class="rank-promotion"><b>Guild Promotion Available</b>You have reached the level required for promotion from <b class="rank-B">Rank B</b> to <b class="rank-A">Rank A</b>. Visit the nearest Adventurers' Guild branch to take the promotion examination and officially receive your new rank.</div> <<elseif $playerStats.rank is "A" and $playerStats.level>=101>><br> <div class="rank-promotion"><b>Guild Promotion Available</b>You have reached the level required for promotion from <b class="rank-A">Rank A</b> to <b class="rank-S">Rank S</b>. Visit the nearest Adventurers' Guild branch to take the promotion examination and officially receive your new rank.</div> <</if>> <div class="ui-panel ui-panel-stats"> <h2>$playerTitle $playerName</h2> <div class="ui-row ui-row-between ui-stat-row"><span>Level:</span><strong><<= $playerStats.level>> <<=$playerStats.class>></strong></div> <div class="ui-row ui-row-between ui-stat-row"><span>XP:</span><div class="ui-progress" style="width:100%;"><div class="ui-progress-fill" @style="'width:'+Math.min(100,Math.round($playerStats.xp/_xpNeeded*100))+'%;background:linear-gradient(90deg,#8f6b16,#ffd700);'"></div><div class="ui-progress-text"><<= $playerStats.xp>> / <<= _xpNeeded>></div></div></div> <div class="ui-row ui-row-between ui-stat-row"><span>HP</span><<hpbar>></div> <div class="ui-row ui-row-between ui-stat-row"><span>MP</span><<manabar>></div> <div class="ui-row ui-row-between ui-stat-row"><span>Physical Attack</span><strong><<= $physicalAttack>></strong></div> <div class="ui-row ui-row-between ui-stat-row"><span>Physical Defense</span><strong><<= $physicalDefense>></strong></div> <div class="ui-row ui-row-between ui-stat-row"><span>Magic Attack</span><strong><<= $magicAttack>></strong></div> <div class="ui-row ui-row-between ui-stat-row"><span>Magic Defense</span><strong><<= $magicDefense>></strong></div> </div> </div> <div class="ui-panel ui-panel-stats ui-proficiency"> <h2>Proficiencies</h2> <<set _proficiencyNames={armor_light:"Light Armor",armor_medium:"Medium Armor",armor_heavy:"Heavy Armor",sword:"Sword",axe:"Axe",blunt:"Blunt Weapons",bow:"Bow",crossbow:"Crossbow",fire:"Fire Magic",ice:"Ice Magic",lightning:"Lightning Magic"}>> <<for _type range setup.proficiencyTypes>> <<set _level=Number($playerStats[_type+"_lvl"])||0>> <<set _xp=Number($playerStats[_type+"_xp"])||0>> <<set _required=setup.proficiencyXpRequirements[_level]||0>> <<set _bonus=_level*2>> <<set _percent=_required>0?Math.min(100,Math.floor((_xp/_required)*100)):100>> <div class="ui-card ui-progress-card"> <div class="ui-row ui-row-between ui-row-center ui-grid-header"><span class="ui-name"><<=_proficiencyNames[_type]||_type>></span><span class="ui-meta">Level <strong><<=_level>></strong></span><span class="ui-meta ui-meta-bonus">Bonus <strong>+<<=_bonus>>%</strong></span></div> <div class="ui-progress"><div class="ui-progress-fill" @style="'width:'+_percent+'%;'"></div><span class="ui-progress-text"><<if _required>0>><<=_xp>> / <<= _required>> XP<<else>>MAX<</if>></span></div> </div> <</for>> </div> <</nobr>>
<<if $menu==1>><<nobr>> <div class="story-menu"> <div class="story-menu-item"><<tooltipbox>><<link '<img src="resources/img/character.jpg">'>><<if passage()=="character">><<goto $rpas>><<else>><<goto "character">><</if>><</link>>----Character card<</tooltipbox>></div> <div class="story-menu-item"><<tooltipbox>><<link '<img src="resources/img/equipment.jpg">'>><<if passage()=="inventory">><<goto $rpas>><<else>><<goto "inventory">><</if>><</link>>----Inventory<</tooltipbox>></div> <div class="story-menu-item"><<tooltipbox>><<link '<img src="resources/img/journal.jpg">'>><<if passage()=="journal">><<goto $rpas>><<else>><<goto "journal">><</if>><</link>>----Quest journal<</tooltipbox>></div> <div class="story-menu-item ui-empty"></div> </div><</nobr>><</if>><<if $bars==1>><<nobr>> <strong>HP</strong> <<hpbar>> <strong>MP</strong> <<manabar>> <</nobr>><</if>> <<if $inlabyrinth is 1 and setup.labyrinthGetMap() and setup.labyrinthGetPosition()>><<nobr>> <div class="labyrinth-sidebar"> <div class="labyrinth-map-button"> <<button "Map">> <<addclass "#labyrinth-map-overlay" "is-open">> <</button>> </div> <<labyrinthMinimap>> <div class="labyrinth-controls"> <div class="labyrinth-control-up"> <<button "▲">> <<run setup.labyrinthMove("up")>> <</button>> </div> <div class="labyrinth-control-left"> <<button "◀">> <<run setup.labyrinthMove("left")>> <</button>> </div> <div class="labyrinth-control-down"> <<button "▼">> <<run setup.labyrinthMove("down")>> <</button>> </div> <div class="labyrinth-control-right"> <<button "▶">> <<run setup.labyrinthMove("right")>> <</button>> </div> </div> </div> <div id="labyrinth-map-overlay" class="labyrinth-map-overlay"> <div class="labyrinth-map-window"> <div class="labyrinth-map-header"> <div class="labyrinth-map-title"> Labyrinth map - floor <<=$labyrinthLevel>> <!-- - X: <<=$labyrinthPositions[$labyrinthLevel].x>>, Y:<<=$labyrinthPositions[$labyrinthLevel].y>> --> </div> <div class="labyrinth-map-close"> <<button "Zamknij">> <<removeclass "#labyrinth-map-overlay" "is-open">> <</button>> </div> </div> <div class="labyrinth-full-map-scroll"> <<labyrinthFullMap>> </div> </div> </div> <</nobr>><</if>> <span class="debug"> <<button "Variables">><<run Dialog.setup("variables")>><<run Dialog.wiki(Story.get("variables").processText())>><<run Dialog.open()>><</button>> <<button "hp">><<set $playerStats.hp to $playerStats.hp_max>><</button>> Step: $labyrinthstep $trap x $lppX y $lppY number:$lppt Turn: $refTurn </span>
<<nobr>><div class="ui-row ui-row-between ui-row-center ui-card-nav"><<set $gamebg="journal.jpg">><<set $bgdark=0.75>><<set $inlabyrinth to 0>> <<link '<img src="resources/img/character.jpg" class="card-nav-icon"> Character'>> <<goto "character">> <</link>> <<link 'Inventory <img src="resources/img/equipment.jpg" class="card-nav-icon">'>> <<goto "inventory">> <</link>> </div> <<set $quests.game to 1>> <<set $quests.game1 to 99>> <div class="journal-page"> <h2>Active Quests</h2> <<questLocal $quests.game "Don't break the game.">>Please don't break the game :)<</questLocal>> <<questLocal $quests.village_missing "The Missing Villagers">> <<if $quests.village_missing==1>> Several villagers have disappeared. Ask the inhabitants of the village if they noticed anything unusual. <<elseif $quests.village_missing==2>> The missing villagers were last seen near the forest. Search the path leading away from the village. <<elseif $quests.village_missing==3>> You found signs of a struggle deeper in the forest. <</if>> <</questLocal>> <<questMain $quests.magic_beacon "The King's Magic Beacon">> <<if $quests.magic_beacon==1>> The king entrusted you with a magical lantern. Find the ancient beacons located throughout the region. <<elseif $quests.magic_beacon==2>> The first beacon has been lit. Continue searching for the remaining beacons. <<elseif $quests.magic_beacon==3>> Two beacons now burn. The lantern reacts more strongly as you approach the next location. <</if>> <</questMain>> <h2>Completed Quests</h2> <<questCompleted $quests.game1 "Start game">>Bravo, you managed to launch the game.<</questCompleted>> <<questCompleted $quests.village_missing "The Missing Villagers">> The missing villagers were found and returned safely to their homes. <</questCompleted>> <<questCompleted $quests.magic_beacon "The King's Magic Beacon">> Every ancient beacon in the region has been lit. <</questCompleted>> </div> <</nobr>>
<div class="two-columns"><div> Level:<<print $playerStats.level>> Ranga:<<print $playerStats.rank>> <<button "punkty stat">><<set $playerStatsLevelUp++>><<goto "character">><</button>><<button "Rank: S">><<set $playerStats.rank to "S">><<goto "character">><</button>> <<button "Rank: A">><<set $playerStats.rank to "A">><<goto "character">><</button>><<button "Rank: A lvl">><<set $playerStats.level to 100>><<goto "character">><</button>> <<button "Rank: B">><<set $playerStats.rank to "B">><<goto "character">><</button>><<button "Rank: B lvl">><<set $playerStats.level to 81>><<goto "character">><</button>> <<button "Rank: C">><<set $playerStats.rank to "C">><<goto "character">><</button>> <<button "Rank: C lvl">><<set $playerStats.level to 64>><<goto "character">><</button>> <<button "Rank: D">><<set $playerStats.rank to "D">><<goto "character">><</button>><<button "Rank: D lvl">><<set $playerStats.level to 50>><<goto "character">><</button>> <<button "Rank: E">><<set $playerStats.rank to "E">><<goto "character">><</button>><<button "Rank: E lvl">><<set $playerStats.level to 33>><<goto "character">><</button>> <<button "Rank: F">><<set $playerStats.rank to "F">><<goto "character">><</button>><<button "Rank: F lvl">><<set $playerStats.level to 16>><<goto "character">><</button>> <<button "level +">><<set $playerStats.level++>><<goto "character">><</button>> village_missing - <<print $quests.village_missing>> <<button "+">><<set $quests.village_missing++>><<goto "journal">><</button>> <<button "end">><<set $quests.village_missing to 99>><<goto "journal">><</button>> <<if $quests.village_missing == 0>><<link "Ask about the missing villagers">><<set $quests.village_missing to 1>><<goto" journal">><</link>><</if>> <<if !$quests.magic_beacon>><<link "Accept the King's mission">><<set $quests.magic_beacon to 1>><<goto "journal">><</link>><</if>> magic_beacon - <<print $quests.magic_beacon>> <<button "+">><<set $quests.magic_beacon++>><<goto "journal">><</button>><<button "end">><<set $quests.magic_beacon to 99>><<goto "journal">><</button>> Tła do camp: <<button "forest">><<set $gamebg_camp to "camp_forest.jpg">><<goto "camp">><</button>><<button "forest2">><<set $gamebg_camp to "camp_forest2.jpg">><<goto "camp">><</button>> <<button "field">><<set $gamebg_camp to "camp_field.jpg">><<goto "camp">><</button>><<button "field2">><<set $gamebg_camp to "camp_field2.jpg">><<goto "camp">><</button>> <<button "ruins">><<set $gamebg_camp to "camp_ruins.jpg">><<goto "camp">><</button>><<button "cave">><<set $gamebg_camp to "camp_cave.jpg">><<goto "camp">><</button>> <<button "xp+ panceż 140">><<run addEquippedArmorProficiencyXp(140)>><<goto "character">><</button>><<button "xp+ panceż 1400">><<run addEquippedArmorProficiencyXp(1400)>><<goto "character">><</button>> <<button "xp+ broń 140 ">><<run addEquippedWeaponProficiencyXp(140)>><<goto "character">><</button>><<button "xp+ broń 1400 ">><<run addEquippedWeaponProficiencyXp(1400)>><<goto "character">><</button>> <<button "sword prof 100 lvl ">><<set $playerStats.sword_lvl to 100>><<goto "character">><</button>><<button "heavy prof 100 lvl ">><<set $playerStats.armor_heavy_lvl to 100>><<goto "character">><</button>><<button "light prof 100 lvl ">><<set $playerStats.armor_light_lvl to 100>><<goto "character">><</button>> <<button "hp">><<set $playerStats.hp to $playerStats.hp_max>><<goto "character">><</button>> <<button "hp to 10000">><<set $playerStats.hp_max to 10000>><<set $playerStats.hp to 10000>><<goto "character">><</button>> <<button "mp">><<set $playerStats.mp to $playerStats.mp_max>><<goto "character">><</button>> <<button "level up by xp">><<set _xpNeeded=200+(($playerStats.level-1)*50)>><<set $playerStats.xp +=_xpNeeded>><<goto $rpas>><</button>> <<button "set level to 16 by xp">><<set $playerStats.xp to 6750>><<goto $rpas>><</button>> </div><div> <<button "add labirynt 2 lvl">><<set $labyrinthMaps[2]=[ [-99,-99,-99], [-99,-23,-99], [-99,-12,-99], [-99,-22,-99,-99,-99,-99,-99,-19,-99], [-99,-70,-33,-99,-99,-99,-99,-60,-20,-99], [-99,-10,-99,-99,-99,-31,-99,-98,-99], [-99,-54,-11,-62,-21,-69,-66,-28,-29,-99], [-99,-99,-99,-11,-99,-99,-29,-99], [-99,-99,-99,-10,-99], [-99,-99,-32,-63,-98,-19,-99], [-99,-99,-99,-11,-99], [-99,-36,-27,-50,-16,-99], [-99,-99,-99,-11,-99], [-99,-99,-24,-61,-99,-99,-31,-99], [-99,-99,-99,-52,-12,-11,-71,-20,-99], [-99,-99,-99,-99,-99,-99,-99,-99,-99] ]>><</button>> <<button "add labirynt 3 lvl">><<set $labyrinthMaps[3]=[[-99,-99,-99,-99,-99,-99,-99,-99,-99,-99], [-99,-20,-99,-99,-99,-99,-99,-99,-31,-99], [-99,-10,-99,-99,-39,-99,-99,-99,-28,-99], [-99,-52,-72,-11,-63,-66,-12,-21,-50,-12,-52,-99], [-99,-99,-10,-99,-99,-33,-99,-99,-11,-99,-52,-18,-99], [-99,-99,-12,-99,-99,-99,-99,-99,-12,-99], [-99,-99,-60,-25,-99,-99,-99,-99,-52,-52,-99], [-99,-23,-61,-99,-99,-99,-99,-99,-99,-64,-35,-99], [-99,-99,-10,-99,-36,-99,-99,-99,-99,-12,-99], [-99,-99,-54,-12,-71,-68,-12,-22,-12,-61,-99], [-99,-99,-99,-99,-99,-32,-99,-99,-99,-24,-99], [-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99] ]>><</button>> <<if !Number.isFinite(Number($devLabyrinthLevel))||Number($devLabyrinthLevel)<1>><<set $devLabyrinthLevel=1>><</if>> Level: <<numberbox "$devLabyrinthLevel" 1>> <<button "Load labyrinth level">> <<set $devLabyrinthLevel=Math.max(1,Math.floor(Number($devLabyrinthLevel)||1))>> <<if setup.labyrinthMapCatalog&&setup.labyrinthMapCatalog[$devLabyrinthLevel]>> <<set $labyrinthMaps[$devLabyrinthLevel]=clone(setup.labyrinthMapCatalog[$devLabyrinthLevel])>> <<run showMessage("Labyrinth level "+$devLabyrinthLevel+" loaded.")>> <<elseif $devLabyrinthLevel==1&&$labyrinthMaps[1]>> <<run showMessage("Level 1 is already stored in StoryInit.")>> <<else>> <<run showMessage("Labyrinth level "+$devLabyrinthLevel+" does not exist in the catalog.")>> <</if>> <</button>> ---------------------------------------------------------------------------------- <<button "cash">><<set $playerMoney=100000>><</button>> <<button "turn+600">><<set $refTurn +=600>><</button>> <<devitemgenerator "weapon" "Weapon Generator">>\ <<devitemgenerator "armor" "Armor Generator">>\ <<devitemgenerator "item" "Item Generator">>\ <<button "test2">><<set $merchants.blacksmith_valenford.stockMultiplier=20>><</button>> <<button "add horse">><<set $transportId="horse1">><<set $transportName=$animalsName.random()>><</button>> <<button "add Stagecoach">><<set $transportId="wagon3">><<set $transportName=$animalsName.random()>><</button>> <<button "add medical">><<addcatalogitemtotransport $medicalCargo 1>><</button>> <<button "add medical">> <<additemtotransport $medicalCargo 1>> <<goto "Transport">> <</button>> </div></div>
<<set $gamebg to "valenford_town.jpg">><<checkpoint "Last Visit to Town" 2>><<set $rpas to "valenford_town">><<set $transportAvailable=1>><<set $bgdark to 0.0>>\ <<locationview "Valenford Town - Merchant District">> The commercial district is alive with the constant rhythm of merchants calling to passersby and the sound of craftsmen at work. On one side of the broad cobblestone street stands a busy <<link "blacksmith's shop">><<set $merchantId="blacksmith_valenford">><<goto "trade">><</link>>, where glowing forges and ringing hammers shape swords, axes, and other weapons. Beside it is the <<link "armorer's workshop">><<set $merchantId="armorer_valenford">><<goto "trade">><</link>>, displaying polished helmets, shields, breastplates, and complete suits of armor for warriors of every rank. A little further on, there is a <<link "fletcher's shop">><<set $merchantId="fletcher_valenford">><<goto "trade">><</link>> with a selection of bows to choose from. A little farther along, a welcoming <<link "tailor's shop">><<set $merchantId="tailor_valenford">><<goto "trade">><</link>> offers finely crafted clothing, sturdy travel garments, leather tunics, cloaks, and light armor. Next door, an elegant <<link "magic shop">><<set $merchantId="mage_valenford">><<goto "trade">><</link>> showcases enchanted weapons that shimmer with faint magical energy behind reinforced display windows. Directly across the street, the <<link "potion shop">><<set $merchantId="potion_valenford">><<goto "trade">><</link>> customers with colorful bottles arranged neatly on wooden shelves, their mysterious contents glowing softly in the dim interior. Nearby, a lively <<link "market stall">><<set $merchantId="food_valenford">><<goto "trade">><</link>> overflows with fresh vegetables, herbs, cuts of meat, and smoked provisions, attracting townsfolk preparing for the day's meals. The scent of hot iron, leather, herbs, and fresh produce blends together, creating the unmistakable atmosphere of a thriving marketplace. For testing purposes, since the city currently has no locations other than this single street, and the rest of the world outside the city does not exist either: <<link "Guild">><<set $merchantId="guild_valenford">><<goto "trade">><</link>> <<link "Camp forest">><<set $gamebg_camp to "camp_forest.jpg">><<goto "camp">><</link>> <<link "Camp cave">><<set $gamebg_camp to "camp_cave.jpg">><<goto "camp">><</link>> <<link "Labyrinth (only 6 test levels)">><<set $labyrinthLevel=1>><<set $labyrinthPositions[1]={x:1,y:6}>><<goto "Labyrinth">><</link>> <<link "Get a horse">><<set $transportId="horse1">><<set $transportName=$animalsName.random()>><<goto "transport">><</link>> <</locationview>>
<<silently>><<set $refTurn++>> <<if passage() !=="dead">><<if $playerStats.hp == 0>><<goto "dead">><</if>><</if>> <<if $playerStats>> <<run window.checkPlayerLevel()>> <</if>> <<set _weapon=$weaponitems>> <<set _rankPower=setup.rankPower[$playerStats.rank]||0>> <<set _strength=Number($playerStats.strength)||0>> <<set _weaponPower=0>> <<set _proficiencyLevel=0>> <<if _weapon && _weapon.damageType==="physical">> <<set _weaponPower=Number(_weapon.power)||0>> <<set _proficiencyLevel=Number($playerStats[_weapon.category+"_lvl"])||0>> <</if>> <<set $physicalAttack=Math.round((_rankPower+_strength+_weaponPower)*(1+_proficiencyLevel*0.02))>> ----------------------------------------------- <<set _weapon=$weaponitems>> <<set _rankPower=setup.rankPower[$playerStats.rank]||0>> <<set _intelligence=Number($playerStats.intelligence)||0>> <<set _weaponPower=0>> <<set _proficiencyLevel=0>> <<if _weapon && _weapon.damageType==="magic">> <<set _weaponPower=Number(_weapon.power)||0>> <<set _proficiencyLevel=Number($playerStats[_weapon.category+"_lvl"])||0>> <</if>> <<set $magicAttack=Math.round((_rankPower+_intelligence+_weaponPower)*(1+_proficiencyLevel*0.02))>> ----------------------------------------------------------------------- <<set _rankPower=setup.rankPower[$playerStats.rank]||0>> <<set _constitution=Number($playerStats.constitution)||0>> <<set _wisdom=Number($playerStats.wisdom)||0>> <<set _armorPower=0>> <<set _armorItems=[$helmitems,$armoritems,$bootsitems,$shielditems]>> <<for _i=0;_i<_armorItems.length;_i++>> <<set _item=_armorItems[_i]>> <<if _item>> <<set _itemPower=Number(_item.power)||0>> <<set _category=_item.category||"">> <<set _proficiencyLevel=_category ? Number($playerStats[_category+"_lvl"])||0 : 0>> <<set _armorPower+=_itemPower*(1+_proficiencyLevel*0.02)>> <</if>> <</for>> <<set $physicalDefense=Math.round(_rankPower+_constitution+_armorPower)>> --------------------------------------------------------------- <<set _armorPower to 0>> <<for _i=0;_i<_armorItems.length;_i++>> <<set _item=_armorItems[_i]>> <<if _item>> <<set _itemPower=Number(_item.power)||0>> <<set _category=_item.category||"">> <<set _proficiencyLevel=_category ? Number($playerStats[_category+"_lvl"])||0 : 0>> <<set _armorPower+=_itemPower*(1+_proficiencyLevel*0.02)>> <</if>> <</for>> <<set $magicDefense=Math.round(_rankPower+_wisdom+_armorPower)>> ------------------------------------------------------------------------ <<set $playerWeight=0>> <<if !Array.isArray($items)>><<set $items=[]>><</if>> <<if !Array.isArray($transportItems)>><<set $transportItems=[]>><</if>> <<for _item range $items>><<set $playerWeight+=Number(_item.weight||0)*Math.max(0,Number(_item.quantity||1))>><</for>> <<set _equippedWeightItems=[$helmitems,$armoritems,$bootsitems,$shielditems,$weaponitems]>> <<for _equippedItem range _equippedWeightItems>><<if _equippedItem>><<set $playerWeight+=Number(_equippedItem.weight||0)>><</if>><</for>> <<set $playerWeight=Number($playerWeight.toFixed(3))>> <<set $playerWeightMax=25+Number($playerStats.strength||0)*5>> <<set $transportWeight=0>> <<for _item range $transportItems>><<set $transportWeight+=Number(_item.weight||0)*Math.max(0,Number(_item.quantity||1))>><</for>> <<set $transportWeight=Number($transportWeight.toFixed(3))>> <<set $transportWeightMax=$transportId&&$transportCatalog[$transportId]?Number($transportCatalog[$transportId].capacity||0):0>> <<if $playerWeight>$playerWeightMax&&passage()!="inventory"&&passage()!="transport">><<goto "inventory">><</if>> ------------------------------------------------------------------------ <</silently>>
<<set $inlabyrinth to 0>><<set $menu to 0>><<if $rpas != "fight">><<set $rpas2 to $rpas>><</if>><<set $rpas to "fight">><<set $labyrinthstep_last to $labyrinthstep>>\ <<nobr>> <<if !$battleStarted>> <<set $battleStarted=true>><<set $battleVictory=false>><<set $battleDefeat=false>><<set $battleFled=false>><<set $battleMessage="">> <<set $playerStats.hp=Math.max(0,Math.min(Number($playerStats.hp)||0,Number($playerStats.hp_max)||1))>> <<set $playerStats.mp=Math.max(0,Math.min(Number($playerStats.mp)||0,Number($playerStats.mp_max)||1))>> <<set _playerClass=String($playerStats.class||"warrior").toLowerCase()>> <<set _playerRank=String($playerStats.rank||setup.getRank($playerStats.level)).toUpperCase()>> <<set $team=[{ id:1, characterId:"player", isPlayer:true, name:$playerStats.name||"Player", level:Math.max(1,Math.floor(Number($playerStats.level)||1)), rank:_playerRank, image:_playerClass+"_"+_playerRank+".jpg" }]>> <<set _firstEnemy=$enemies.find(function(enemy){return !enemy.dead&&enemy.hp>0})>> <<set $battleTarget=_firstEnemy?_firstEnemy.id:null>> <<if !$battleReturnPassage>><<set $battleReturnPassage=previous()>><</if>> <</if>> <div id="battle-root"><<battleview>></div> <</nobr>>
<<set $gamebg to "dead.jpg">>Dead <<button "resurect">><<set $playerStats.hp to $playerStats.hp_max>><<set $menu to 1>><<set $bars to 1>><<goto "valenford_town">><</button>>
<<widget "generateenemies">><<nobr>> <<set $battleStarted=false>><<set $battleVictory=false>><<set $battleDefeat=false>><<set $battleFled=false>><<set $battleMessage="">><<set $battleTarget=null>><<set $battleItemUsed=false>><<set $battleMenu="actions">> <<set $enemies=[]>><<set $itemDrops=[]>><<set _list=Array.isArray(_args[0])?_args[0]:_args>><<set _hpPerCon={F:5,E:10,D:20,C:40,B:80,A:160,S:320}>> <<if _list.length%2!=0>><<run console.error("generateenemies requires pairs: monster ID and level",_list)>><</if>> <<for _i=0;_i<_list.length&&$enemies.length<6;_i+=2>> <<set _monsterId=_list[_i]>><<set _level=Math.max(1,Math.floor(Number(_list[_i+1])||1))>><<set _template=$monsters[_monsterId]>> <<if _template>> <<set _rank=setup.getRank(_level)>><<set _rankPower=setup.getRankPower2(_rank,_level)>><<set _archetypeId=setup.weightedPick(_template.archetypes)>><<set _archetype=$monsterArchetypes[_archetypeId]>> <<set _enemy={id:$enemies.length+1,monsterId:_monsterId,name:_template.name,level:_level,rank:_rank,type:clone(_template.type||[]),archetype:_archetypeId||"normal",image:(_template.image||_monsterId)+".jpg",weapons:clone(_template.weapons||[]),damageType:setup.getDamageType(_template.damageType),strength:5,constitution:5,dexterity:5,charisma:5,intelligence:5,wisdom:5,hp_max:25,dead:false}>> <<for _currentLevel=2;_currentLevel<=_level;_currentLevel++>> <<set _currentRank=setup.getRank(_currentLevel)>><<set _currentHpPerCon=Number(_hpPerCon[_currentRank])||5>> <<set _enemy.strength++>><<set _enemy.constitution++>><<set _enemy.dexterity++>><<set _enemy.charisma++>><<set _enemy.intelligence++>><<set _enemy.wisdom++>><<set _enemy.hp_max+=_currentHpPerCon>> <<for _point=0;_point<5;_point++>><<set _stat=setup.weightedPick(_template.growth)>><<if _stat&&_enemy[_stat]!==undefined>><<set _enemy[_stat]++>><<if _stat=="constitution">><<set _enemy.hp_max+=_currentHpPerCon>><</if>><</if>><</for>> <</for>> <<if _archetype&&_archetype.stats>> <<set _finalHpPerCon=Number(_hpPerCon[_rank])||5>> <<for _stat,_modifier range _archetype.stats>><<if _enemy[_stat]!==undefined>><<set _oldStat=_enemy[_stat]>><<set _enemy[_stat]=Math.max(0,Math.round(_enemy[_stat]*(100+Number(_modifier))/100))>><<if _stat=="constitution">><<set _enemy.hp_max+=(_enemy.constitution-_oldStat)*_finalHpPerCon>><</if>><</if>><</for>> <</if>> <<set _enemy.hp_max=Math.max(1,Math.round(_enemy.hp_max))>><<set _enemy.hp=_enemy.hp_max>> <<set _enemy.mp_max=Math.max(0,Math.round(20+(5*_enemy.level)+(5*(_enemy.wisdom-5))))>><<set _enemy.mp=_enemy.mp_max>> <<set _enemy.physicalAttack=Math.round(_rankPower+_enemy.strength)>><<set _enemy.physicalDefense=Math.round(_rankPower+_enemy.constitution)>><<set _enemy.magicAttack=Math.round(_rankPower+_enemy.intelligence)>><<set _enemy.magicDefense=Math.round(_rankPower+_enemy.wisdom)>><<set _enemy.effectiveDexterity=Math.round(_rankPower+_enemy.dexterity)>> <<if _template.loot>><<for _itemId,_drop range _template.loot>><<set _chance=Math.max(0,Math.min(100,Number(_drop.chance||0)))>><<if random(1,100)<=_chance>><<set _min=Math.max(1,Math.floor(Number(_drop.min)||1))>><<set _max=Math.max(_min,Math.floor(Number(_drop.max)||_min))>><<set _quantity=random(_min,_max)>><<set _lootType=String(_drop.type||"catalog")>><<set _lootId=_lootType=="money"?"money":String(_drop.id||_itemId)>><<set _lootLevel=Math.max(1,Math.min(21,Math.floor(Number(_drop.level)||1)))>><<set _lootRarity=String(_drop.rarity||"common").toLowerCase()>><<set _found=$itemDrops.find(function(item){return item&&item.type==_lootType&&item.id==_lootId&&Number(item.level||1)==_lootLevel&&String(item.rarity||"common")==_lootRarity})>><<if _found>><<set _found.quantity=Math.max(0,Number(_found.quantity||0))+_quantity>><<else>><<run $itemDrops.push({id:_lootId,type:_lootType,level:_lootLevel,rarity:_lootRarity,quantity:_quantity})>><</if>><</if>><</for>><</if>> <<run $enemies.push(_enemy)>> <<else>><<run console.error("Unknown monster:",_monsterId)>><</if>> <</for>> <</nobr>><</widget>> ------------------------------------------------------------- <<widget "generateenemies2">><<nobr>><<set _monsterId=_args[0]>><<set _level=Math.max(1,Math.floor(Number(_args[1])||1))>><<set _quantity=Math.max(1,Math.min(6,Math.floor(Number(_args[2])||1)))>><<set _enemyList=[]>><<for _i=0;_i<_quantity;_i++>><<run _enemyList.push(_monsterId,_level)>><</for>><<generateenemies _enemyList>><</nobr>><</widget>> ------------------------------------------------------------- <<widget "battlehp">><<nobr>><<set _current=Math.max(0,Math.round(Number(_args[0])||0))>><<set _max=Math.max(1,Math.round(Number(_args[1])||1))>><<set _showNumbers=_args[2]===true>><<set _percent=Math.max(0,Math.min(100,Math.round(_current/_max*100)))>><div class="ui-progress battle-resource battle-hp"><div class="ui-progress-fill" @style="'width:'+_percent+'%'"></div><div class="ui-progress-text"><<if _showNumbers>>HP <<=_current>> / <<=_max>><<else>>HP<</if>></div></div><</nobr>><</widget>> ------------------------------------------------------------- <<widget "battlemp">><<nobr>><<set _current=Math.max(0,Math.round(Number(_args[0])||0))>><<set _max=Math.max(1,Math.round(Number(_args[1])||1))>><<set _percent=Math.max(0,Math.min(100,Math.round(_current/_max*100)))>><div class="ui-progress battle-resource battle-mp"><div class="ui-progress-fill" @style="'width:'+_percent+'%'"></div><div class="ui-progress-text">MP <<=_current>> / <<=_max>></div></div><</nobr>><</widget>> ------------------------------------------------------------- <<widget "enemyturns">><<nobr>> <<set _playerRank=String($playerStats.rank||setup.getRank($playerStats.level)).toUpperCase()>><<set _playerRankPower=setup.getRankPower(_playerRank,$playerStats.level)>><<set _playerEffectiveDex=Math.max(0,Number($playerStats.dexterity)||0)+_playerRankPower>> <<for _enemy range $enemies>> <<if !_enemy.dead&&_enemy.hp>0&&$playerStats.hp>0>> <<set _attackName=_enemy.weapons&&_enemy.weapons.length?_enemy.weapons[random(0,_enemy.weapons.length-1)]:"hit">><<set _enemyRankPower=setup.getRankPower2(_enemy.rank,_enemy.level)>><<set _enemyEffectiveDex=Math.max(0,Number(_enemy.dexterity)||0)+_enemyRankPower>><<set _playerDodge=dodgeChance(_enemyEffectiveDex,_playerEffectiveDex)>> <<if random(1,100)<=_playerDodge>><<set $battleMessage+=" "+_enemy.name+" "+_attackName+" you, dodge.">> <<else>> <<if setup.getDamageType(_enemy.damageType)=="magic">><<set _fullEnemyAttack=Math.max(0,Number(_enemy.magicAttack)||0)>><<set _enemyDamage=damage(_fullEnemyAttack,$magicDefense)>> <<else>><<set _fullEnemyAttack=Math.max(0,Number(_enemy.physicalAttack)||0)>><<set _enemyDamage=damage(_fullEnemyAttack,$physicalDefense)>><</if>> <<run addEquippedArmorProficiencyXp(_fullEnemyAttack)>><<set $playerStats.hp=Math.max(0,$playerStats.hp-_enemyDamage)>><<set $battleMessage+=" "+_enemy.name+" "+_attackName+" you -"+_enemyDamage+" HP.">> <<if $playerStats.hp<=0>><<set $playerStats.hp=0>><<set $battleDefeat=true>><<set $battleMessage+=" You are defeated.">><</if>> <</if>> <</if>> <</for>> <<set $battleItemUsed=false>><<set $battleMenu="actions">> <</nobr>><</widget>> ------------------------------------------------------------- <<widget "battleview">><<nobr>> <<if $battleDefeat>><<goto "dead">><</if>> <<set _enemySlots=$enemies.length<=1?1:$enemies.length<=2?2:$enemies.length<=4?4:6>><<set _teamSlots=$team.length<=1?1:$team.length<=2?2:$team.length<=4?4:6>><<set _livingEnemies=$enemies.filter(function(enemy){return !enemy.dead&&enemy.hp>0})>> <<if _livingEnemies.length&&!_livingEnemies.some(function(enemy){return enemy.id==$battleTarget})>><<set $battleTarget=_livingEnemies[0].id>><</if>> <<if !_livingEnemies.length>><<set $battleTarget=null>><<set $battleVictory=true>><</if>> <<set _playerRank=String($playerStats.rank||"F").toUpperCase()>><<set _playerRankPower=setup.getRankPower(_playerRank,$playerStats.level)>><<set _playerEffectiveDex=Math.max(0,Number($playerStats.dexterity)||0)+_playerRankPower>> <<set _equippedWeapon=$weaponitems>><<set _playerDamageType=setup.getDamageType(_equippedWeapon&&_equippedWeapon.damageType)>><<set _weaponCategory=_equippedWeapon&&_equippedWeapon.category?String(_equippedWeapon.category).toLowerCase().trim():"">><<set _proficiencyKey=_weaponCategory?_weaponCategory+"_lvl":"">><<set _weaponProficiency=_proficiencyKey?Math.max(0,Math.floor(Number($playerStats[_proficiencyKey])||0)):0>><<set _hitBonus=Math.max(0,_weaponProficiency)>> <<set _enemyCombatData={}>> <<for _enemy range $enemies>> <<set _enemyRankPower=setup.getRankPower2(_enemy.rank,_enemy.level)>><<set _enemyEffectiveDex=Math.max(0,Number(_enemy.dexterity)||0)+_enemyRankPower>><<set _baseEnemyDodge=Math.max(0,Math.min(100,Math.round(Number(dodgeChance(_playerEffectiveDex,_enemyEffectiveDex))||0)))>><<set _enemyDodge=Math.max(0,Math.min(100,_baseEnemyDodge-_hitBonus))>><<set _playerDodge=Math.max(0,Math.min(100,Math.round(Number(dodgeChance(_enemyEffectiveDex,_playerEffectiveDex))||0)))>><<set _enemyKillXp=setup.getBattleKillXp($playerStats.level,_enemy.level)>> <<if _playerDamageType=="magic">><<set _expectedPlayerDamage=damage(Math.max(0,Number($magicAttack)||0),Math.max(0,Number(_enemy.magicDefense)||0))>><<else>><<set _expectedPlayerDamage=damage(Math.max(0,Number($physicalAttack)||0),Math.max(0,Number(_enemy.physicalDefense)||0))>><</if>> <<if setup.getDamageType(_enemy.damageType)=="magic">><<set _expectedEnemyDamage=damage(Math.max(0,Number(_enemy.magicAttack)||0),Math.max(0,Number($magicDefense)||0))>><<else>><<set _expectedEnemyDamage=damage(Math.max(0,Number(_enemy.physicalAttack)||0),Math.max(0,Number($physicalDefense)||0))>><</if>> <<run _enemyCombatData[_enemy.id]={rankPower:_enemyRankPower,effectiveDex:_enemyEffectiveDex,baseDodge:_baseEnemyDodge,dodge:_enemyDodge,playerDodge:_playerDodge,killXp:_enemyKillXp,expectedPlayerDamage:_expectedPlayerDamage,expectedEnemyDamage:_expectedEnemyDamage}>> <</for>> <div class="battle-window"> <div @class="'battle-side battle-enemies battle-grid-'+_enemySlots"> <<for _i=0;_i<_enemySlots;_i++>> <<if _i<$enemies.length>> <<set _unit=$enemies[_i]>><<capture _unit>><<set _selected=!_unit.dead&&_unit.id==$battleTarget>><<set _hpStage=setup.getBattleHpStage(_unit.hp,_unit.hp_max)>><<set _unitClass="battle-unit battle-enemy-unit"+(_selected?" battle-unit-selected":"")+(_unit.dead?" battle-unit-dead":"")>><<set _combat=_enemyCombatData[_unit.id]>> <div @class="_unitClass"> <div class="battle-unit-header"><<tooltipbox "normal">><span @class="'battle-unit-name rank-'+_unit.rank"><<=_unit.name>><<if _unit.archetype&&_unit.archetype!="normal">> [<<=($monsterArchetypes[_unit.archetype]&&$monsterArchetypes[_unit.archetype].name)||_unit.archetype>>]<</if>></span>----<div><b>Attributes</b></div><div>STR: <<=_unit.strength>> CON: <<=_unit.constitution>> DEX: <<=_unit.dexterity>> INT: <<=_unit.intelligence>> WIS: <<=_unit.wisdom>></div><div><b>Physical:</b> ⚔️ <<=_unit.physicalAttack>> 🛡️ <<=_unit.physicalDefense>></div><div><b>Magic:</b> ⚔️ <<=_unit.magicAttack>> 🛡️ <<=_unit.magicDefense>></div><div><b>Dodge:</b> <<=_combat.dodge>>%</div><</tooltipbox>><span class="battle-unit-level">Lv. <<=_unit.level>></span></div> <div class="battle-unit-portrait"><img @src="'resources/img/characters/'+(_unit.dead?'dead.jpg':_unit.image)"><<if !_unit.dead&&_hpStage>><div @class="'battle-damage-overlay battle-damage-'+_hpStage"></div><</if>><<if !_unit.dead&&!$battleVictory&&!$battleDefeat>><div class="battle-portrait-target"><<button "Select target">><<set $battleTarget=_unit.id>><<goto "fight">><</button>></div><</if>></div> <div class="battle-unit-resources"><<battlehp _unit.hp _unit.hp_max false>></div> </div><</capture>> <<else>><div class="battle-unit battle-unit-empty"></div><</if>> <</for>> </div> <div class="battle-divider"></div> <div @class="'battle-side battle-team battle-grid-'+_teamSlots"> <<for _i=0;_i<_teamSlots;_i++>> <<if _i<$team.length>> <<set _unit=$team[_i]>><<set _isPlayer=_unit.isPlayer===true>> <div class="battle-unit battle-team-unit"><div class="battle-unit-header"><span @class="'battle-unit-name rank-'+_unit.rank"><<=_unit.name>></span><span class="battle-unit-level">Lv. <<=_unit.level>></span></div><div class="battle-unit-portrait"><img @src="'resources/img/characters/'+_unit.image"></div><div class="battle-unit-resources"><<if _isPlayer>><<battlehp $playerStats.hp $playerStats.hp_max true>><<battlemp $playerStats.mp $playerStats.mp_max>><<else>><<battlehp _unit.hp _unit.hp_max false>><</if>></div></div> <<else>><div class="battle-unit battle-unit-empty"></div><</if>> <</for>> </div> </div> <<if $battleVictory>><<set $battleItemUsed=false>><<set $battleMenu="actions">><<battleloot>> <<elseif !$battleDefeat>> <<if $battleMenu=="items">><<battleitems>> <<else>> <div class="battle-actions"> <div class="battle-action-cell"><<button "Attack">> <<set _target=$enemies.find(function(enemy){return enemy.id==$battleTarget&&!enemy.dead&&enemy.hp>0})>> <<if _target>> <<set _targetCombat=_enemyCombatData[_target.id]>><<set _targetDodge=_targetCombat.dodge>><<set _targetDodged=_targetDodge>0&&random(1,100)<=_targetDodge>> <<if _targetDodged>><<set $battleMessage=_target.name+" dodges your attack.">> <<else>> <<if _playerDamageType=="magic">><<set _fullPlayerAttack=Math.max(0,Number($magicAttack)||0)>><<set _playerDamage=damage(_fullPlayerAttack,Math.max(0,Number(_target.magicDefense)||0))>><<else>><<set _fullPlayerAttack=Math.max(0,Number($physicalAttack)||0)>><<set _playerDamage=damage(_fullPlayerAttack,Math.max(0,Number(_target.physicalDefense)||0))>><</if>> <<run addEquippedWeaponProficiencyXp(_fullPlayerAttack)>><<set _target.hp=Math.max(0,_target.hp-_playerDamage)>><<set $battleMessage="You hit "+_target.name+" -"+_playerDamage+" HP.">> <<if _target.hp<=0>><<set _target.hp=0>><<set _target.dead=true>><<set _killXp=_targetCombat.killXp>><<set $playerStats.xp=Number($playerStats.xp||0)+_killXp>><<set $battleMessage+=" "+_target.name+" dies. +"+_killXp+" XP.">><<set _nextTarget=$enemies.find(function(enemy){return !enemy.dead&&enemy.hp>0})>><<set $battleTarget=_nextTarget?_nextTarget.id:null>><</if>> <</if>> <<set _livingAfterAttack=$enemies.filter(function(enemy){return !enemy.dead&&enemy.hp>0})>> <<if _livingAfterAttack.length>><<enemyturns>><<if $battleDefeat>><<goto "dead">><<else>><<goto "fight">><</if>><<else>><<set $battleVictory=true>><<goto "fight">><</if>> <<else>><<set $battleMessage="There is no living target.">><<goto "fight">><</if>> <</button>></div> <div class="battle-action-cell"><<button "Skills">><<set $battleMessage="Skills are not available yet.">><<goto "fight">><</button>></div> <div class="battle-action-cell"><<if $battleItemUsed>><span class="battle-action-disabled" title="You can use another potion after the enemy turn.">Items</span><<else>><<button "Items">><<set $battleMenu="items">><<goto "fight">><</button>><</if>></div> <div class="battle-action-cell"><<button "Flee">> <<set _fleeChance=Math.max(0,Math.min(100,Math.round(Number($ambush)||0)))>> <<if random(1,100)<=_fleeChance>><<set $battleFled=true>><<set $battleItemUsed=false>><<set $battleMenu="actions">><<set $battleMessage="You escaped.">><<set $menu=1>><<goto $rpas2>> <<else>><<set $battleMessage="Escape failed.">><<enemyturns>><<if $battleDefeat>><<goto "dead">><<else>><<goto "fight">><</if>><</if>> <</button>></div> </div> <</if>> <</if>> <div class="battle-message"><<if $battleVictory>>Victory!<<elseif $battleDefeat>>You were defeated.<<elseif $battleMessage>><<=$battleMessage>><<else>><<set _selectedEnemy=$enemies.find(function(enemy){return enemy.id==$battleTarget})>>Target: <<if _selectedEnemy>><<=_selectedEnemy.name>> #<<=_selectedEnemy.id>><<else>>none<</if>><</if>></div> <span class="debug"><div class="battle-debug"> <div class="battle-debug-title">Player debug statistics</div> <div class="battle-debug-row"><span>Lv. <<=$playerStats.level>></span><span>XP <<=$playerStats.xp>></span><span>Rank <<=_playerRank>></span><span>Rank power <<=_playerRankPower>></span><span>HP <<=$playerStats.hp>> / <<=$playerStats.hp_max>></span><span>MP <<=$playerStats.mp>> / <<=$playerStats.mp_max>></span><span>STR <<=$playerStats.strength>></span><span>CON <<=$playerStats.constitution>></span><span>DEX <<=$playerStats.dexterity>></span><span>Effective DEX <<=_playerEffectiveDex>></span><span>INT <<=$playerStats.intelligence>></span><span>WIS <<=$playerStats.wisdom>></span><span>CHA <<=$playerStats.charisma>></span><span>Physical ATK <<=$physicalAttack>></span><span>Physical DEF <<=$physicalDefense>></span><span>Magic ATK <<=$magicAttack>></span><span>Magic DEF <<=$magicDefense>></span><span>Weapon <<if _equippedWeapon>><<=_equippedWeapon.name||"equipped weapon">><<else>>none<</if>></span><span>Category <<=_weaponCategory||"none">></span><span>Damage type <<=_playerDamageType>></span><span>Proficiency <<=_weaponProficiency>></span><span>Hit bonus +<<=_hitBonus>>%</span></div> <div class="battle-debug-title">Enemy debug statistics</div> <<for _enemy range $enemies>><<set _combat=_enemyCombatData[_enemy.id]>><div class="battle-debug-row"><span>#<<=_enemy.id>> <<=_enemy.name>></span><span>Lv. <<=_enemy.level>></span><span>Kill XP <<=_combat.killXp>></span><span>Rank <<=_enemy.rank>></span><span>Rank power <<=_combat.rankPower>></span><span>Target <<=_enemy.id==$battleTarget?"YES":"NO">></span><span>Dead <<= _enemy.dead?"YES":"NO">></span><span>Archetype <<=_enemy.archetype>></span><span>Damage type <<=_enemy.damageType>></span><span>HP <<=_enemy.hp>> / <<=_enemy.hp_max>></span><span>MP <<=_enemy.mp>> / <<=_enemy.mp_max>></span><span>STR <<=_enemy.strength>></span><span>CON <<=_enemy.constitution>></span><span>DEX <<=_enemy.dexterity>></span><span>Effective DEX <<=_combat.effectiveDex>></span><span>INT <<=_enemy.intelligence>></span><span>WIS <<=_enemy.wisdom>></span><span>CHA <<=_enemy.charisma>></span><span>Physical ATK <<=_enemy.physicalAttack>></span><span>Physical DEF <<=_enemy.physicalDefense>></span><span>Magic ATK <<=_enemy.magicAttack>></span><span>Magic DEF <<=_enemy.magicDefense>></span><span>Weapons <<if Array.isArray(_enemy.weapons)&&_enemy.weapons.length>><<=_enemy.weapons.join(", ")>><<else>>none<</if>></span><span>Base dodge <<=_combat.baseDodge>>%</span><span>Proficiency reduction -<<=_hitBonus>>%</span><span>Enemy dodge <<=_combat.dodge>>%</span><span>Player dodge <<=_combat.playerDodge>>%</span><span>Player damage <<=_combat.expectedPlayerDamage>></span><span>Enemy damage <<=_combat.expectedEnemyDamage>></span></div><</for>> </div></span> <</nobr>><</widget>> ------------------------------------------------------------- <<widget "battleloot">><<nobr>><div class="battle-loot"><div class="battle-loot-title">Loot</div><<if Array.isArray($itemDrops)&&$itemDrops.length>><div class="battle-loot-list"><<for _battleLootIndex=0;_battleLootIndex<$itemDrops.length;_battleLootIndex++>><<set _battleLootDrop=$itemDrops[_battleLootIndex]>><<if _battleLootDrop&&Number(_battleLootDrop.quantity||0)>0>><<set _battleLootType=String(_battleLootDrop.type||"catalog")>><<set _battleLootId=String(_battleLootDrop.id||"")>><<set _battleLootLevel=Math.max(1,Math.min(21,Math.floor(Number(_battleLootDrop.level)||1)))>><<set _battleLootRarity=String(_battleLootDrop.rarity||"common").toLowerCase()>><<set _battleLootCatalogType="item">><<set _battleLootTemplate=null>><<if _battleLootType=="weaponGenerator"||_battleLootType=="weaponCatalog"||_battleLootType=="weapon">><<set _battleLootCatalogType="weapon">><<set _battleLootTemplate=$weaponCatalog[_battleLootId]>><<elseif _battleLootType=="armorGenerator"||_battleLootType=="armourGenerator"||_battleLootType=="armorCatalog"||_battleLootType=="armor"||_battleLootType=="armour">><<set _battleLootCatalogType="armor">><<set _battleLootTemplate=$armorCatalog[_battleLootId]>><<elseif _battleLootType=="auto">><<set _battleLootCatalogType="auto">><<set _battleLootTemplate=$weaponCatalog[_battleLootId]||$armorCatalog[_battleLootId]||$itemCatalog[_battleLootId]>><<elseif _battleLootType!="money">><<set _battleLootTemplate=$itemCatalog[_battleLootId]>><</if>><<set _battleLootName=_battleLootType=="money"?"Money":(_battleLootTemplate&&_battleLootTemplate.name?_battleLootTemplate.name:_battleLootId)>><<set _battleLootButtonLabel=_battleLootType=="money"?"Take":"Take 1">><<capture _battleLootDrop _battleLootType _battleLootId _battleLootLevel _battleLootRarity _battleLootCatalogType _battleLootTemplate _battleLootName _battleLootButtonLabel>><div class="battle-loot-row"><div class="battle-loot-info"><span class="battle-loot-name"><<=_battleLootName>></span><span class="battle-loot-quantity"><<if _battleLootType=="money">><<currencytooltip _battleLootDrop.quantity>><<else>>Available: <<=Number(_battleLootDrop.quantity||0)>><</if>></span></div><div class="battle-loot-take"><<button _battleLootButtonLabel>><<if _battleLootType=="money">><<set _battleLootTakeAmount=Math.max(0,Math.floor(Number(_battleLootDrop.quantity||0)))>><<if _battleLootTakeAmount>0>><<set $playerMoney=Math.max(0,Number($playerMoney||0))+_battleLootTakeAmount>><<set _battleLootDrop.quantity=0>><</if>><<else>><<generateitem $items _battleLootCatalogType _battleLootId _battleLootLevel _battleLootRarity 1>><<if _generatedAmount>0>><<set _battleLootDrop.quantity=Math.max(0,Number(_battleLootDrop.quantity||0)-_generatedAmount)>><</if>><</if>><<set $itemDrops=$itemDrops.filter(function(item){return item&&Number(item.quantity||0)>0})>><<goto "fight">><</button>></div></div><</capture>><</if>><</for>></div><<else>><div class="battle-loot-empty">No items left.</div><</if>><div class="battle-loot-actions"><<if Array.isArray($itemDrops)&&$itemDrops.length>><<button "Take all">><<set _battleLootRemainingDrops=[]>><<for _battleLootAllDrop range $itemDrops>><<if _battleLootAllDrop&&Number(_battleLootAllDrop.quantity||0)>0>><<set _battleLootAllType=String(_battleLootAllDrop.type||"catalog")>><<set _battleLootAllId=String(_battleLootAllDrop.id||"")>><<set _battleLootAllQuantity=Math.max(0,Math.floor(Number(_battleLootAllDrop.quantity||0)))>><<set _battleLootAllLevel=Math.max(1,Math.min(21,Math.floor(Number(_battleLootAllDrop.level)||1)))>><<set _battleLootAllRarity=String(_battleLootAllDrop.rarity||"common").toLowerCase()>><<set _generatedAmount=0>><<if _battleLootAllType=="money">><<set $playerMoney=Math.max(0,Number($playerMoney||0))+_battleLootAllQuantity>><<set _battleLootAllDrop.quantity=0>><<elseif _battleLootAllType=="weaponGenerator"||_battleLootAllType=="weaponCatalog"||_battleLootAllType=="weapon">><<generateitem $items "weapon" _battleLootAllId _battleLootAllLevel _battleLootAllRarity _battleLootAllQuantity>><<set _battleLootAllDrop.quantity=Math.max(0,_battleLootAllQuantity-_generatedAmount)>><<elseif _battleLootAllType=="armorGenerator"||_battleLootAllType=="armourGenerator"||_battleLootAllType=="armorCatalog"||_battleLootAllType=="armor"||_battleLootAllType=="armour">><<generateitem $items "armor" _battleLootAllId _battleLootAllLevel _battleLootAllRarity _battleLootAllQuantity>><<set _battleLootAllDrop.quantity=Math.max(0,_battleLootAllQuantity-_generatedAmount)>><<elseif _battleLootAllType=="auto">><<generateitem $items "auto" _battleLootAllId _battleLootAllLevel _battleLootAllRarity _battleLootAllQuantity>><<set _battleLootAllDrop.quantity=Math.max(0,_battleLootAllQuantity-_generatedAmount)>><<else>><<generateitem $items "item" _battleLootAllId _battleLootAllLevel _battleLootAllRarity _battleLootAllQuantity>><<set _battleLootAllDrop.quantity=Math.max(0,_battleLootAllQuantity-_generatedAmount)>><</if>><<if Number(_battleLootAllDrop.quantity||0)>0>><<run _battleLootRemainingDrops.push(_battleLootAllDrop)>><</if>><</if>><</for>><<set $itemDrops=_battleLootRemainingDrops>><<if !$itemDrops.length>><<set $menu=1>><<set $battleItemUsed=false>><<set $battleMenu="actions">><<goto $rpas2>><<else>><<goto "fight">><</if>><</button>><</if>><<button "Exit">><<set $menu=1>><<set $battleItemUsed=false>><<set $battleMenu="actions">><<goto $rpas2>><</button>></div></div><</nobr>><</widget>> ------------------------------------------------------------- <<widget "monsterEncounter">><<set _chance=0>><<if $labyrinthstep-$labyrinthstep_last>=4>><<if $lppt>=10 and $lppt<=15>><<set _chance=25>><<elseif $lppt>=16 and $lppt<=20>><<set _chance=25>><<elseif $lppt>=21 and $lppt<=26>><<set _chance=0>><<elseif $lppt>=27 and $lppt<=28>><<set _chance=50>><<elseif $lppt>=29 and $lppt<=31>><<set _chance=40>><<elseif $lppt>=32 and $lppt<=33>><<set _chance=70>><<elseif $lppt>=34 and $lppt<=36>><<set _chance=60>><<elseif $lppt>=37 and $lppt<=48>><<set _chance=70>><<elseif $lppt>=49 and $lppt<=72>><<set _chance=25>><</if>><</if>><<set $monsterEncounter=random(1,100)<=_chance>>\<</widget>>
<<silent>><<set $start to 1>><<set $inlabyrinth to 1>><<set $rpas to "Labyrinth">><<set $bgdark to 0.0>><<set $transportAvailable=0>><<set $lppX to $labyrinthPositions[$labyrinthLevel].x>><<set $lppY to $labyrinthPositions[$labyrinthLevel].y>><<set $lppt to Math.abs($labyrinthMaps[$labyrinthLevel][$labyrinthPositions[$labyrinthLevel].y][$labyrinthPositions[$labyrinthLevel].x])>><<run setup.labyrinthPrepare()>> <<if $trap is $labyrinthstep>> <<set _trapDamage to Math.ceil($playerStats.hp_max*0.20)>> <<set _trapDamage to Math.min($playerStats.hp,_trapDamage)>> <<set $playerStats.hp to Math.max(0,$playerStats.hp-_trapDamage)>> <<set $trap to 0>> <<run window.showMessage("Trap activated! You lost "+_trapDamage+" HP.")>> <</if>> <</silent>>\ <<if Math.abs(Number($lppt)) is 24>><<button "Go down">><<labyrinthstairs "down">><</button>> <<elseif Math.abs(Number($lppt)) is 23 && $labyrinthLevel > 1>><<button "Go up">><<labyrinthstairs "up">><</button>><<elseif Math.abs(Number($lppt)) is 23 && $labyrinthLevel == 1>><<button "Exit town">><<set $inlabyrinth to 0>><<goto "valenford_town">><</button>><</if>>\ <<if !$lootSourceOpen>> <<monsterEncounter>>\ <<if $monsterEncounter>><<set _enemy to random(1, 11)>><<set $ambush to 100>>\ <<if _enemy is 1>>You see a rat. <<button "Fight">><<generateenemies "rat" $labyrinthLevel >><<goto "fight">><</button>> <<elseif _enemy is 2>>You see two rats. <<button "Fight">><<generateenemies2 "rat" $labyrinthLevel 2>><<goto "fight">><</button>> <<elseif _enemy is 3>>You see two rats. <<button "Fight">><<generateenemies2 "rat" $labyrinthLevel 2>><<goto "fight">><</button>> <<elseif _enemy is 4>>You see three rats. <<button "Fight">><<generateenemies2 "rat" $labyrinthLevel 3>><<goto "fight">><</button>> <<elseif _enemy is 5>><<if $labyrinthLevel < 3>>You see a group of rats. <<button "Fight">><<set _enemynumber to random(3, 6)>><<generateenemies2 "rat" $labyrinthLevel _enemynumber>><<goto "fight">><</button>><<elseif $labyrinthLevel < 5>>You see a group of goblins. <<button "Fight">><<set _enemynumber to random(3, 6)>><<generateenemies2 "goblin_normal" $labyrinthLevel _enemynumber>><<goto "fight">><</button>><<else>>You see a group of skeletons. <<button "Fight">><<set _enemynumber to random(3, 6)>><<generateenemies2 "skeleton_normal" $labyrinthLevel _enemynumber>><<goto "fight">><</button>> <</if>> <<elseif _enemy is 6>> You see two rats. <<button "Fight">><<generateenemies2 "rat2" $labyrinthLevel 2>><<goto "fight">><</button>> <<elseif _enemy is 7>>You see a rat. <<button "Fight">><<generateenemies "rat2" $labyrinthLevel >><<set $ambush to 100>><<goto "fight">><</button>> <<elseif _enemy is 8>><<generateenemies2 "rat" $labyrinthLevel 2>><<set $ambush to 50>><<goto "fight">> <<elseif _enemy is 9>><<if $labyrinthLevel < 5>><<generateenemies2 "rat" $labyrinthLevel 4>><<set $ambush to 50>><<goto "fight">><<else>><<generateenemies2 "dragon_lord" 100 1>><<goto "fight">><</if>> <<elseif _enemy is 10>><<set _enemynumber to random(4, 6)>><<generateenemies2 "rat" $labyrinthLevel _enemynumber>><<set $ambush to 50>><<goto "fight">> <<elseif _enemy is 11>><<set $trap to $labyrinthstep+1>><<nobr>><div id="trap-event"> You step onto a pressure plate.<br> You hear a quiet click beneath your feet.<br> <<tooltipbox>><<button "Try to disarm">> <<if random(1,100)<=70>> <<set $trap to 0>><<run window.showMessage("Trap successfully disarmed.")>> <<replace "#trap-event">>You carefully disable the trap mechanism.<</replace>> <<else>><<set _trapDamage to Math.ceil($playerStats.hp_max*0.10)>><<set _trapDamage to Math.min($playerStats.hp,_trapDamage)>><<set $playerStats.hp to Math.max(0,$playerStats.hp-_trapDamage)>><<set $trap to 0>><<run window.showMessage("Disarming failed! You lost "+_trapDamage+" HP.")>><<replace "#trap-event">> The mechanism suddenly activates and injures you.<<run UIBar.update()>> <</replace>><</if>> <</button>> ---- You have a 70% chance of success. <</tooltipbox>></div><</nobr>> <</if>><</if>><</if>>\ <<nobr>> <<if $lootSourceOpen>><<set $inlabyrinth to 0>> <<lootsource $lootSourceType>> <<else>> <<if $lppt is 16>><<button "Search the remains">> <<set $lootSourceType to "skeleton1">><<set $lootSourceOpen to true>><<goto "Labyrinth">><</button>> <<elseif $lppt is 17>><<button "Search the chest">><<set $lootSourceType to "chest_open1">><<set $lootSourceOpen to true>><<goto "Labyrinth">><</button>> <<elseif $lppt is 18>><<button "Search the chest">><<set $lootSourceType to "chest_destroyed1">><<set $lootSourceOpen to true>><<goto "Labyrinth">><</button>> <<elseif $lppt is 19>><<button "Search the chest">><<set $lootSourceType to "chest1">><<set $lootSourceOpen to true>><<goto "Labyrinth">><</button>> <<elseif $lppt is 20>><<button "Search the box">><<set $lootSourceType to "box1">><<set $lootSourceOpen to true>><<goto "Labyrinth">><</button>> <<elseif $lppt is 25 or $lppt is 26>><<if $labyrinthLevel>1>><<set $labyrinthTeleportLevel=$labyrinthLevel>><<set $labyrinthTeleportX=$lppX>><<set $labyrinthTeleportY=$lppY>><div class="labyrinth-teleport-info">Teleport activated for level <<=$labyrinthTeleportLevel>>.</div><<button "Return to level 1">><<set $labyrinthLevel=1>><<set $labyrinthPositions[1]={x:2,y:5}>><<goto "Labyrinth">><<goto "Labyrinth">><</button>><<elseif Number($labyrinthTeleportLevel||0)>1>> <div class="labyrinth-teleport-info">This teleport leads to level <<=$labyrinthTeleportLevel>>.</div><<button "Teleport to level "+$labyrinthTeleportLevel>><<set $labyrinthLevel=$labyrinthTeleportLevel>><<set $labyrinthPositions[$labyrinthTeleportLevel]={x:$labyrinthTeleportX,y:$labyrinthTeleportY}>><<goto "Labyrinth">><</button>><<else>><div class="labyrinth-teleport-info">You must activate a teleport on a lower level before this teleport can be used.</div><</if>> <<elseif $lppt is 29>><<button "Search the warehouse">><<set $lootSourceType to "warehouse1">><<set $lootSourceOpen to true>><<goto "Labyrinth">><</button>> <<elseif $lppt is 30>><<button "Search the warehouse">><<set $lootSourceType to "warehouse1">><<set $lootSourceOpen to true>><<goto "Labyrinth">><</button>> <<elseif $lppt is 31>><<button "Search the warehouse">><<set $lootSourceType to "warehouse_destroyed1">><<set $lootSourceOpen to true>><<goto "Labyrinth">><</button>> <</if>> <</if>> <<set _nextLevel=$labyrinthLevel+1>> <<if !$labyrinthMaps[_nextLevel]&&setup.labyrinthMapCatalog[_nextLevel]>> <<set $labyrinthMaps[_nextLevel]=clone(setup.labyrinthMapCatalog[_nextLevel])>> <</if>> <</nobr>>
<<nobr>><<set $gamebg="inventory.jpg">><<set $bgdark=0.75>><<set $inlabyrinth=0>> <<if !$transportId||!$transportCatalog[$transportId]>> <div class="inventory-empty-slot">No transport.</div> <<else>> <<set _transport=$transportCatalog[$transportId]>> <<if !$transportName>><<set $transportName=$animalsName.random()>><</if>> <div class="ui-row ui-row-between ui-row-center ui-card-nav"> <<link '<img src="resources/img/journal.jpg" class="card-nav-icon"> Journal'>><<goto "journal">><</link>> <<link '<img src="resources/img/equipment.jpg" class="card-nav-icon"> Inventory'>><<goto "inventory">><</link>> <<link 'Character <img src="resources/img/character.jpg" class="card-nav-icon">'>><<goto "character">><</link>> </div> <div class="transport-header"> <div class="transport-image-panel"><img @src="'resources/img/characters/'+_transport.image" class="transport-image"></div> <div class="transport-info-panel"> <h2><<link $transportName>><<set $transportRenameInput=$transportName>><<run $("#transport-name-overlay").removeClass("hidden")>><</link>></h2> <p><strong>Player Weight:</strong> <<=$playerWeight.toFixed(1)>> / <<=$playerWeightMax.toFixed(1)>> kg</p> <p><strong>Transport Weight:</strong> <<=$transportWeight.toFixed(1)>> / <<=$transportWeightMax.toFixed(1)>> kg</p> <p><strong>Travel Supplies needed:</strong> <<=Number(_transport.travelCost||6)>></p><<button "Exit">><<goto $rpas>><</button>> </div> </div> <div id="transport-name-overlay" class="portrait-overlay hidden" onclick="$('#transport-name-overlay').addClass('hidden')"> <div class="transport-name-window" onclick="event.stopPropagation()"> <h2>Rename</h2> <<textbox "$transportRenameInput" $transportName>> <div class="ui-row ui-row-between"> <<link "Save">><<set _newName=String($transportRenameInput||"").trim()>><<if _newName>><<set $transportName=_newName>><</if>><<goto "transport">><</link>> <<link "Cancel">><<run $("#transport-name-overlay").addClass("hidden")>><</link>> </div> </div> </div> <<set _allItems=[]>> <<for _sourceArray range [$items,$transportItems]>> <<for _sourceItem range _sourceArray>> <<set _alreadyListed=false>> <<for _listedItem range _allItems>> <<isitemsequal _listedItem _sourceItem>> <<if _isSame>><<set _alreadyListed=true>><<break>><</if>> <</for>> <<if !_alreadyListed>><<run _allItems.push(clone(_sourceItem))>><</if>> <</for>> <</for>> <<if _allItems.length>0>> <<set _groups={}>> <<for _item range _allItems>> <<set _type=_item.type=="armour"?"armor":_item.type>> <<if _type=="helmet"||_type=="boots"||_type=="shield">><<set _type="armor">><</if>> <<if !_groups[_type]>><<set _groups[_type]=[]>><</if>> <<run _groups[_type].push(_item)>> <</for>> <<set _armorTypeOrder={helmet:0,armor:1,armour:1,boots:2,shield:3}>> <<set _armorCategoryOrder={armor_light:0,armor_medium:1,armor_heavy:2}>> <<if _groups.armor>><<run _groups.armor.sort(function(a,b){var typeA=Object.prototype.hasOwnProperty.call(_armorTypeOrder,a.type)?_armorTypeOrder[a.type]:99;var typeB=Object.prototype.hasOwnProperty.call(_armorTypeOrder,b.type)?_armorTypeOrder[b.type]:99;if(typeA!==typeB){return typeA-typeB;}var categoryA=Object.prototype.hasOwnProperty.call(_armorCategoryOrder,a.category)?_armorCategoryOrder[a.category]:99;var categoryB=Object.prototype.hasOwnProperty.call(_armorCategoryOrder,b.category)?_armorCategoryOrder[b.category]:99;if(categoryA!==categoryB){return categoryA-categoryB;}var levelA=Number(a.level||1),levelB=Number(b.level||1);if(levelA!==levelB){return levelA-levelB;}var rarityA=Number(a.rarity||1),rarityB=Number(b.rarity||1);if(rarityA!==rarityB){return rarityA-rarityB;}return String(a.name||"").localeCompare(String(b.name||""));})>><</if>> <<set _weaponCategoryOrder={sword:0,blunt:1,axe:2,bow:3,crossbow:4,fire:5,ice:6,lightning:7}>> <<if _groups.weapon>><<run _groups.weapon.sort(function(a,b){var categoryA=Object.prototype.hasOwnProperty.call(_weaponCategoryOrder,a.category)?_weaponCategoryOrder[a.category]:99;var categoryB=Object.prototype.hasOwnProperty.call(_weaponCategoryOrder,b.category)?_weaponCategoryOrder[b.category]:99;if(categoryA!==categoryB){return categoryA-categoryB;}var levelA=Number(a.level||1),levelB=Number(b.level||1);if(levelA!==levelB){return levelA-levelB;}var rarityA=Number(a.rarity||1),rarityB=Number(b.rarity||1);if(rarityA!==rarityB){return rarityA-rarityB;}return String(a.name||"").localeCompare(String(b.name||""));})>><</if>> <<set _typeOrder=["armor","weapon","food","parts","ore","quest","transport"]>> <<for _type range _typeOrder>> <<if _groups[_type]&&_groups[_type].length>0>> <<if _type=="armor">><h2 class="inventory-section-title">🛡️ Armor</h2> <<elseif _type=="weapon">><h2 class="inventory-section-title">⚔️ Weapons</h2> <<elseif _type=="food">><h2 class="inventory-section-title">🍎 Food</h2> <<elseif _type=="parts">><h2 class="inventory-section-title">🔧 Parts</h2> <<elseif _type=="ore">><h2 class="inventory-section-title">⛏️ Ores and Resources</h2> <<elseif _type=="quest">><h2 class="inventory-section-title">📜 Quest</h2> <<elseif _type=="transport">><h2 class="inventory-section-title">📦 Transport Goods</h2> <</if>> <<if _type=="food"||_type=="ore"||_type=="parts"||_type=="quest"||_type=="transport">> <table class="inventory-table transport-table"> <thead><tr><th class="inventory-col-icon"></th><th>Name</th><th class="inventory-col-weight">⚖️</th><th class="inventory-col-value">Value</th><th class="inventory-col-quantity transport-player-cell">Qty</th><th class="inventory-col-action">Transfer</th><th class="inventory-col-quantity transport-storage-cell">Qty</th></tr></thead> <tbody> <<for _item range _groups[_type]>> <<capture _item>> <<set _playerQty=0>><<set _transportQty=0>> <<for _playerItem range $items>> <<isitemsequal _playerItem _item>> <<if _isSame>><<set _playerQty=Math.max(0,Number(_playerItem.quantity||1))>><<break>><</if>> <</for>> <<for _storedItem range $transportItems>> <<isitemsequal _storedItem _item>> <<if _isSame>><<set _transportQty=Math.max(0,Number(_storedItem.quantity||1))>><<break>><</if>> <</for>> <<set _itemWeight=Math.max(0,Number(_item.weight||0))>> <<canfititem $items _item 1 $transportWeight $transportWeightMax false "transfer" 0>> <<set _canMoveRight=_canFitItem>> <<canfititem $transportItems _item 1 $playerWeight $playerWeightMax true "transfer" 0>> <<set _canMoveLeft=_canFitItem>> <tr> <td class="inventory-col-icon"><<itemicon _item.image _item.rarity>></td> <td><strong><<=_item.name>></strong></td> <td class="inventory-col-weight"><<tooltipbox>><<=_item.weight||0>>----Single item: <<=_item.weight||0>><br>Player stack: <<=(_itemWeight*_playerQty).toFixed(1)>><br>Transport stack: <<=(_itemWeight*_transportQty).toFixed(1)>><</tooltipbox>></td> <td class="inventory-col-value"><<if _item.value!=null>><<currencytooltip _item.value true>><<else>>-<</if>></td> <td class="inventory-col-quantity transport-player-cell"><strong><<=_playerQty>></strong></td> <td class="inventory-col-action transport-controls"> <<capture _item _transportQty _playerQty _canMoveLeft _canMoveRight>> <<if _canMoveLeft>> <<link "←">><<transferitem $transportItems $items _item _transportMoveQty $playerWeight $playerWeightMax true>><<goto "transport">><</link>> <<else>><span class="inventory-empty-slot">←</span><</if>> <<numberbox "_transportMoveQty" 1>> <<if _canMoveRight>> <<link "→">><<transferitem $items $transportItems _item _transportMoveQty $transportWeight $transportWeightMax false>><<goto "transport">><</link>> <<else>><span class="inventory-empty-slot">→</span><</if>> <</capture>> </td> <td class="inventory-col-quantity transport-storage-cell"><strong><<=_transportQty>></strong></td> </tr> <</capture>> <</for>> </tbody> </table> <<else>> <table class="inventory-table inventory-table-compact transport-table"> <thead><tr><th class="inventory-col-icon"></th><th>Name</th><th class="inventory-col-power"><<if _type=="weapon">>⚔️<<else>>🛡️<</if>></th><th class="inventory-col-weight">⚖️</th><th class="inventory-col-value">Value</th><th class="inventory-col-details"></th><th>Attribute</th><th class="inventory-col-quantity transport-player-cell">Qty</th><th class="inventory-col-action">Transfer</th><th class="inventory-col-quantity transport-storage-cell">Qty</th></tr></thead> <tbody> <<for _item range _groups[_type]>> <<capture _item>> <<set _playerQty=0>><<set _transportQty=0>> <<for _playerItem range $items>> <<isitemsequal _playerItem _item>> <<if _isSame>><<set _playerQty=Math.max(0,Number(_playerItem.quantity||1))>><<break>><</if>> <</for>> <<for _storedItem range $transportItems>> <<isitemsequal _storedItem _item>> <<if _isSame>><<set _transportQty=Math.max(0,Number(_storedItem.quantity||1))>><<break>><</if>> <</for>> <<set _itemWeight=Math.max(0,Number(_item.weight||0))>> <<canfititem $items _item 1 $transportWeight $transportWeightMax false "transfer" 0>> <<set _canMoveRight=_canFitItem>> <<canfititem $transportItems _item 1 $playerWeight $playerWeightMax true "transfer" 0>> <<set _canMoveLeft=_canFitItem>> <tr> <td class="inventory-col-icon"><<itemicon _item.image _item.rarity>></td> <td><strong><<=_item.name>></strong></td> <td class="inventory-col-power"><<tooltipbox>><<=_item.power||0>>----<<if _item.type=="weapon">>Damage type: <strong><<if _item.damageType=="magic">><<=String(_item.category||"magic").replace(/_/g," ").replace(/\b\w/g,function(c){return c.toUpperCase();})>><<else>>Physical<</if>></strong><<else>>Armor class: <strong><<if _item.category=="armor_heavy">>Heavy<<elseif _item.category=="armor_medium">>Medium<<elseif _item.category=="armor_light">>Light<<else>>-<</if>></strong><</if>><</tooltipbox>></td> <td class="inventory-col-weight"><<tooltipbox>><<=_item.weight||0>>----Single item: <<=_item.weight||0>><br>Player stack: <<=(_itemWeight*_playerQty).toFixed(1)>><br>Transport stack: <<=(_itemWeight*_transportQty).toFixed(1)>><</tooltipbox>></td> <td class="inventory-col-value"><<if _item.value!=null>><<currencytooltip _item.value true>><<else>>-<</if>></td> <td class="inventory-col-details"><<tooltipbox>><<if _item.type=="weapon">><strong><<if Number(_item.slot||1)==2||_item.slot=="2h">>2h<<else>>1h<</if>></strong><<else>><strong><<if _item.category=="armor_heavy">>Heavy<<elseif _item.category=="armor_medium">>Medium<<elseif _item.category=="armor_light">>Light<<else>>-<</if>></strong><</if>> - level: <strong><<=_item.level||1>></strong>----Material: <strong><<=String(_item.material||"-").replace(/_/g," ").replace(/\b\w/g,function(c){return c.toUpperCase();})>></strong><br>Rarity: <strong><<=_item.rarityName||"-">></strong><</tooltipbox>></td> <td><<attributetooltip _item>></td> <td class="inventory-col-quantity transport-player-cell"><strong><<=_playerQty>></strong></td> <td class="inventory-col-action transport-controls"> <<capture _item _transportQty _playerQty _canMoveLeft _canMoveRight>> <<if _canMoveLeft>> <<link "←">><<transferitem $transportItems $items _item _transportMoveQty $playerWeight $playerWeightMax true>><<goto "transport">><</link>> <<else>><span class="inventory-empty-slot">←</span><</if>> <<numberbox "_transportMoveQty" 1>> <<if _canMoveRight>> <<link "→">><<transferitem $items $transportItems _item _transportMoveQty $transportWeight $transportWeightMax false>><<goto "transport">><</link>> <<else>><span class="inventory-empty-slot">→</span><</if>> <</capture>> </td> <td class="inventory-col-quantity transport-storage-cell"><strong><<=_transportQty>></strong></td> </tr> <</capture>> <</for>> </tbody> </table> <</if>> <</if>> <</for>> <div class="inventory-summary"><strong>Player Weight:</strong> <<=$playerWeight.toFixed(1)>> / <<=$playerWeightMax.toFixed(1)>> kg | <strong>Transport Weight:</strong> <<=$transportWeight.toFixed(1)>> / <<=$transportWeightMax.toFixed(1)>> kg</div> <<else>> <div class="inventory-empty-slot">Player inventory and transport are empty.</div> <</if>> <</if>> <</nobr>>
<<nobr>><<if $rpas!="trade">><<set $rpas2=$rpas>><</if>><<set $rpas="trade">> <<set $gamebg="inventory.jpg">><<set $bgdark=0.75>><<set $inlabyrinth=0>> <<set $itemLevel=Math.max(1,Math.min(21,Math.floor(Number($playerStats.level||1)/5)+1))>> <<set _merchant=$merchants&&$merchants[$merchantId]?$merchants[$merchantId]:null>> <<if !_merchant>> <div class="trade-empty">Merchant not found: <<=$merchantId>></div> <<else>> <<merchantrefresh _merchant $itemLevel>> <div class="trade-header"> <div class="trade-image-panel"><img @src="'resources/img/characters/'+_merchant.image+'.jpg'" class="trade-image"></div> <div class="trade-info-panel"> <h2><<=_merchant.title>></h2> <p><strong>Your money:</strong> <<currencytooltip $playerMoney>></p> <p><strong>Your weight:</strong> <<=$playerWeight.toFixed(1)>> / <<=$playerWeightMax.toFixed(1)>> kg</p> <<button "Exit">><<goto $rpas2>><</button>> </div> </div> <<if $tradeMessage>><div class="trade-message"><<=$tradeMessage>></div><<set $tradeMessage="">><</if>> <div class="trade-section"> <h2 class="trade-section-title trade-buy-title"><span>Buy</span><span>Merchant Stock</span></h2> <<if !Array.isArray(_merchant.items)||!_merchant.items.length>> <div class="trade-empty">The merchant has no items for sale.</div> <<else>> <table class="inventory-table inventory-table-compact trade-table"> <thead><tr><th class="inventory-col-icon"></th><th>Name</th><th class="inventory-col-power">Power</th><th class="inventory-col-weight">⚖️</th><th class="inventory-col-value">Buy Price</th><th class="inventory-col-details"></th><th>Attribute</th><th class="inventory-col-quantity trade-merchant-cell">Merchant</th><th class="inventory-col-quantity trade-player-cell">You</th><th class="inventory-col-action">Buy</th></tr></thead> <tbody> <<for _tradeBuyIndex=0;_tradeBuyIndex<_merchant.items.length;_tradeBuyIndex++>> <<set _tradeBuyItem=_merchant.items[_tradeBuyIndex]>> <<tradeitemkey _tradeBuyItem>> <<set _tradeBuyKey=_tradeItemKey>> <<set _tradeBuyVariable="$tradeBuyQty['"+_tradeBuyKey+"']">> <<capture _tradeBuyItem _tradeBuyIndex _tradeBuyKey _tradeBuyVariable _merchant>> <<tradeplayerquantity _tradeBuyItem>> <<set _tradeBuyPlayerQty=_tradePlayerQty>> <<set _tradeBuyMerchantQty=Math.max(0,Number(_tradeBuyItem.quantity||1))>> <<merchantprice _tradeBuyItem "buy">> <<set _tradeBuyPrice=_tradePrice>> <<if !Number.isFinite(Number($tradeBuyQty[_tradeBuyKey]))||Number($tradeBuyQty[_tradeBuyKey])<1>><<set $tradeBuyQty[_tradeBuyKey]=1>><</if>> <tr> <td class="inventory-col-icon"><<itemicon _tradeBuyItem.image _tradeBuyItem.rarity>></td> <td><strong><<=_tradeBuyItem.name>></strong></td> <td class="inventory-col-power"><<if _tradeBuyItem.type=="weapon">><<tooltipbox>><<=_tradeBuyItem.power||0>>----Damage type: <strong><<if _tradeBuyItem.damageType=="magic">><<=String(_tradeBuyItem.category||"magic").replace(/_/g," ").replace(/\b\w/g,function(c){return c.toUpperCase();})>><<else>>Physical<</if>></strong><</tooltipbox>><<elseif _tradeBuyItem.type=="helmet"||_tradeBuyItem.type=="armor"||_tradeBuyItem.type=="armour"||_tradeBuyItem.type=="boots"||_tradeBuyItem.type=="shield">><<tooltipbox>><<=_tradeBuyItem.power||0>>----Armor class: <strong><<=String(_tradeBuyItem.category||"-").replace("armor_","").replace(/\b\w/g,function(c){return c.toUpperCase();})>></strong><</tooltipbox>><<else>>-<</if>></td> <td class="inventory-col-weight"><<=_tradeBuyItem.weight||0>></td> <td class="inventory-col-value trade-price"><<currencytooltip _tradeBuyPrice true>></td> <td class="inventory-col-details"><<if _tradeBuyItem.type=="weapon"||_tradeBuyItem.type=="helmet"||_tradeBuyItem.type=="armor"||_tradeBuyItem.type=="armour"||_tradeBuyItem.type=="boots"||_tradeBuyItem.type=="shield">><<tooltipbox>><strong>Level <<=_tradeBuyItem.level||1>></strong>----Material: <strong><<=String(_tradeBuyItem.material||"-").replace(/_/g," ").replace(/\b\w/g,function(c){return c.toUpperCase();})>></strong><br>Rarity: <strong><<=_tradeBuyItem.rarityName||"-">></strong><</tooltipbox>><<else>>-<</if>></td> <td><<if _tradeBuyItem.type=="weapon"||_tradeBuyItem.type=="helmet"||_tradeBuyItem.type=="armor"||_tradeBuyItem.type=="armour"||_tradeBuyItem.type=="boots"||_tradeBuyItem.type=="shield">><<attributetooltip _tradeBuyItem>><<else>>-<</if>></td> <td class="inventory-col-quantity trade-merchant-cell"><strong><<=_tradeBuyMerchantQty>></strong></td> <td class="inventory-col-quantity trade-player-cell"><<if _tradeBuyPlayerQty>0>><strong><<=_tradeBuyPlayerQty>></strong><<else>><span class="inventory-empty-slot">-</span><</if>></td> <td class="inventory-col-action trade-controls"><<numberbox `_tradeBuyVariable` 1>><<link "Buy">><<tradeitem _merchant _tradeBuyItem $tradeBuyQty[_tradeBuyKey] "buy">><<goto "trade">><</link>></td> </tr> <</capture>> <</for>> </tbody> </table> <</if>> </div> <div class="trade-section"> <h2 class="trade-section-title trade-sell-title"><span>Sell</span><span>Your Inventory</span></h2> <<set _tradeSellItems=[]>> <<if Array.isArray($items)>><<for _tradeSellSource range $items>><<tradeitemaccepted _merchant _tradeSellSource>><<if _tradeAccepted>><<run _tradeSellItems.push(_tradeSellSource)>><</if>><</for>><</if>> <<if !_tradeSellItems.length>> <div class="trade-empty">You have no items this merchant wants to buy.</div> <<else>> <table class="inventory-table inventory-table-compact trade-table"> <thead><tr><th class="inventory-col-icon"></th><th>Name</th><th class="inventory-col-power">Power</th><th class="inventory-col-weight">⚖️</th><th class="inventory-col-value">Sell Price</th><th class="inventory-col-details"></th><th>Attribute</th><th class="inventory-col-quantity trade-player-cell">You</th><th class="inventory-col-action">Sell</th></tr></thead> <tbody> <<for _tradeSellIndex=0;_tradeSellIndex<_tradeSellItems.length;_tradeSellIndex++>> <<set _tradeSellItem=_tradeSellItems[_tradeSellIndex]>> <<tradeitemkey _tradeSellItem>> <<set _tradeSellKey=_tradeItemKey>> <<set _tradeSellVariable="$tradeSellQty['"+_tradeSellKey+"']">> <<capture _tradeSellItem _tradeSellIndex _tradeSellKey _tradeSellVariable _merchant>> <<set _tradeSellPlayerQty=Math.max(0,Number(_tradeSellItem.quantity||1))>> <<merchantprice _tradeSellItem "sell">> <<set _tradeSellPrice=_tradePrice>> <<if !Number.isFinite(Number($tradeSellQty[_tradeSellKey]))||Number($tradeSellQty[_tradeSellKey])<1>><<set $tradeSellQty[_tradeSellKey]=1>><</if>> <tr> <td class="inventory-col-icon"><<itemicon _tradeSellItem.image _tradeSellItem.rarity>></td> <td><strong><<=_tradeSellItem.name>></strong></td> <td class="inventory-col-power"><<if _tradeSellItem.type=="weapon">><<tooltipbox>><<=_tradeSellItem.power||0>>----Damage type: <strong><<if _tradeSellItem.damageType=="magic">><<=String(_tradeSellItem.category||"magic").replace(/_/g," ").replace(/\b\w/g,function(c){return c.toUpperCase();})>><<else>>Physical<</if>></strong><</tooltipbox>><<elseif _tradeSellItem.type=="helmet"||_tradeSellItem.type=="armor"||_tradeSellItem.type=="armour"||_tradeSellItem.type=="boots"||_tradeSellItem.type=="shield">><<tooltipbox>><<=_tradeSellItem.power||0>>----Armor class: <strong><<=String(_tradeSellItem.category||"-").replace("armor_","").replace(/\b\w/g,function(c){return c.toUpperCase();})>></strong><</tooltipbox>><<else>>-<</if>></td> <td class="inventory-col-weight"><<=_tradeSellItem.weight||0>></td> <td class="inventory-col-value trade-price"><<currencytooltip _tradeSellPrice true>></td> <td class="inventory-col-details"><<if _tradeSellItem.type=="weapon"||_tradeSellItem.type=="helmet"||_tradeSellItem.type=="armor"||_tradeSellItem.type=="armour"||_tradeSellItem.type=="boots"||_tradeSellItem.type=="shield">><<tooltipbox>><strong>Level <<=_tradeSellItem.level||1>></strong>----Material: <strong><<=String(_tradeSellItem.material||"-").replace(/_/g," ").replace(/\b\w/g,function(c){return c.toUpperCase();})>></strong><br>Rarity: <strong><<=_tradeSellItem.rarityName||"-">></strong><</tooltipbox>><<else>>-<</if>></td> <td><<if _tradeSellItem.type=="weapon"||_tradeSellItem.type=="helmet"||_tradeSellItem.type=="armor"||_tradeSellItem.type=="armour"||_tradeSellItem.type=="boots"||_tradeSellItem.type=="shield">><<attributetooltip _tradeSellItem>><<else>>-<</if>></td> <td class="inventory-col-quantity trade-player-cell"><strong><<=_tradeSellPlayerQty>></strong></td> <td class="inventory-col-action trade-controls"><<numberbox `_tradeSellVariable` 1>><<link "Sell">><<tradeitem _merchant _tradeSellItem $tradeSellQty[_tradeSellKey] "sell">><<goto "trade">><</link>></td> </tr> <</capture>> <</for>> </tbody> </table> <</if>> </div> <div class="trade-summary"><<button "Exit">><<goto $rpas2>><</button>><strong> Your money:</strong> <<currencytooltip $playerMoney>> | <strong>Your weight:</strong> <<=$playerWeight.toFixed(1)>> / <<=$playerWeightMax.toFixed(1)>> kg</div> <</if>> <</nobr>>
<<set setup.lootSourceCatalog to { chest_open1:{title:"Chest open",respawn:100,loot:{money:{type:"money",chance:20,min:10,max:300},potion_hp_tiny:{type:"catalog",chance:20,min:1,max:3},meat:{type:"catalog",chance:10,min:1,max:2}}}, chest_destroyed1:{title:"Chest destroyed",respawn:100,loot:{money:{type:"money",chance:30,min:5,max:150},potion_hp_tiny:{type:"catalog",chance:50,min:1,max:3},meat:{type:"catalog",chance:10,min:1,max:2}}}, chest1:{title:"Chest",respawn:100,loot:{money:{type:"money",chance:50,min:20,max:500},potion_hp_tiny:{type:"catalog",chance:50,min:1,max:3},meat:{type:"catalog",chance:10,min:1,max:2}}}, box1:{title:"Box",respawn:100,loot:{money:{type:"money",chance:20,min:1,max:100},potion_hp_tiny:{type:"catalog",chance:50,min:1,max:3},meat:{type:"catalog",chance:10,min:1,max:2}}}, skeleton1:{title:"Skeleton Remains",respawn:100,loot:{money:{type:"money",chance:40,min:1,max:200},potion_hp_tiny:{type:"catalog",chance:50,min:1,max:3}}}, warehouse1:{title:"Abandoned Warehouse",respawn:150,loot:{money:{type:"money",chance:50,min:50,max:600},potion_hp_tiny:{type:"catalog",chance:70,min:1,max:5},meat:{type:"catalog",chance:40,min:1,max:3}}}, warehouse_destroyed1:{title:"Destroyed Warehouse",respawn:150,loot:{money:{type:"money",chance:30,min:20,max:300},potion_hp_tiny:{type:"catalog",chance:70,min:1,max:5},meat:{type:"catalog",chance:40,min:1,max:3},weapon:{type:"weapon",id:"sword_iron",level:1, rarity:"common",chance:10}}} }>> <<set $itemCatalog={ meat:{name:"Meat",type:"food",category:"meat",image:"meat",weight:0.1,value:2,quantity:1}, vegetables:{name:"Vegetables",type:"food",category:"vegetables",image:"vegetables",weight:0.1,value:2,quantity:1}, travel_supplies:{name:"Travel Supplies",type:"food",category:"travelsupplies",image:"travelsupplies",weight:1,value:20,quantity:1}, potion_hp_tiny:{name:"Healing potion tiny",type:"food",category:"potion",image:"potion_hp_tiny",use:{hp:50},weight:0.1,value:100,quantity:1}, potion_hp_small:{name:"Healing potion small",type:"food",category:"potion",image:"potion_hp_small",use:{hp:150},weight:0.1,value:250,quantity:1,rarity: 1}, potion_hp_medium:{name:"Healing potion medium",type:"food",category:"potion",image:"potion_hp_medium",use:{hp:300},weight:0.1,value:700,quantity:1,rarity: 2}, potion_hp_big:{name:"Healing potion big",type:"food",category:"potion",image:"potion_hp_big",use:{hp:600},weight:0.1,value:2000,quantity:1,rarity: 3}, potion_hp_grand:{name:"Healing potion grand",type:"food",category:"potion",image:"potion_hp_grand",use:{hpPercent:50},weight:0.1,value:5000,quantity:1,rarity: 4}, potion_hp_epic:{name:"Healing potion epic",type:"food",category:"potion",image:"potion_hp_epic",use:{hpPercent:100},weight:0.1,value:15000,quantity:1,rarity: 5}, potion_reg_tiny:{name:"Regeneration potion tiny",type:"food",category:"potion",image:"potion_reg_tiny",use:{mp:50,hp:50},weight:0.1,value:220,quantity:1}, potion_reg_small:{name:"Regeneration potion small",type:"food",category:"potion",image:"potion_reg_small",use:{mp:150,hp:150},weight:0.1,value:550,quantity:1,rarity: 1}, potion_reg_medium:{name:"Regeneration potion medium",type:"food",category:"potion",image:"potion_reg_medium",use:{mp:300,hp:300},weight:0.1,value:1500,quantity:1,rarity: 2}, potion_reg_big:{name:"Regeneration potion big",type:"food",category:"potion",image:"potion_reg_big",use:{mp:600,hp:60},weight:0.1,value:4400,quantity:1,rarity: 3}, potion_reg_grand:{name:"Regeneration potion grand",type:"food",category:"potion",image:"potion_reg_grand",use:{mpPercent:50,hpPercent:50},weight:0.1,value:1200,quantity:1,rarity: 4}, potion_reg_epic:{name:"Regeneration potion epic",type:"food",category:"potion",image:"potion_reg_epic",use:{mpPercent:100,hpPercent:100},weight:0.1,value:35000,quantity:1,rarity: 5}, potion_mp_tiny:{name:"Mana potion tiny",type:"food",category:"potion",image:"potion_mp_tiny",use:{mp:50},weight:0.1,value:100,quantity:1}, potion_mp_small:{name:"Mana potion small",type:"food",category:"potion",image:"potion_mp_small",use:{mp:150},weight:0.1,value:250,quantity:1,rarity: 1}, potion_mp_medium:{name:"Mana potion medium",type:"food",category:"potion",image:"potion_mp_medium",use:{mp:300},weight:0.1,value:700,quantity:1,rarity: 2}, potion_mp_big:{name:"Mana potion big",type:"food",category:"potion",image:"potion_mp_big",use:{mp:600},weight:0.1,value:2000,quantity:1,rarity: 3}, potion_mp_grand:{name:"Mana potion grand",type:"food",category:"potion",image:"potion_mp_grand",use:{mpPercent:50},weight:0.1,value:5000,quantity:1,rarity: 4}, potion_mp_epic:{name:"Mana potion epic",type:"food",category:"potion",image:"potion_mp_epic",use:{mpPercent:100},weight:0.1,value:15000,quantity:1,rarity: 5}, rat_tail:{name:"Rat Tail",type:"parts",category:"animal_parts",image:"rat_tail",weight:0.1,value:4,quantity:1}, ear_goblin:{name:"Goblin ear",type:"parts",category:"animal_parts",image:"ear_goblin",weight:0.1,value:8,quantity:1}, wolf_claw:{name:"Wolf Claw",type:"parts",category:"animal_parts",image:"claw",weight:0.1,value:10,quantity:1}, monster_horn:{name:"Monster horn",type:"parts",category:"animal_parts",image:"horn",weight:0.1,value:20,quantity:1}, mana_crystal_tiny:{name:"Tiny mana crystal",type:"parts",category:"mana_crystal",image:"mana_crystal_tiny",weight:0.1,value:10,quantity:1}, mana_crystal_small:{name:"Small mana crystal",type:"parts",category:"mana_crystal",image:"mana_crystal_small",weight:0.1,value:100,quantity:1,rarity:1}, mana_crystal_medium:{name:"Medium mana crystal",type:"parts",category:"mana_crystal",image:"mana_crystal_small",weight:0.1,value:1000,quantity:1,rarity:2}, mana_crystal_big:{name:"Big mana crystal",type:"parts",category:"mana_crystal",image:"mana_crystal_small",weight:0.1,value:10000,quantity:1,rarity:3}, iron_ore:{name:"Iron Ore",type:"parts",category:"ore",image:"ore_iron",weight:0.1,value:10,material:"iron",quantity:1}, copper_ore:{name:"Copper Ore",type:"parts",category:"ore",image:"ore_copper",weight:0.1,value:10,material:"copper",quantity:1}, ancient_letter:{name: "Ancient letter", type: "quest", category: "quest", image: "ancient_letter", weight: 0.0, value: 0, quantity: 1}, medicalCargoQ:{name:"Medical Supplies",type:"transport",category:"quest",image:"medical_supplies",weight:90,value:0,quantity:1,playerCarry:false,droppable:false}, medicalCargo:{name:"Medical Supplies",type:"transport",category:"trade",image:"medical_supplies",weight:90,value:0,quantity:1} }>> <<set $weaponPower=[10,15,21,27,41,47,53,75,81,87,93,131,137,143,213,219,225,359,365,371,400]>> <<set $weaponMaterial={ wood:{name:"Wood",power:0.75,weight:0.7,value:0.85}, iron:{name:"Iron",power:1,weight:1,value:1}, steel:{name:"Steel",power:1.2,weight:0.9,value:2}, silver_steel:{name:"Silver steel",power:1.3,weight:1.2,value:10}, dwarven_steel:{name:"Dwarven steel",power:1.6,weight:1.6,value:15}, adamantite:{name:"Adamantite",power:1.9,weight:1.8,value:25}, mithril:{name:"Mithril",power:2.5,weight:0.3,value:30} }>> <<set $weaponAttribute={ normal:{name:"Normal",power:1,weight:1,value:1,chance:30}, new:{name:"New",power:1.05,weight:1,value:1.1,chance:10}, old:{name:"Old",power:0.95,weight:1,value:0.8,chance:10}, worn:{name:"Worn",power:0.9,weight:1,value:0.65,chance:9}, damaged:{name:"Damaged",power:0.75,weight:1,value:0.4,chance:6}, masterwork:{name:"Masterwork",power:1.2,weight:0.95,value:2.5,chance:3}, rusty:{name:"Rusty",power:0.8,weight:1.05,value:0.35,chance:7,materials:["iron","steel"]}, sharp:{name:"Sharp",power:1.1,weight:1,value:1.25,chance:15,categories:["dagger","sword","axe"]}, dull:{name:"Dull",power:0.9,weight:1,value:0.7,chance:7,categories:["dagger","sword","axe"]}, balanced:{name:"Balanced",power:1.05,weight:0.9,value:1.3,chance:15}, heavy:{name:"Heavy",power:1.1,weight:1.25,value:1.05,chance:7}, light:{name:"Light",power:0.95,weight:0.75,value:1.2,chance:15}, poor_quality:{name:"Poor quality",power:0.85,weight:1.05,value:0.5,chance:10} }>> <<set $weaponRarity={ common:{name:"Common",id:1,power:1,value:1,nameChance:0}, uncommon:{name:"Uncommon",id:2,power:1.2,value:2,nameChance:30}, rare:{name:"Rare",id:3,power:1.5,value:4,nameChance:50}, epic:{name:"Epic",id:4,power:1.8,value:6,nameChance:80}, legendary:{name:"Legendary",id:5,power:2.2,value:10,nameChance:100} }>> <<set $weaponName={ uncommon:[" of the Wanderer"," made by Kungo"," of the Hunter"," of the Guard"," of Resolve"], rare:[" of the Wolf"," forged by Kungo"," of the Veteran"," of the Iron Oath"," of the Fallen"], epic:[" of the Fallen King"," of Endless War"," of the Crimson Dawn"," of the Ancient Forge"," of the Storm"], legendary:[" of Valenford"," forged by the First Smith"," of the Last Hero"," of Eternal Victory"," of the Dragon Lord"] }>> <<set $weaponCatalog={ axe_iron:{name:"Iron axe",type:"weapon",slot:1,category:"axe",damageType:"physical",image:"axe_iron",material:"iron",power:100,weight:3,value:410,quantity:1}, axe_iron2:{name:"Iron axe",type:"weapon",slot:1,category:"axe",damageType:"physical",image:"axe_iron2",material:"iron",power:110,weight:4,value:510,quantity:1}, axe_steel:{name:"Steel axe",type:"weapon",slot:1,category:"axe",damageType:"physical",image:"axe_steel",material:"steel",power:100,weight:4,value:610,quantity:1}, axe_silver:{name:"Silver steel axe",type:"weapon",slot:1,category:"axe",damageType:"physical",image:"axe_silver",material:"silver_steel",power:100,weight:4,value:610,quantity:1}, axe_dwarven:{name:"Dwarven axe",type:"weapon",slot:1,category:"axe",damageType:"physical",image:"axe_dwarven",material:"dwarven_steel",power:100,weight:4,value:610,quantity:1}, axe_adamantite:{name:"Adamantite axe",type:"weapon",slot:1,category:"axe",damageType:"physical",image:"axe_adamantite",material:"adamantite",power:100,weight:4,value:610,quantity:1}, axe_mithril:{name:"Mithril axe",type:"weapon",slot:1,category:"axe",damageType:"physical",image:"axe_mithril",material:"mithril",power:100,weight:3,value:610,quantity:1}, axe_war_iron:{name:"Iron war axe",type:"weapon",slot:2,category:"axe",damageType:"physical",image:"axe_war_iron",material:"iron",power:115,weight:6,value:710,quantity:1}, axe_war_steel:{name:"Steel war axe",type:"weapon",slot:2,category:"axe",damageType:"physical",image:"axe_war_steel",material:"steel",power:120,weight:6,value:800,quantity:1}, axe_war_silver:{name:"Silver steel war axe",type:"weapon",slot:2,category:"axe",damageType:"physical",image:"axe_war_silver",material:"silver_steel",power:130,weight:6,value:900,quantity:1}, axe_war_dwarven:{name:"Dwarven war axe",type:"weapon",slot:2,category:"axe",damageType:"physical",image:"axe_war_dwarven",material:"dwarven_steel",power:130,weight:6,value:1000,quantity:1}, axe_war_adamantite:{name:"Adamantite war axe",type:"weapon",slot:2,category:"axe",damageType:"physical",image:"axe_war_adamantite",material:"adamantite",power:130,weight:6,value:1000,quantity:1}, axe_war_mithril:{name:"Mithril war axe",type:"weapon",slot:2,category:"axe",damageType:"physical",image:"axe_war_mithril",material:"mithril",power:130,weight:4,value:1000,quantity:1}, bowshort:{name:"Short bow",type:"weapon",slot:2,category:"bow",damageType:"physical",image:"bowshort",material:"wood",power:90,weight:1.5,value:380,quantity:1}, bow:{name:"Bow",type:"weapon",slot:2,category:"bow",damageType:"physical",image:"bow",material:"wood",power:100,weight:1.8,value:400,quantity:1}, bow2:{name:"Reinforced bow",type:"weapon",slot:2,category:"bow",damageType:"physical",image:"bow2",material:"wood",power:110,weight:2.0,value:460,quantity:1}, bowlong:{name:"Long bow",type:"weapon",slot:2,category:"bow",damageType:"physical",image:"bowlong",material:"wood",power:110,weight:2.2,value:420,quantity:1}, bowlong1:{name:"Great long bow",type:"weapon",slot:2,category:"bow",damageType:"physical",image:"bowlong1",material:"wood",power:120,weight:2.5,value:520,quantity:1}, bowlong2:{name:"Master long bow",type:"weapon",slot:2,category:"bow",damageType:"physical",image:"bowlong2",material:"wood",power:130,weight:2.8,value:620,quantity:1}, bow_silver:{name:"Silver steel bow",type:"weapon",slot:2,category:"bow",damageType:"physical",image:"bow_silver",material:"silver_steel",power:100,weight:2.2,value:720,quantity:1}, bow_dwarven:{name:"Dwarven bow",type:"weapon",slot:2,category:"bow",damageType:"physical",image:"bow_dwarven",material:"dwarven_steel",power:105,weight:2.2,value:820,quantity:1}, bow_adamantite:{name:"Adamantite bow",type:"weapon",slot:2,category:"bow",damageType:"physical",image:"bow_adamantite",material:"adamantite",power:100,weight:2.2,value:920,quantity:1}, crossbow_light:{name:"Light crossbow",type:"weapon",slot:2,category:"crossbow",damageType:"physical",image:"crossbow_light",material:"steel",power:105,weight:3.2,value:480,quantity:1}, crossbow_light1:{name:"Improved light crossbow",type:"weapon",slot:2,category:"crossbow",damageType:"physical",image:"crossbow_light1",material:"wood",power:115,weight:3.3,value:560,quantity:1}, crossbow_light2:{name:"Master light crossbow",type:"weapon",slot:2,category:"crossbow",damageType:"physical",image:"crossbow_light2",material:"wood",power:125,weight:3.4,value:660,quantity:1}, crossbow_heavy:{name:"Heavy crossbow",type:"weapon",slot:2,category:"crossbow",damageType:"physical",image:"crossbow_heavy",material:"steel",power:135,weight:5.5,value:560,quantity:1}, crossbow_heavy1:{name:"Improved heavy crossbow",type:"weapon",slot:2,category:"crossbow",damageType:"physical",image:"crossbow_heavy1",material:"wood",power:145,weight:5.7,value:660,quantity:1}, crossbow_heavy2:{name:"Master heavy crossbow",type:"weapon",slot:2,category:"crossbow",damageType:"physical",image:"crossbow_heavy2",material:"wood",power:155,weight:5.9,value:760,quantity:1}, crossbow_heavy_silver:{name:"Silver steel heavy crossbow",type:"weapon",slot:2,category:"crossbow",damageType:"physical",image:"crossbow_heavy_silver",material:"silver_steel",power:100,weight:5.4,value:860,quantity:1}, crossbow_heavy_dwarven:{name:"Dwarven heavy crossbow",type:"weapon",slot:2,category:"crossbow",damageType:"physical",image:"crossbow_heavy_dwarven",material:"dwarven_steel",power:100,weight:5.4,value:960,quantity:1}, crossbow_heavy_adamantite:{name:"Adamantite heavy crossbow",type:"weapon",slot:2,category:"crossbow",damageType:"physical",image:"crossbow_heavy_adamantite",material:"adamantite",power:100,weight:5.4,value:1060,quantity:1}, club_wood:{name:"Wooden club",type:"weapon",slot:1,category:"blunt",damageType:"physical",image:"club_wood",material:"wood",power:75,weight:2.4,value:320,quantity:1}, club_wood1:{name:"Reinforced wooden club",type:"weapon",slot:1,category:"blunt",damageType:"physical",image:"club_wood1",material:"wood",power:85,weight:2.6,value:380,quantity:1}, club_wood2:{name:"Spiked wooden club",type:"weapon",slot:1,category:"blunt",damageType:"physical",image:"club_wood2",material:"wood",power:95,weight:2.9,value:450,quantity:1}, mace_iron:{name:"Iron mace",type:"weapon",slot:1,category:"blunt",damageType:"physical",image:"mace_iron",material:"iron",power:105,weight:2.8,value:400,quantity:1}, warhammer_iron:{name:"Iron warhammer",type:"weapon",slot:1,category:"blunt",damageType:"physical",image:"warhammer_iron",material:"iron",power:100,weight:4.5,value:620,quantity:1}, warhammer_silver:{name:"Silver steel warhammer",type:"weapon",slot:1,category:"blunt",damageType:"physical",image:"warhammer_silver",material:"silver_steel",power:100,weight:4.5,value:760,quantity:1}, warhammer_dwarven:{name:"Dwarven warhammer",type:"weapon",slot:1,category:"blunt",damageType:"physical",image:"warhammer_dwarven",material:"dwarven_steel",power:100,weight:4.5,value:860,quantity:1}, warhammer_adamantite:{name:"Adamantite warhammer",type:"weapon",slot:1,category:"blunt",damageType:"physical",image:"warhammer_adamantite",material:"adamantite",power:100,weight:4.5,value:960,quantity:1}, warhammer2h_silver:{name:"Silver steel two-handed warhammer",type:"weapon",slot:2,category:"blunt",damageType:"physical",image:"warhammer2h_silver",material:"silver_steel",power:120,weight:7,value:1020,quantity:1}, warhammer2h_dwarven:{name:"Dwarven two-handed warhammer",type:"weapon",slot:2,category:"blunt",damageType:"physical",image:"warhammer2h_dwarven",material:"dwarven_steel",power:120,weight:7,value:1120,quantity:1}, warhammer2h_adamantite:{name:"Adamantite two-handed warhammer",type:"weapon",slot:2,category:"blunt",damageType:"physical",image:"warhammer2h_adamantite",material:"adamantite",power:120,weight:7,value:1220,quantity:1}, dagger_iron:{name:"Iron dagger",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"dagger_iron",material:"iron",power:70,weight:0.8,value:300,quantity:1}, swordshort_iron:{name:"Iron short sword",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"swordshort_iron",material:"iron",power:85,weight:1.5,value:380,quantity:1}, sword_iron:{name:"Iron sword",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"sword_iron",material:"iron",power:100,weight:2,value:460,quantity:1}, sword_mithril:{name:"Mithril sword",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"sword_mithril",material:"mithril",power:100,weight:2,value:460,quantity:1}, swordbroad_iron:{name:"Iron broad sword",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"swordbroad_iron",material:"iron",power:110,weight:2.8,value:510,quantity:1}, swordbroad_steel2:{name:"Steel broad sword",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"swordbroad_steel2",material:"steel",power:110,weight:2.8,value:510,quantity:1}, swordlong_iron:{name:"Iron long sword",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"swordlong_iron",material:"iron",power:115,weight:2.8,value:525,quantity:1}, swordlong_steel2:{name:"Steel long sword",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"swordlong_steel2",material:"steel",power:115,weight:2.8,value:525,quantity:1}, swordlong_silver:{name:"Silver steel long sword",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"swordlong_silver",material:"silver_steel",power:115,weight:2.8,value:525,quantity:1}, swordlong_dwarven:{name:"Dwarven long sword",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"swordlong_dwarven",material:"dwarven_steel",power:115,weight:2.8,value:525,quantity:1}, swordlong_adamantite:{name:"Adamantite long sword",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"swordlong_adamantite",material:"adamantite",power:115,weight:2.8,value:525,quantity:1}, swordlong_mithril:{name:"Mithril long sword",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"swordlong_mithril",material:"mithril",power:115,weight:2.8,value:525,quantity:1}, katana_steel:{name:"katana",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"katana_steel",material:"steel",power:125,weight:2.5,value:600,quantity:1}, katana_mithril:{name:"Mithril katana",type:"weapon",slot:1,category:"sword",damageType:"physical",image:"katana_mithril",material:"mithril",power:125,weight:2.5,value:600,quantity:1}, swordgreat_iron:{name:"Iron two-handed sword",type:"weapon",slot:2,category:"sword",damageType:"physical",image:"swordgreat_iron",material:"iron",power:140,weight:5.5,value:700,quantity:1}, swordgreat_steel:{name:"Steel two-handed sword",type:"weapon",slot:2,category:"sword",damageType:"physical",image:"swordgreat_steel",material:"steel",power:140,weight:5.5,value:700,quantity:1}, swordgreat_silver:{name:"Silver steel two-handed sword",type:"weapon",slot:2,category:"sword",damageType:"physical",image:"swordgreat_silver",material:"silver_steel",power:140,weight:5.5,value:700,quantity:1}, swordgreat_dwarven:{name:"Dwarven two-handed sword",type:"weapon",slot:2,category:"sword",damageType:"physical",image:"swordgreat_dwarven",material:"dwarven_steel",power:140,weight:5.5,value:700,quantity:1}, swordgreat_adamantite:{name:"Adamantite two-handed sword",type:"weapon",slot:2,category:"sword",damageType:"physical",image:"swordgreat_adamantite",material:"adamantite",power:140,weight:5.5,value:700,quantity:1}, staff_fire:{name:"Fire staff",type:"weapon",slot:2,category:"fire",damageType:"magic",image:"staff_fire",material:"wood",power:140,weight:4,value:400,quantity:1}, staff_fire2:{name:"Greater fire staff",type:"weapon",slot:2,category:"fire",damageType:"magic",image:"staff_fire2",material:"wood",power:140,weight:4,value:500,quantity:1}, staff_fire3:{name:"Staff of burning flames",type:"weapon",slot:2,category:"fire",damageType:"magic",image:"staff_fire3",material:"wood",power:150,weight:4,value:620,quantity:1}, staff_fire4:{name:"Staff of hell fire",type:"weapon",slot:2,category:"fire",damageType:"magic",image:"staff_fire4",material:"wood",power:160,weight:4,value:760,quantity:1}, staff_ice:{name:"Ice staff",type:"weapon",slot:2,category:"ice",damageType:"magic",image:"staff_ice",material:"wood",power:140,weight:4,value:400,quantity:1}, staff_ice2:{name:"Greater ice staff",type:"weapon",slot:2,category:"ice",damageType:"magic",image:"staff_ice2",material:"wood",power:140,weight:4,value:500,quantity:1}, staff_ice3:{name:"Staff of eternal frost",type:"weapon",slot:2,category:"ice",damageType:"magic",image:"staff_ice3",material:"wood",power:150,weight:4,value:620,quantity:1}, staff_ice4:{name:"Staff of absolute zero",type:"weapon",slot:2,category:"ice",damageType:"magic",image:"staff_ice4",material:"wood",power:160,weight:4,value:760,quantity:1}, staff_lightning:{name:"Lightning staff",type:"weapon",slot:2,category:"lightning",damageType:"magic",image:"staff_lightning",material:"wood",power:140,weight:4,value:400,quantity:1}, staff_lightning2:{name:"Greater lightning staff",type:"weapon",slot:2,category:"lightning",damageType:"magic",image:"staff_lightning2",material:"wood",power:140,weight:4,value:500,quantity:1}, staff_lightning3:{name:"Staff of thunder",type:"weapon",slot:2,category:"lightning",damageType:"magic",image:"staff_lightning3",material:"wood",power:150,weight:4,value:620,quantity:1}, staff_lightning4:{name:"Staff of the storm",type:"weapon",slot:2,category:"lightning",damageType:"magic",image:"staff_lightning4",material:"wood",power:160,weight:4,value:760,quantity:1}, wand_fire:{name:"Fire wand",type:"weapon",slot:1,category:"fire",damageType:"magic",image:"wand_fire",material:"wood",power:110,weight:1,value:520,quantity:1}, wand_fire2:{name:"Greater fire wand",type:"weapon",slot:1,category:"fire",damageType:"magic",image:"wand_fire2",material:"wood",power:120,weight:1,value:620,quantity:1}, wand_fire3:{name:"Wand of burning flames",type:"weapon",slot:1,category:"fire",damageType:"magic",image:"wand_fire3",material:"wood",power:130,weight:1,value:740,quantity:1}, wand_fire4:{name:"Wand of hell fire",type:"weapon",slot:1,category:"fire",damageType:"magic",image:"wand_fire4",material:"wood",power:140,weight:1,value:880,quantity:1}, wand_ice:{name:"Ice wand",type:"weapon",slot:1,category:"ice",damageType:"magic",image:"wand_ice",material:"wood",power:110,weight:1,value:520,quantity:1}, wand_ice2:{name:"Greater ice wand",type:"weapon",slot:1,category:"ice",damageType:"magic",image:"wand_ice2",material:"wood",power:120,weight:1,value:620,quantity:1}, wand_ice3:{name:"Wand of eternal frost",type:"weapon",slot:1,category:"ice",damageType:"magic",image:"wand_ice3",material:"wood",power:130,weight:1,value:740,quantity:1}, wand_ice4:{name:"Wand of absolute zero",type:"weapon",slot:1,category:"ice",damageType:"magic",image:"wand_ice4",material:"wood",power:140,weight:1,value:880,quantity:1}, wand_lightning:{name:"Lightning wand",type:"weapon",slot:1,category:"lightning",damageType:"magic",image:"wand_lightning",material:"wood",power:110,weight:1,value:520,quantity:1}, wand_lightning2:{name:"Greater lightning wand",type:"weapon",slot:1,category:"lightning",damageType:"magic",image:"wand_lightning2",material:"wood",power:120,weight:1,value:620,quantity:1}, wand_lightning3:{name:"Wand of thunder",type:"weapon",slot:1,category:"lightning",damageType:"magic",image:"wand_lightning3",material:"wood",power:130,weight:1,value:740,quantity:1}, wand_lightning4:{name:"Wand of the storm",type:"weapon",slot:1,category:"lightning",damageType:"magic",image:"wand_lightning4",material:"wood",power:140,weight:1,value:880,quantity:1} }>> <<set $armorCatalog={ shieldR_wood:{name:"Round wooden shield",type:"shield",category:"armor_light",image:"shieldR_wood",material:"wood",power:25,weight:3,value:400,quantity:1}, robe:{name:"Robe",type:"armor",category:"armor_light",image:"robe",material:"cloth",power:20,weight:2,value:500,quantity:1}, robe2:{name:"Reinforced robe",type:"armor",category:"armor_light",image:"robe2",material:"cloth",power:30,weight:2.5,value:600,quantity:1}, robe3:{name:"Greater robe",type:"armor",category:"armor_light",image:"robe3",material:"cloth",power:40,weight:3,value:700,quantity:1}, robe_mithril:{name:"Mithril robe",type:"armor",category:"armor_light",image:"robe_mithril",material:"mithril",power:50,weight:2,value:500,quantity:1}, tunic_fabric:{name:"Fabric tunic",type:"armor",category:"armor_light",image:"tunic_fabric",material:"cloth",power:40,weight:1.5,value:400,quantity:1}, tunic_leather:{name:"Leather tunic",type:"armor",category:"armor_light",image:"tunic_leather",material:"leather",power:45,weight:3,value:500,quantity:1}, tunic_leather2:{name:"Reinforced leather tunic",type:"armor",category:"armor_light",image:"tunic_leather2",material:"leather",power:50,weight:4,value:600,quantity:1}, gambeson:{name:"Gambeson",type:"armor",category:"armor_light",image:"gambeson",material:"cloth",power:40,weight:5,value:500,quantity:1}, gambeson2:{name:"Reinforced gambeson",type:"armor",category:"armor_light",image:"gambeson2",material:"cloth",power:50,weight:6,value:600,quantity:1}, hood_leather:{name:"Leather hood",type:"helmet",category:"armor_light",image:"hood_leather",material:"leather",power:20,weight:1,value:300,quantity:1}, hood_leather2:{name:"Reinforced leather hood",type:"helmet",category:"armor_light",image:"hood_leather2",material:"leather",power:25,weight:1,value:400,quantity:1}, boots_leather1:{name:"Leather boots",type:"boots",category:"armor_light",image:"boots_leather1",material:"leather",power:20,weight:1,value:400,quantity:1}, boots_leather2:{name:"Reinforced leather boots",type:"boots",category:"armor_light",image:"boots_leather2",material:"leather",power:25,weight:1.5,value:500,quantity:1}, shieldR_iron:{name:"Round iron shield",type:"shield",category:"armor_medium",image:"shieldR_iron",material:"iron",power:20,weight:4,value:400,quantity:1}, shieldR_steel1:{name:"Round steel shield",type:"shield",category:"armor_medium",image:"shieldR_steel1",material:"steel",power:20,weight:4,value:400,quantity:1}, shieldR_steel2:{name:"Reinforced round steel shield",type:"shield",category:"armor_medium",image:"shieldR_steel2",material:"steel",power:25,weight:5,value:500,quantity:1}, shieldR_silver:{name:"Round silver steel shield",type:"shield",category:"armor_medium",image:"shieldR_silver",material:"silver_steel",power:25,weight:4,value:400,quantity:1}, shieldR_dwarven:{name:"Round dwarven shield",type:"shield",category:"armor_medium",image:"shieldR_dwarven",material:"dwarven_steel",power:25,weight:4,value:400,quantity:1}, shieldR_adamantite:{name:"Round adamantite shield",type:"shield",category:"armor_medium",image:"shieldR_adamantite",material:"adamantite",power:25,weight:4,value:400,quantity:1}, shield_iron:{name:"Iron shield",type:"shield",category:"armor_medium",image:"shield_iron",material:"iron",power:22,weight:5,value:450,quantity:1}, hood_chainmail_iron:{name:"Iron chainmail hood",type:"helmet",category:"armor_medium",image:"hood_chainmail_iron",material:"iron",power:25,weight:2,value:300,quantity:1}, hood_chainmail_iron2:{name:"Reinforced iron chainmail hood",type:"helmet",category:"armor_medium",image:"hood_chainmail_iron2",material:"iron",power:35,weight:2.5,value:400,quantity:1}, hood_chainmail_mithril:{name:"Mithril chainmail hood",type:"helmet",category:"armor_medium",image:"hood_chainmail_mithril",material:"mithril",power:35,weight:2,value:300,quantity:1}, helm_iron1:{name:"Iron open helmet",type:"helmet",category:"armor_medium",image:"helm_iron1",material:"iron",power:25,weight:2.5,value:300,quantity:1}, helm_iron2:{name:"Iron helmet",type:"helmet",category:"armor_medium",image:"helm_iron2",material:"iron",power:25,weight:3,value:300,quantity:1}, helm_iron3:{name:"Reinforced iron helmet",type:"helmet",category:"armor_medium",image:"helm_iron3",material:"iron",power:25,weight:3.2,value:400,quantity:1}, helm_iron4:{name:"Iron nasal helmet",type:"helmet",category:"armor_medium",image:"helm_iron4",material:"iron",power:25,weight:3.5,value:500,quantity:1}, helm_silver:{name:"Silver steel helmet",type:"helmet",category:"armor_medium",image:"helm_silver",material:"silver_steel",power:35,weight:3.5,value:500,quantity:1}, helm_dwarven:{name:"Dwarven helmet",type:"helmet",category:"armor_medium",image:"helm_dwarven",material:"dwarven_steel",power:35,weight:3.5,value:500,quantity:1}, helm_adamantite:{name:"Adamantite helmet",type:"helmet",category:"armor_medium",image:"helm_adamantite",material:"adamantite",power:35,weight:3.5,value:500,quantity:1}, boots_iron1:{name:"Reinforced leather boots",type:"boots",category:"armor_medium",image:"boots_iron1",material:"leather",power:25,weight:1.5,value:400,quantity:1}, boots_iron2:{name:"Iron reinforced boots",type:"boots",category:"armor_heavy",image:"boots_iron2",material:"iron",power:35,weight:2.5,value:500,quantity:1}, brygantine_leather:{name:"Leather brigandine",type:"armor",category:"armor_medium",image:"brygantine_leather",material:"leather",power:50,weight:8,value:600,quantity:1}, brygantine_leather1:{name:"Reinforced leather brigandine",type:"armor",category:"armor_medium",image:"brygantine_leather1",material:"leather",power:60,weight:9,value:700,quantity:1}, brygantine_leather2:{name:"Heavy leather brigandine",type:"armor",category:"armor_medium",image:"brygantine_leather2",material:"leather",power:70,weight:10,value:800,quantity:1}, brygantine_silver:{name:"Silver steel brigandine",type:"armor",category:"armor_medium",image:"brygantine_silver",material:"silver_steel",power:70,weight:10,value:800,quantity:1}, brygantine_dwarven:{name:"Dwarven brigandine",type:"armor",category:"armor_medium",image:"brygantine_dwarven",material:"dwarven_steel",power:70,weight:10,value:800,quantity:1}, brygantine_adamantite:{name:"Adamantite brigandine",type:"armor",category:"armor_medium",image:"brygantine_adamantite",material:"adamantite",power:70,weight:10,value:800,quantity:1}, chainmail_iron:{name:"Iron chainmail",type:"armor",category:"armor_medium",image:"chainmail_iron",material:"iron",power:50,weight:10,value:600,quantity:1}, chainmail_steel:{name:"Steel chainmail",type:"armor",category:"armor_medium",image:"chainmail_steel",material:"steel",power:50,weight:10,value:600,quantity:1}, chainmail_steel2:{name:"Reinforced steel chainmail",type:"armor",category:"armor_medium",image:"chainmail_steel2",material:"steel",power:60,weight:11,value:700,quantity:1}, chainmail_silver:{name:"Silver steel chainmail",type:"armor",category:"armor_medium",image:"chainmail_silver",material:"silver_steel",power:60,weight:11,value:700,quantity:1}, chainmail_dwarven:{name:"Dwarven chainmail",type:"armor",category:"armor_medium",image:"chainmail_dwarven",material:"dwarven_steel",power:60,weight:11,value:700,quantity:1}, chainmail_adamantite:{name:"Adamantite chainmail",type:"armor",category:"armor_medium",image:"chainmail_adamantite",material:"adamantite",power:60,weight:11,value:700,quantity:1}, chainmail_mithril:{name:"Mithril chainmail",type:"armor",category:"armor_medium",image:"chainmail_mithril",material:"mithril",power:60,weight:11,value:700,quantity:1}, scale_armor_iron:{name:"Iron scale armor",type:"armor",category:"armor_medium",image:"scale_armor_iron",material:"iron",power:65,weight:11,value:700,quantity:1}, scale_armor_steel:{name:"Steel scale armor",type:"armor",category:"armor_medium",image:"scale_armor_steel",material:"steel",power:65,weight:11,value:700,quantity:1}, scale_armor_steel2:{name:"Reinforced steel scale armor",type:"armor",category:"armor_medium",image:"scale_armor_steel2",material:"steel",power:75,weight:12,value:800,quantity:1}, scale_armor_steel3:{name:"Heavy steel scale armor",type:"armor",category:"armor_medium",image:"scale_armor_steel3",material:"steel",power:85,weight:13,value:900,quantity:1}, scale_armor_silver:{name:"Silver steel scale armor",type:"armor",category:"armor_medium",image:"scale_armor_silver",material:"silver_steel",power:85,weight:13,value:900,quantity:1}, scale_armor_dwarven:{name:"Dwarven scale armor",type:"armor",category:"armor_medium",image:"scale_armor_dwarven",material:"dwarven_steel",power:85,weight:13,value:900,quantity:1}, scale_armor_adamantite:{name:"Adamantite scale armor",type:"armor",category:"armor_medium",image:"scale_armor_adamantite",material:"adamantite",power:85,weight:13,value:900,quantity:1}, scale_armor_mithril:{name:"Mithril scale armor",type:"armor",category:"armor_medium",image:"scale_armor_mithril",material:"mithril",power:85,weight:13,value:900,quantity:1}, shieldR_mithril:{name:"Round mithril shield",type:"shield",category:"armor_heavy",image:"shieldR_mithril",material:"mithril",power:25,weight:3,value:400,quantity:1}, shieldT_iron:{name:"Iron knight shield",type:"shield",category:"armor_heavy",image:"shieldT_iron",material:"iron",power:25,weight:6,value:400,quantity:1}, shieldT_iron1:{name:"Reinforced iron knight shield",type:"shield",category:"armor_heavy",image:"shieldT_iron1",material:"iron",power:26,weight:7,value:500,quantity:1}, shieldT_steel:{name:"Steel knight shield",type:"shield",category:"armor_heavy",image:"shieldT_steel",material:"steel",power:25,weight:6,value:400,quantity:1}, shieldT_steel1:{name:"Reinforced steel knight shield",type:"shield",category:"armor_heavy",image:"shieldT_steel1",material:"steel",power:26,weight:7,value:500,quantity:1}, shieldT_steel2:{name:"Heavy steel knight shield",type:"shield",category:"armor_heavy",image:"shieldT_steel2",material:"steel",power:27,weight:8,value:600,quantity:1}, shieldT_steel3:{name:"Elite steel knight shield",type:"shield",category:"armor_heavy",image:"shieldT_steel3",material:"steel",power:28,weight:9,value:700,quantity:1}, shieldT_silver:{name:"Silver steel knight shield",type:"shield",category:"armor_heavy",image:"shieldT_silver",material:"silver_steel",power:30,weight:9,value:700,quantity:1}, shieldT_dwarven:{name:"Dwarven knight shield",type:"shield",category:"armor_heavy",image:"shieldT_dwarven",material:"dwarven_steel",power:30,weight:9,value:700,quantity:1}, shieldT_adamantite:{name:"Adamantite knight shield",type:"shield",category:"armor_heavy",image:"shieldT_adamantite",material:"adamantite",power:30,weight:9,value:700,quantity:1}, shieldT_mithril:{name:"Mithril knight shield",type:"shield",category:"armor_heavy",image:"shieldT_mithril",material:"mithril",power:30,weight:9,value:700,quantity:1}, shieldT_mithril2:{name:"Reinforced mithril knight shield",type:"shield",category:"armor_heavy",image:"shieldT_mithril2",material:"mithril",power:30,weight:10,value:800,quantity:1}, shield_tower_iron:{name:"Iron tower shield",type:"shield",category:"armor_heavy",image:"shield_tower_iron",material:"iron",power:40,weight:9,value:700,quantity:1}, shield_tower_steel:{name:"Steel tower shield",type:"shield",category:"armor_heavy",image:"shield_tower_steel",material:"steel",power:40,weight:9,value:700,quantity:1}, shield_tower_steel2:{name:"Reinforced steel tower shield",type:"shield",category:"armor_heavy",image:"shield_tower_steel2",material:"steel",power:40,weight:10,value:800,quantity:1}, shield_tower_silver:{name:"Silver steel tower shield",type:"shield",category:"armor_heavy",image:"shield_tower_silver",material:"silver_steel",power:40,weight:10,value:800,quantity:1}, shield_tower_dwarven:{name:"Dwarven tower shield",type:"shield",category:"armor_heavy",image:"shield_tower_dwarven",material:"dwarven_steel",power:40,weight:10,value:800,quantity:1}, shield_tower_adamantite:{name:"Adamantite tower shield",type:"shield",category:"armor_heavy",image:"shield_tower_adamantite",material:"adamantite",power:40,weight:10,value:800,quantity:1}, shield_tower_mithril:{name:"Mithril tower shield",type:"shield",category:"armor_heavy",image:"shield_tower_mithril",material:"mithril",power:40,weight:10,value:800,quantity:1}, helm_iron5:{name:"Heavy iron helmet",type:"helmet",category:"armor_heavy",image:"helm_iron5",material:"iron",power:25,weight:4,value:300,quantity:1}, helm_steel1:{name:"Steel helmet",type:"helmet",category:"armor_heavy",image:"helm_steel1",material:"steel",power:25,weight:4,value:300,quantity:1}, helm_steel2:{name:"Reinforced steel helmet",type:"helmet",category:"armor_heavy",image:"helm_steel2",material:"steel",power:26,weight:4.5,value:400,quantity:1}, helm_steel3:{name:"Heavy steel helmet",type:"helmet",category:"armor_heavy",image:"helm_steel3",material:"steel",power:27,weight:5,value:500,quantity:1}, helm_silver2:{name:"Heavy silver steel helmet",type:"helmet",category:"armor_heavy",image:"helm_silver2",material:"silver_steel",power:30,weight:5,value:500,quantity:1}, helm_dwarven2:{name:"Heavy dwarven helmet",type:"helmet",category:"armor_heavy",image:"helm_dwarven2",material:"dwarven_steel",power:30,weight:5,value:500,quantity:1}, helm_adamantite2:{name:"Heavy adamantite helmet",type:"helmet",category:"armor_heavy",image:"helm_adamantite2",material:"adamantite",power:30,weight:5,value:500,quantity:1}, helm_mithril:{name:"Heavy mithril helmet",type:"helmet",category:"armor_heavy",image:"helm_mithril",material:"mithril",power:30,weight:5,value:500,quantity:1}, boots_steel1:{name:"Iron plate boots",type:"boots",category:"armor_heavy",image:"boots_steel1",material:"iron",power:25,weight:4,value:400,quantity:1}, boots_steel2:{name:"Steel plate boots",type:"boots",category:"armor_heavy",image:"boots_steel2",material:"steel",power:25,weight:4,value:400,quantity:1}, boots_steel3:{name:"Reinforced steel plate boots",type:"boots",category:"armor_heavy",image:"boots_steel3",material:"steel",power:26,weight:5,value:500,quantity:1}, boots_silver:{name:"Silver steel plate boots",type:"boots",category:"armor_heavy",image:"boots_silver",material:"silver_steel",power:30,weight:5,value:500,quantity:1}, boots_dwarven:{name:"Dwarven plate boots",type:"boots",category:"armor_heavy",image:"boots_dwarven",material:"dwarven_steel",power:30,weight:5,value:500,quantity:1}, boots_adamantite:{name:"Adamantite plate boots",type:"boots",category:"armor_heavy",image:"boots_adamantite",material:"adamantite",power:30,weight:5,value:500,quantity:1}, boots_mithril:{name:"Mithril plate boots",type:"boots",category:"armor_heavy",image:"boots_mithril",material:"mithril",power:30,weight:5,value:500,quantity:1}, breastplate_iron:{name:"Iron breastplate",type:"armor",category:"armor_heavy",image:"breastplate_iron",material:"iron",power:60,weight:12,value:600,quantity:1}, breastplate_steel:{name:"Steel breastplate",type:"armor",category:"armor_heavy",image:"breastplate_steel",material:"steel",power:60,weight:12,value:600,quantity:1}, breastplate_steel2:{name:"Reinforced steel breastplate",type:"armor",category:"armor_heavy",image:"breastplate_steel2",material:"steel",power:62,weight:13,value:700,quantity:1}, breastplate_silver:{name:"Silver steel breastplate",type:"armor",category:"armor_heavy",image:"breastplate_silver",material:"silver_steel",power:64,weight:13,value:700,quantity:1}, breastplate_dwarven:{name:"Dwarven breastplate",type:"armor",category:"armor_heavy",image:"breastplate_dwarven",material:"dwarven_steel",power:65,weight:13,value:700,quantity:1}, breastplate_adamantite:{name:"Adamantite breastplate",type:"armor",category:"armor_heavy",image:"breastplate_adamantite",material:"adamantite",power:65,weight:13,value:700,quantity:1}, breastplate_mithril:{name:"Mithril breastplate",type:"armor",category:"armor_heavy",image:"breastplate_mithril",material:"mithril",power:65,weight:13,value:700,quantity:1}, full_plate_iron:{name:"Full plate iron armor",type:"armor",category:"armor_heavy",image:"full_plate_iron",material:"iron",power:70,weight:14,value:600,quantity:1}, full_plate_steel:{name:"Full plate steel armor",type:"armor",category:"armor_heavy",image:"full_plate_steel",material:"steel",power:70,weight:14,value:600,quantity:1}, full_plate_steel2:{name:"Reinforced full plate steel armor",type:"armor",category:"armor_heavy",image:"full_plate_steel2",material:"steel",power:71,weight:15,value:700,quantity:1}, full_plate_silver:{name:"Full plate silver steel armor",type:"armor",category:"armor_heavy",image:"full_plate_silver",material:"silver_steel",power:70,weight:15,value:700,quantity:1}, full_plate_dwarven:{name:"Full plate dwarven armor",type:"armor",category:"armor_heavy",image:"full_plate_dwarven",material:"dwarven_steel",power:70,weight:15,value:700,quantity:1}, full_plate_adamantite:{name:"Full plate adamantite armor",type:"armor",category:"armor_heavy",image:"full_plate_adamantite",material:"adamantite",power:70,weight:15,value:700,quantity:1}, full_plate_mithril:{name:"Full plate mithril armor",type:"armor",category:"armor_heavy",image:"full_plate_mithril",material:"mithril",power:70,weight:15,value:700,quantity:1} }>> <<set $armorPower=[20,29,38,47,56,65,74,83,92,101,110,119,128,137,146,155,164,173,182,191,200]>> <<set $armorCategory={ armor_light:{name:"Light",power:0.8,weight:0.65,value:0.9}, armor_medium:{name:"Medium",power:1,weight:1,value:1}, armor_heavy:{name:"Heavy",power:1.25,weight:1.45,value:1.4} }>> <<set $armorMaterial={ cloth:{name:"Cloth",power:0.75,weight:0.65,value:0.7}, leather:{name:"Leather",power:0.85,weight:0.75,value:0.9}, wood:{name:"Wood",power:0.8,weight:0.8,value:0.8}, iron:{name:"Iron",power:1,weight:1,value:1}, steel:{name:"Steel",power:1.2,weight:0.9,value:2}, silver_steel:{name:"Silver steel",power:1.3,weight:0.7,value:10}, dwarven_steel:{name:"Dwarven steel",power:1.6,weight:1.6,value:15}, adamantite:{name:"Adamantite",power:1.9,weight:1.2,value:25}, mithril:{name:"Mithril",power:2.5,weight:0.3,value:30} }>> <<set $armorAttribute={ normal:{name:"Normal",power:1,weight:1,value:1,chance:45}, new:{name:"New",power:1.05,weight:1,value:1.25,chance:18}, old:{name:"Old",power:0.9,weight:1,value:0.65,chance:8}, worn:{name:"Worn",power:0.85,weight:1,value:0.5,chance:10}, damaged:{name:"Damaged",power:0.7,weight:1,value:0.3,chance:6}, masterwork:{name:"Masterwork",power:1.2,weight:0.9,value:2.5,chance:3}, rusty:{name:"Rusty",power:0.8,weight:1.05,value:0.35,chance:6,materials:["iron","steel"]}, reinforced:{name:"Reinforced",power:1.15,weight:1.15,value:1.4,chance:16}, light:{name:"Light",power:0.9,weight:0.75,value:1.15,chance:5}, heavy:{name:"Heavy",power:1.1,weight:1.25,value:1.1,chance:5}, comfortable:{name:"Comfortable",power:0.95,weight:0.85,value:1.2,chance:4,categories:["armor_light","armor_medium"]}, poor_quality:{name:"Poor Quality",power:0.75,weight:1.1,value:0.25,chance:4} }>> <<set $armorRarity={ common:{name:"Common",id:1,power:1,value:1,nameChance:0}, uncommon:{name:"Uncommon",id:2,power:1.2,value:2,nameChance:30}, rare:{name:"Rare",id:3,power:1.5,value:4,nameChance:50}, epic:{name:"Epic",id:4,power:1.8,value:6,nameChance:80}, legendary:{name:"Legendary",id:5,power:2.2,value:10,nameChance:100} }>> <<set $armorName={ uncommon:[" of the Guard"," of the Scout"," of the Watch"," of the Wanderer"," of Endurance"," of Protection"," of the Soldier"," of the Hunter"], rare:[" of the Iron Guard"," of the Silver Watch"," of the Lion"," of the Wolf"," of the Mountain"," of the Veteran"," of the Defender"," of Unbroken Resolve"], epic:[" of the Royal Guard"," of the Ancient Legion"," of the Dragon"," of the First Knight"," of the Unbroken Wall"," of the Eternal Watch"," of the Fallen Kingdom"," of the Immortal Guardian"], legendary:[" of the Last Bastion"," of the Eternal King"," of the Dragon Lord"," of the First Emperor"," of the Invincible Guardian"," of the Ancient Gods"," of the World Defender"," of the Undying Fortress"] }>> <<set setup.merchantTypes={blacksmith:{mode:"random",rollsMin:30,rollsMax:40,buyCategories:["sword","blunt","axe","ore"],levels:{1:["axe_iron","axe_war_iron","mace_iron","warhammer_iron","dagger_iron","swordshort_iron","sword_iron","swordgreat_iron","club_wood","iron_ore"],2:["axe_iron2","club_wood1"],3:["axe_steel","club_wood2","swordbroad_iron","swordgreat_steel"],4:["axe_war_steel","swordlong_iron"],5:["swordbroad_steel2"],6:["swordlong_steel2"],7:["axe_silver","axe_war_silver","warhammer2h_silver","warhammer_silver"],8:["swordlong_silver","swordgreat_silver"],10:["axe_dwarven","swordgreat_dwarven","swordlong_dwarven"],12:["warhammer2h_dwarven","axe_war_dwarven","warhammer_dwarven"],15:["axe_adamantite","axe_war_adamantite","warhammer2h_adamantite","swordlong_adamantite","swordgreat_adamantite","warhammer_adamantite"]}},fletcher:{mode:"random",rollsMin:15,rollsMax:20,buyCategories:["bow","crossbow"],levels:{1:["bowshort","bow","crossbow_light"],2:["bow2"],3:["bowlong","crossbow_light1"],4:["bowlong1","crossbow_light2"],5:["crossbow_heavy"],6:["bowlong2","crossbow_heavy1"],7:["bow_silver","crossbow_heavy2"],8:["crossbow_heavy_silver"],10:["bow_dwarven"],12:["crossbow_heavy_dwarven"],15:["bow_adamantite","crossbow_heavy_adamantite"]}},mage:{mode:"random",rollsMin:8,rollsMax:12,buyCategories:["ice","fire","lightning"],levels:{1:["staff_fire","staff_ice","staff_lightning","wand_lightning","wand_ice","wand_fire"],5:["staff_fire2","staff_ice2","staff_lightning2","wand_lightning2","wand_ice2","wand_fire2"],10:["staff_fire3","staff_ice3","staff_lightning3","wand_lightning3","wand_ice3","wand_fire3"],15:["staff_fire4","staff_ice4","staff_lightning4","wand_lightning4","wand_ice4","wand_fire4"]}},armorer:{mode:"random",rollsMin:30,rollsMax:40,buyCategories:["armor_light","armor_medium","armor_heavy"],levels:{1:["shieldR_wood","shieldR_iron","shield_iron","hood_chainmail_iron","helm_iron1","boots_iron1","brygantine_leather","chainmail_iron","shieldT_iron","helm_iron5","boots_iron2","breastplate_iron"],2:["shieldR_steel1","helm_iron2","scale_armor_iron","shieldT_iron1","shield_tower_iron","boots_steel1","breastplate_steel","full_plate_iron"],3:["shieldR_steel2","helm_iron3","brygantine_leather1","chainmail_steel","shieldT_steel","shield_tower_steel","helm_steel1","full_plate_steel"],4:["hood_chainmail_iron2","helm_iron4","scale_armor_steel","shieldT_steel1","shield_tower_steel2","helm_steel2","boots_steel2","full_plate_steel2"],5:["brygantine_leather2","chainmail_steel2","scale_armor_steel2","shieldT_steel2","helm_steel3","boots_steel3","breastplate_steel2"],6:["helm_silver","chainmail_silver","scale_armor_steel3","shieldT_steel3","boots_silver","breastplate_silver"],7:["shieldR_silver","brygantine_silver","scale_armor_silver","shieldT_silver","shield_tower_silver","helm_silver2","full_plate_silver"],8:["helm_dwarven","chainmail_dwarven","boots_dwarven","breastplate_dwarven"],10:["shieldR_dwarven","brygantine_dwarven","scale_armor_dwarven","shieldT_dwarven","shield_tower_dwarven","helm_dwarven2","full_plate_dwarven"],12:["helm_adamantite","chainmail_adamantite","boots_adamantite","breastplate_adamantite"],15:["shieldR_adamantite","brygantine_adamantite","scale_armor_adamantite","shieldT_adamantite","shield_tower_adamantite","helm_adamantite2","full_plate_adamantite"]}},tailor:{mode:"random",rollsMin:15,rollsMax:20,buyCategories:[],levels:{1:["robe","tunic_fabric","hood_leather","boots_leather1"],2:["tunic_leather"],3:["gambeson","hood_leather2"],4:["tunic_leather2"],5:["gambeson2","boots_leather2"],6:["robe2"],15:["robe3"]}},potion:{mode:"fixed",quantityMin:50,quantityMax:99,buyCategories:["potion"],levels:{1:["potion_hp_tiny","potion_reg_tiny","potion_mp_tiny"],3:["potion_hp_small","potion_reg_small","potion_mp_small"],5:["potion_hp_medium","potion_reg_medium","potion_mp_medium"],10:["potion_hp_big","potion_reg_big","potion_mp_big"],15:["potion_hp_grand","potion_reg_grand","potion_mp_grand"],17:["potion_hp_epic","potion_reg_epic","potion_mp_epic"]}},guild:{mode:"buyerOnly",buyCategories:["animal_parts","mana_crystal","armor_light","armor_medium","armor_heavy","ice","fire","lightning","bow","crossbow","sword","blunt","axe","ore","potion"],levels:{}},food:{mode:"fixed",quantityMin:50,quantityMax:99,buyCategories:["meat","vegetables","travelsupplies"],levels:{1:["meat","vegetables","travel_supplies"]}}}>> <<set setup.merchantRarityCatalog={1:{uncommon:0,rare:0,epic:0},4:{uncommon:5,rare:0,epic:0},5:{uncommon:6,rare:0,epic:0},6:{uncommon:7,rare:0,epic:0},7:{uncommon:8,rare:1,epic:0},8:{uncommon:9,rare:2,epic:0},10:{uncommon:10,rare:3,epic:0},12:{uncommon:11,rare:4,epic:1},15:{uncommon:15,rare:5,epic:2}}>>
<<set $monsters={ rat:{name:"Rat",image:"rat",growth:{strength:10,constitution:30,dexterity:60},type:["animal"],archetypes:{normal:50,fast:25,tough:10,agile:15},weapons:["bite","scratch"],damageType: "physical",loot:{money:{type:"money",chance:100,min:20,max:300},rat_tail:{chance:50,min:1,max:1},meat:{chance:10,min:1,max:1},mana_crystal_tiny:{chance:25,min:1,max:1}}}, rat2:{name:"Rat",image:"rat2",growth:{strength:40,constitution:30,dexterity:30},type:["animal"],archetypes:{normal:50,fast:25,tough:10,agile:15},weapons:["bite","scratch"],damageType: "physical",loot:{rat_tail:{chance:50,min:1,max:1},meat:{chance:10,min:1,max:1},mana_crystal_tiny:{chance:25,min:1,max:1}}}, goblin_normal:{name:"Goblin",image:"goblin_normal",growth:{strength:10,constitution:30,dexterity:60},type:["monster"],archetypes:{normal:50,fast:25,tough:10,agile:15},weapons:["slash","stab","cut"],damageType: "physical",loot:{ear_goblin:{chance:100,min:1,max:1},meat:{chance:10,min:1,max:1},vegetables:{chance:10,min:1,max:1},mana_crystal_tiny:{chance:25,min:1,max:1}}}, skeleton_normal:{name:"Skeleton",image:"skeleton_normal",growth:{strength:10,constitution:30,dexterity:60},type:["monster"],archetypes:{normal:50,fast:25,tough:10,agile:15},weapons:["slash","stab","cut"],damageType: "physical",loot:{mana_crystal_tiny:{chance:25,min:1,max:1}}}, dragon_lord:{name:"Dragon lord",image:"dragon_lord",growth:{strength:40,constitution:30,dexterity:30},type:["monster"],archetypes:{elite_200:100},weapons:["bit","scratched","hit"],damageType: "physical",loot:{mana_crystal_tiny:{chance:25,min:1,max:1}}}, dragon_lord2:{name:"Dragon lord",image:"dragon_lord",growth:{strength:40,constitution:30,dexterity:30},type:["monster"],archetypes:{},weapons:["bit","scratched","hit"],damageType: "physical",loot:{mana_crystal_tiny:{chance:25,min:1,max:1}}} }>> <<set $monsterArchetypes={ normal:{name:"Normal",stats:{}}, fast:{name:"Fast",stats:{dexterity:6,constitution:-6}}, tough:{name:"Tough",stats:{constitution:6,dexterity:-6}}, agile:{name:"Agile",stats:{dexterity:8,strength:-4,constitution:-4}}, elite_200:{name:"Elite",stats:{dexterity:200,strength:200,constitution:200}} }>> <<set $animalsName=["Amber","Ash","Bella","Bruno","Chestnut","Clover","Daisy","Ember","Freya","Ginger","Hazel","Jasper","Luna","Maple","Maximus","Molly","Oak","Raven","Rosie","Rusty","Shadow","Storm","Willow"]>> <<set $transportCatalog={ horse1:{name:"Brown Horse",capacity:100,travelCost:1,image:"horse_brown.jpg",value:3000}, wagon1:{name:"Open Wagon",capacity:800,travelCost:3,image:"horse_wagon.jpg",value:10000}, wagon2:{name:"Covered Wagon",capacity:1500,travelCost:3,image:"horse_wagon1.jpg",value:20000}, wagon3:{name:"Stagecoach",capacity:600,travelCost:1,image:"horse_wagon2.jpg",value:30000} }>> <<set $transportId="">><<set $transportName="">><<set $transportItems=[]>><<set $transportAvailable=0>><<set $playerWeight=0>><<set $playerWeightMax=0>><<set $transportWeight=0>><<set $transportWeightMax=0>>
<<widget "lootsource">><<nobr>><<set _sourceType=String(_args[0]||"")>><<set _definition=setup.lootSourceCatalog[_sourceType]>><<set _position=$labyrinthPositions[$labyrinthLevel]>><<if !_definition>><<run console.error("Unknown loot source:",_sourceType)>><<elseif !_position>><<run console.error("No labyrinth position for level:",$labyrinthLevel)>><<else>><<if !$labyrinthLootSources>><<set $labyrinthLootSources={}>><</if>><<set _sourceId=$labyrinthLevel+":"+_position.x+":"+_position.y>><<set _source=$labyrinthLootSources[_sourceId]>><<if !_source>><<set _source={id:_sourceId,type:_sourceType,level:$labyrinthLevel,x:_position.x,y:_position.y,loot:[],refillAt:0,generated:false}>><<run $labyrinthLootSources[_sourceId]=_source>><</if>><<if !Array.isArray(_source.loot)>><<set _source.loot=[]>><</if>><<set _canGenerate=!_source.generated>><<if _source.generated&&_source.loot.length==0&&Number(_definition.respawn||0)>0&&Number(_source.refillAt||0)>0&&$labyrinthStep>=_source.refillAt>><<set _canGenerate=true>><</if>><<if _canGenerate>><<set _source.loot=[]>><<set _source.refillAt=0>><<for _itemId,_drop range _definition.loot>><<set _chance=Math.max(0,Math.min(100,Number(_drop.chance||0)))>><<if random(1,100)<=_chance>><<set _lootType=String(_drop.type||"catalog")>><<set _min=Math.max(1,Math.floor(Number(_drop.min)||1))>><<set _max=Math.max(_min,Math.floor(Number(_drop.max)||_min))>><<set _quantity=random(_min,_max)>><<set _lootId=String(_drop.id||_itemId)>><<set _lootLevel=Math.max(1,Math.min(21,Math.floor(Number(_drop.level)||1)))>><<set _lootRarity=String(_drop.rarity||"common").toLowerCase()>><<if _lootType=="money">><<set _moneyEntry=null>><<for _storedLoot range _source.loot>><<if _storedLoot&&_storedLoot.type=="money">><<set _moneyEntry=_storedLoot>><<break>><</if>><</for>><<if _moneyEntry>><<set _moneyEntry.quantity=Math.max(0,Number(_moneyEntry.quantity||0))+_quantity>><<else>><<run _source.loot.push({type:"money",name:"Money",quantity:_quantity})>><</if>><<elseif _lootType=="catalog"||_lootType=="item">><<generateitem _source.loot "item" _lootId _lootLevel _lootRarity _quantity>><<elseif _lootType=="weaponGenerator"||_lootType=="weapon">><<generateitem _source.loot "weapon" _lootId _lootLevel _lootRarity _quantity>><<elseif _lootType=="armorGenerator"||_lootType=="armourGenerator"||_lootType=="armor"||_lootType=="armour">><<generateitem _source.loot "armor" _lootId _lootLevel _lootRarity _quantity>><<elseif _lootType=="auto">><<generateitem _source.loot "auto" _lootId _lootLevel _lootRarity _quantity>><<else>><<run console.error("Unknown loot type:",_lootType,_lootId)>><</if>><</if>><</for>><<set _source.generated=true>><<if _source.loot.length==0&&Number(_definition.respawn||0)>0>><<set _source.refillAt=$labyrinthStep+Number(_definition.respawn)>><</if>><</if>><div class="battle-loot"><div class="battle-loot-title"><<=_definition.title>></div><<if _source.loot.length>><div class="battle-loot-list"><<for _lootItem range _source.loot>><<capture _lootItem _source _definition>><div class="battle-loot-row"><div class="loot-source-item"><<if _lootItem.type=="money">><div class="battle-loot-info"><span class="battle-loot-name">Money</span><span class="battle-loot-quantity"><<currencytooltip _lootItem.quantity>></span></div><<else>><div class="loot-source-icon"><<itemicon _lootItem.image _lootItem.rarity>></div><div class="battle-loot-info"><span class="battle-loot-name"><<=_lootItem.name>></span><span class="battle-loot-quantity">Available: <<=Number(_lootItem.quantity||0)>></span></div><</if>></div><div class="battle-loot-take"><<set _buttonLabel=_lootItem.type=="money"?"Take":"Take 1">><<button _buttonLabel>><<if _lootItem.type=="money">><<set _takeAmount=Math.max(0,Math.floor(Number(_lootItem.quantity||0)))>><<if _takeAmount>0>><<set $playerMoney=Math.max(0,Number($playerMoney||0))+_takeAmount>><<removeitem _source.loot _lootItem _takeAmount>><</if>><<else>><<moveitem _source.loot $items _lootItem 1>><</if>><<if _source.loot.length==0&&Number(_definition.respawn||0)>0>><<set _source.refillAt=$labyrinthStep+Number(_definition.respawn)>><</if>><<goto "Labyrinth">><</button>></div></div><</capture>><</for>></div><<else>><div class="battle-loot-empty">Nothing was found.</div><</if>><div class="battle-loot-actions"><<if _source.loot.length>><<button "Take all">><<set _takeAllLoot=clone(_source.loot)>><<for _lootItem range _takeAllLoot>><<set _takeAmount=Math.max(0,Math.floor(Number(_lootItem.quantity||0)))>><<if _takeAmount>0>><<if _lootItem.type=="money">><<set $playerMoney=Math.max(0,Number($playerMoney||0))+_takeAmount>><<removeitem _source.loot _lootItem _takeAmount>><<else>><<moveitem _source.loot $items _lootItem _takeAmount>><</if>><</if>><</for>><<if _source.loot.length==0&&Number(_definition.respawn||0)>0>><<set _source.refillAt=$labyrinthStep+Number(_definition.respawn)>><</if>><<set $lootSourceOpen=false>><<set $lootSourceType="">><<goto "Labyrinth">><</button>><</if>><<button "Exit">><<set $lootSourceOpen=false>><<set $lootSourceType="">><<goto "Labyrinth">><</button>></div></div><</if>><</nobr>><</widget>> -------------------------------------------------- <<widget "attributetooltip">><<nobr>><<set _item=_args[0]>><<if !_item||!_item.attribute||_item.attribute=="normal">>-<<else>><<if _item.type=="weapon">><<set _attribute=$weaponAttribute[_item.attribute]>><<else>><<set _attribute=$armorAttribute[_item.attribute]>><</if>><<if !_attribute>><<=_item.attributeName||_item.attribute>><<else>><<tooltipbox>><<=_attribute.name>>----<<if Number(_attribute.power||1)!=1>>Power: <<if Number(_attribute.power)>1>>+<</if>><<=Math.round((Number(_attribute.power)-1)*100)>>%<br><</if>><<if Number(_attribute.weight||1)!=1>>Weight: <<if Number(_attribute.weight)>1>>+<</if>><<=Math.round((Number(_attribute.weight)-1)*100)>>%<br><</if>><<if Number(_attribute.value||1)!=1>>Value: <<if Number(_attribute.value)>1>>+<</if>><<=Math.round((Number(_attribute.value)-1)*100)>>%<</if>><</tooltipbox>><</if>><</if>><</nobr>><</widget>> -------------------------------------------------- <<widget "consumeitem">><<nobr>><<set _item=_args[0]>><<set _context=String(_args[1]||"inventory").toLowerCase()>><<set _use=_item&&typeof _item.use=="object"?_item.use:{}>><<set _effectInfo=[]>><<if Number(_use.hp)>0>><<run _effectInfo.push("Restores "+Number(_use.hp)+" HP")>><</if>><<if Number(_use.hpPercent)>0>><<run _effectInfo.push("Restores "+Number(_use.hpPercent)+"% maximum HP")>><</if>><<if Number(_use.mp)>0>><<run _effectInfo.push("Restores "+Number(_use.mp)+" MP")>><</if>><<if Number(_use.mpPercent)>0>><<run _effectInfo.push("Restores "+Number(_use.mpPercent)+"% maximum MP")>><</if>><<capture _item _context _use _effectInfo>><<tooltipbox>><<link "Consume">><<set _hpBefore=Math.max(0,Number($playerStats.hp)||0)>><<set _mpBefore=Math.max(0,Number($playerStats.mp)||0)>><<set _hpMax=Math.max(0,Number($playerStats.hp_max)||0)>><<set _mpMax=Math.max(0,Number($playerStats.mp_max)||0)>><<set _hpAmount=Math.max(0,Number(_use.hp)||0)+Math.round(_hpMax*Math.max(0,Number(_use.hpPercent)||0)/100)>><<set _mpAmount=Math.max(0,Number(_use.mp)||0)+Math.round(_mpMax*Math.max(0,Number(_use.mpPercent)||0)/100)>><<set _hpAfter=Math.min(_hpMax,_hpBefore+_hpAmount)>><<set _mpAfter=Math.min(_mpMax,_mpBefore+_mpAmount)>><<set _hpRestored=Math.max(0,_hpAfter-_hpBefore)>><<set _mpRestored=Math.max(0,_mpAfter-_mpBefore)>><<if _hpRestored>0||_mpRestored>0>><<removeitem $items _item 1>><<if _removedAmount>0>><<set $playerStats.hp=_hpAfter>><<set $playerStats.mp=_mpAfter>><<run window.showPotionPopup(_hpRestored,_mpRestored,_item.name)>><<if _context=="battle">><<set $battleItemUsed=true>><<set $battleMenu="actions">><<goto "fight">><<else>><<goto "inventory">><</if>><<else>><<run window.showMessage("This item is no longer available.")>><</if>><<else>><<run window.showMessage("This potion would restore nothing.")>><</if>><</link>>----<<if _effectInfo.length>><<=_effectInfo.join("<br>")>><<else>>No restorative effect.<</if>><</tooltipbox>><</capture>><</nobr>><</widget>> -------------------------------------------------- <<widget "itemcontrols">><<nobr>><<set _item=_args[0]>><<if _item.category=="potion"&&_item.use&&typeof _item.use=="object">><<consumeitem _item "inventory">><<dropcontrols _item false>><<elseif _item.type=="weapon"||_item.type=="helmet"||_item.type=="armor"||_item.type=="armour"||_item.type=="boots"||_item.type=="shield">><<dropcontrols _item true>><<else>><<dropcontrols _item false>><</if>><</nobr>><</widget>> -------------------------------------------------- <<widget "battleitems">><<nobr>><<set _potions=Array.isArray($items)?$items.filter(function(item){return item&&item.category=="potion"&&item.use&&typeof item.use=="object"&&Number(item.quantity||0)>0}):[]>><div class="battle-loot"><div class="battle-loot-title">Items</div><<if _potions.length>><div class="battle-loot-list"><<for _item range _potions>><<capture _item>><div class="battle-loot-row"><div class="battle-loot-info"><span class="battle-loot-name"><<itemicon _item.image _item.rarity>><<=_item.name>></span><span class="battle-loot-quantity">Available: <<=Number(_item.quantity||1)>></span></div><div class="battle-loot-take"><<consumeitem _item "battle">></div></div><</capture>><</for>></div><<else>><div class="battle-loot-empty">You have no potions.</div><</if>><div class="battle-loot-actions"><<button "Back">><<set $battleMenu="actions">><<goto "fight">><</button>></div></div><</nobr>><</widget>> ------------------------------------------------- <<widget "consumeitemcategory">><<nobr>><<set _consumeCategory to $args[0]>><<set _consumeRemaining to Number($args[1] || 1)>><<for _i = $items.length - 1; _i >= 0 and _consumeRemaining > 0; _i-->><<set _consumeItem to $items[_i]>><<if _consumeItem.category == _consumeCategory>><<set _consumeQty to Number(_consumeItem.quantity || 0)>><<if _consumeQty > _consumeRemaining>><<set _consumeItem.quantity -= _consumeRemaining>><<set _consumeRemaining to 0>><<else>><<set _consumeRemaining -= _consumeQty>><<run $items.deleteAt(_i)>><</if>><</if>><</for>><</nobr>><</widget>> -------------------------------------------------- <<widget "itemicon">><<nobr>><<set _name to $args[0]>><<set _rarity to Number($args[1] || 1)>><span @class="'item-frame rarity-' + _rarity"><img @src="'resources/img/items/' + _name + '.jpg'" @data-name="_name" @data-rarity="_rarity" class="item-thumb"></span><</nobr>><</widget>> -------------------------------------------------- <<widget "item" container>><<nobr>><<set _name to $args[0]>><<set _rarity to Number($args[1] || 1)>><div class="dialogue-box item-entry"><div class="item-image"><<itemicon _name _rarity>></div><div class="dialogue-content">_contents</div></div><</nobr>><</widget>> -------------------------------------------------- <<widget "rarity">><<nobr>><<set _rarity to Number($args[0])>><<if _rarity == 1>><span class="rarity-text rarity-text-1">Common</span><<elseif _rarity == 2>><span class="rarity-text rarity-text-2">Uncommon</span><<elseif _rarity == 3>><span class="rarity-text rarity-text-3">Rare</span><<elseif _rarity == 4>><span class="rarity-text rarity-text-4">Epic</span><<elseif _rarity == 5>><span class="rarity-text rarity-text-5">Legendary</span><<else>><<print $args[0]>><</if>><</nobr>><</widget>> -------------------------------------------------- <<widget "isitemsequal">><<nobr>><<set _itemA=_args[0]>><<set _itemB=_args[1]>><<set _isSame=!!(_itemA&&_itemB)>><<set _compareFields=["name","baseName","type","slot","category","damageType","image","power","weight","value","rarity","level","material","attribute","templateId"]>><<if _isSame>><<for _field range _compareFields>><<set _valA=_itemA[_field]==null?"":JSON.stringify(_itemA[_field])>><<set _valB=_itemB[_field]==null?"":JSON.stringify(_itemB[_field])>><<if _valA!=_valB>><<set _isSame=false>><<break>><</if>><</for>><</if>><</nobr>><</widget>> -------------------------------------------------- <<widget "iequip">><<nobr>><<set _item=_args[0]>><<if _item>><<set _type=_item.type=="armour"?"armor":_item.type>><<set _slotName=setup.getItemSlotName(_type)>><<if _slotName>><<set _doEquip=true>><<if _type=="weapon"&&Number(_item.slot||1)==2&&$shielditems>><<additem $items $shielditems 1>><<set $shielditems=null>><</if>><<if _type=="shield"&&$weaponitems&&Number($weaponitems.slot||1)==2>><<additem $items $weaponitems 1>><<set $weaponitems=null>><</if>><<set _equippedItem=State.variables[_slotName]>><<if _equippedItem>><<isitemsequal _item _equippedItem>><<if _isSame>><<set _doEquip=false>><<else>><<additem $items _equippedItem 1>><</if>><</if>><<if _doEquip>><<set _qty=Math.max(1,Number(_item.quantity||1))>><<if _qty>1>><<set _item.quantity-->><<set _newEquippedItem=clone(_item)>><<set _newEquippedItem.quantity=1>><<run State.variables[_slotName]=_newEquippedItem>><<else>><<set _newEquippedItem=clone(_item)>><<set _newEquippedItem.quantity=1>><<run State.variables[_slotName]=_newEquippedItem>><<set _itemIndex=$items.indexOf(_item)>><<if _itemIndex>=0>><<run $items.splice(_itemIndex,1)>><</if>><</if>><</if>><</if>><</if>><</nobr>><</widget>> -------------------------------------------------- <<widget "iunequip">><<nobr>><<set _equippedItem=_args[0]>><<if _equippedItem>><<set _slotName=setup.getItemSlotName(_equippedItem.type=="armour"?"armor":_equippedItem.type)>><<if _slotName>><<additem $items _equippedItem 1>><<run State.variables[_slotName]=null>><</if>><</if>><</nobr>><</widget>> -------------------------------------------------- <<widget "dropcontrols">><<nobr>><<set _dropItem=_args[0]>><<set _showEquip=Boolean(_args[1])>><<set _dropQty=Math.max(1,Math.floor(Number(_dropItem.quantity||1)))>><<capture _dropItem _dropQty _showEquip>><span class="item-actions-normal"><<if _showEquip>><<link "Equip">><<iequip _dropItem>><<goto "inventory">><</link>><</if>><<if _dropItem.droppable!==false>><a href="javascript:void(0)" class="item-drop-open item-action-link">Drop</a><</if>></span><<if _dropItem.droppable!==false>><span class="item-actions-drop" style="display:none;"><<set _dropAmount=1>><<numberbox "_dropAmount" 1>><span class="item-drop-confirmation"><<link "✔️">><<set _dropAmount=Math.max(1,Math.min(_dropQty,Math.floor(Number(_dropAmount)||1)))>><<removeitem $items _dropItem _dropAmount>><<goto "inventory">><</link>><a href="javascript:void(0)" class="item-drop-cancel">❌</a></span></span><</if>><</capture>><</nobr>><</widget>> ------------------------------------------------------------- <<widget "removeitem">><<nobr>><<set _removeContainer=_args[0]>><<set _removeSourceItem=_args[1]>><<set _removeRequested=Math.max(0,Math.floor(Number(_args[2])||0))>><<set _removedAmount=0>><<set _removeItemFound=false>><<if Array.isArray(_removeContainer)&&_removeSourceItem&&_removeRequested>0>><<for _removeIndex=0;_removeIndex<_removeContainer.length;_removeIndex++>><<isitemsequal _removeContainer[_removeIndex] _removeSourceItem>><<if _isSame>><<set _removeItemFound=true>><<set _removeAvailable=Math.max(0,Math.floor(Number(_removeContainer[_removeIndex].quantity||0)))>><<set _removedAmount=Math.min(_removeRequested,_removeAvailable)>><<if _removedAmount>0>><<set _removeContainer[_removeIndex].quantity=_removeAvailable-_removedAmount>><<if _removeContainer[_removeIndex].quantity<=0>><<run _removeContainer.splice(_removeIndex,1)>><</if>><</if>><<break>><</if>><</for>><</if>><</nobr>><</widget>> <<widget "moveitem">><<nobr>><<set _moveSource=_args[0]>><<set _moveDestination=_args[1]>><<set _moveItem=_args[2]>><<set _moveRequested=Math.max(0,Math.floor(Number(_args[3])||0))>><<set _movedAmount=0>><<if Array.isArray(_moveSource)&&Array.isArray(_moveDestination)&&_moveItem&&_moveRequested>0>><<set _moveSourceIndex=-1>><<set _moveSourceEntry=null>><<for _moveIndex=0;_moveIndex<_moveSource.length;_moveIndex++>><<isitemsequal _moveSource[_moveIndex] _moveItem>><<if _isSame>><<set _moveSourceIndex=_moveIndex>><<set _moveSourceEntry=_moveSource[_moveIndex]>><<break>><</if>><</for>><<if _moveSourceEntry>><<set _moveAvailable=Math.max(0,Math.floor(Number(_moveSourceEntry.quantity||0)))>><<set _movedAmount=Math.min(_moveRequested,_moveAvailable)>><<if _movedAmount>0>><<set _moveDestinationEntry=null>><<for _moveStoredItem range _moveDestination>><<isitemsequal _moveStoredItem _moveSourceEntry>><<if _isSame>><<set _moveDestinationEntry=_moveStoredItem>><<break>><</if>><</for>><<if _moveDestinationEntry>><<set _moveDestinationEntry.quantity=Math.max(0,Number(_moveDestinationEntry.quantity||0))+_movedAmount>><<else>><<set _moveClone=clone(_moveSourceEntry)>><<set _moveClone.quantity=_movedAmount>><<run _moveDestination.push(_moveClone)>><</if>><<set _moveSourceEntry.quantity=Math.max(0,Number(_moveSourceEntry.quantity||0)-_movedAmount)>><<if _moveSourceEntry.quantity<=0&&_moveSourceIndex>=0>><<run _moveSource.splice(_moveSourceIndex,1)>><</if>><</if>><</if>><</if>><</nobr>><</widget>> ---------------------------------------------------------------------------- <<widget "canfititem">><<nobr>><<set _canFitSource=_args[0]>><<set _canFitSourceItem=_args[1]>><<set _canFitRequested=Math.max(1,Math.floor(Number(_args[2]||1)))>><<set _canFitCurrentWeight=Math.max(0,Number(_args[3]||0))>><<set _canFitMaximumWeight=Math.max(0,Number(_args[4]||0))>><<set _canFitCheckPlayerCarry=Boolean(_args[5])>><<set _canFitMode=String(_args[6]||"transfer").toLowerCase()>><<set _canFitUnitPrice=Math.max(0,Math.floor(Number(_args[7]||0)))>><<set _canFitItem=false>><<set _canFitAmount=0>><<set _canFitReason="missing">><<set _canFitAvailable=0>><<if Array.isArray(_canFitSource)&&_canFitSourceItem>><<for _canFitStoredItem range _canFitSource>><<isitemsequal _canFitStoredItem _canFitSourceItem>><<if _isSame>><<set _canFitAvailable=Math.max(0,Math.floor(Number(_canFitStoredItem.quantity||0)))>><<break>><</if>><</for>><<if _canFitAvailable>0>><<if _canFitCheckPlayerCarry&&_canFitSourceItem.playerCarry===false>><<set _canFitReason="blocked">><<else>><<set _canFitItemWeight=Math.max(0,Number(_canFitSourceItem.weight||0))>><<set _canFitFreeWeight=Math.max(0,_canFitMaximumWeight-_canFitCurrentWeight)>><<set _canFitWeightLimit=_canFitItemWeight>0?Math.max(0,Math.floor((_canFitFreeWeight+0.000001)/_canFitItemWeight)):_canFitAvailable>><<set _canFitMoneyLimit=_canFitAvailable>><<if _canFitMode=="buy">><<set _canFitMoneyLimit=_canFitUnitPrice>0?Math.max(0,Math.floor(Number($playerMoney||0)/_canFitUnitPrice)):_canFitAvailable>><</if>><<set _canFitAmount=Math.min(_canFitRequested,_canFitAvailable,_canFitWeightLimit,_canFitMoneyLimit)>><<if _canFitAmount>0>><<set _canFitItem=true>><<set _canFitReason="ok">><<elseif _canFitWeightLimit<=0>><<set _canFitReason="weight">><<elseif _canFitMode=="buy"&&_canFitMoneyLimit<=0>><<set _canFitReason="money">><<else>><<set _canFitReason="missing">><</if>><</if>><</if>><</if>><</nobr>><</widget>> ---------------------------------------------------------------------------- <<widget "transferitem">><<nobr>><<set _transferSource=_args[0]>><<set _transferDestination=_args[1]>><<set _transferItem=_args[2]>><<set _transferRequested=Math.max(1,Math.floor(Number(_args[3]||1)))>><<set _transferCurrentWeight=Math.max(0,Number(_args[4]||0))>><<set _transferMaximumWeight=Math.max(0,Number(_args[5]||0))>><<set _transferCheckPlayerCarry=Boolean(_args[6])>><<canfititem _transferSource _transferItem _transferRequested _transferCurrentWeight _transferMaximumWeight _transferCheckPlayerCarry "transfer" 0>><<set _transferAmount=_canFitAmount>><<set _transferSuccess=_canFitItem>><<set _transferReason=_canFitReason>><<if _transferSuccess>><<moveitem _transferSource _transferDestination _transferItem _transferAmount>><</if>><</nobr>><</widget>> ---------------------------------------------------------------------------- <<widget "additem">><<nobr>><<set _addContainer=_args[0]>><<set _addSourceItem=_args[1]>><<set _addAmount=Math.max(0,Math.floor(Number(_args[2]||1)))>><<set _addedAmount=0>><<set _addedItem=null>><<if Array.isArray(_addContainer)&&_addSourceItem&&typeof _addSourceItem=="object"&&_addAmount>0>><<set _addFound=null>><<for _addStoredItem range _addContainer>><<isitemsequal _addStoredItem _addSourceItem>><<if _isSame>><<set _addFound=_addStoredItem>><<break>><</if>><</for>><<if _addFound>><<set _addFound.quantity=Math.max(0,Number(_addFound.quantity||0))+_addAmount>><<set _addedItem=_addFound>><<else>><<set _addClone=clone(_addSourceItem)>><<set _addClone.quantity=_addAmount>><<run _addContainer.push(_addClone)>><<set _addedItem=_addClone>><</if>><<set _addedAmount=_addAmount>><</if>><</nobr>><</widget>> ---------------------------------------------------------------------------- <<widget "generateitem">><<nobr>><<set _generateDestination=_args[0]>><<set _generateType=String(_args[1]||"auto").toLowerCase()>><<set _generateId=String(_args[2]||"")>><<set _generateLevel=Math.max(1,Math.min(21,Math.floor(Number(_args[3])||1)))>><<set _generateRarity=String(_args[4]||"common").toLowerCase()>><<set _generateQuantity=Math.max(1,Math.floor(Number(_args[5]||1)))>><<set _generatedAmount=0>><<set _generatedItem=null>><<if !Array.isArray(_generateDestination)>><<run console.error("generateitem: Destination is not an array:",_generateDestination)>><<else>><<if _generateType=="auto">><<if $weaponCatalog&&$weaponCatalog[_generateId]>><<set _generateType="weapon">><<elseif $armorCatalog&&$armorCatalog[_generateId]>><<set _generateType="armor">><<elseif $itemCatalog&&$itemCatalog[_generateId]>><<set _generateType="item">><<else>><<set _generateType="">><</if>><</if>><<if _generateType=="item"||_generateType=="catalog">><<if $itemCatalog&&$itemCatalog[_generateId]>><<set _generatedItem=clone($itemCatalog[_generateId])>><<set _generatedItem.catalogId=_generateId>><<set _generatedItem.quantity=1>><<additem _generateDestination _generatedItem _generateQuantity>><<set _generatedAmount=_addedAmount>><<set _generatedItem=_addedItem>><<else>><<run console.error("generateitem: Unknown item ID:",_generateId)>><</if>><<elseif _generateType=="weapon">><<for _generateIndex=0;_generateIndex<_generateQuantity;_generateIndex++>><<set _generatedItem=setup.generateWeapon(_generateId,_generateLevel,_generateRarity)>><<if _generatedItem>><<additem _generateDestination _generatedItem 1>><<set _generatedAmount+=_addedAmount>><<else>><<run console.error("generateitem: Weapon could not be generated:",_generateId,_generateLevel,_generateRarity)>><<break>><</if>><</for>><<elseif _generateType=="armor"||_generateType=="armour">><<for _generateIndex=0;_generateIndex<_generateQuantity;_generateIndex++>><<set _generatedItem=setup.generateArmor(_generateId,_generateLevel,_generateRarity)>><<if _generatedItem>><<additem _generateDestination _generatedItem 1>><<set _generatedAmount+=_addedAmount>><<else>><<run console.error("generateitem: Armor could not be generated:",_generateId,_generateLevel,_generateRarity)>><<break>><</if>><</for>><<else>><<run console.error("generateitem: Unknown catalog type or item ID:",_generateType,_generateId)>><</if>><</if>><</nobr>><</widget>> ---------------------------------------------------------------------------- <<widget "tradeitem">><<nobr>><<set _tradeMerchant=_args[0]>><<set _tradeItem=_args[1]>><<set _tradeRequested=Math.max(1,Math.floor(Number(_args[2])||1))>><<set _tradeMode=String(_args[3]||"buy").toLowerCase()>><<set $tradeMessage="">><<if !_tradeMerchant||!_tradeItem>><<set $tradeMessage="The transaction could not be completed.">><<elseif _tradeMode=="buy">><<merchantprice _tradeItem "buy">><<set _tradeUnitPrice=_tradePrice>><<canfititem _tradeMerchant.items _tradeItem _tradeRequested $playerWeight $playerWeightMax true "buy" _tradeUnitPrice>><<set _tradeAmount=_canFitAmount>><<set _tradeReason=_canFitReason>><<if !_canFitItem>><<if _tradeReason=="money">><<set $tradeMessage="You do not have enough money.">><<elseif _tradeReason=="weight">><<set $tradeMessage="You cannot carry this item.">><<elseif _tradeReason=="blocked">><<set $tradeMessage="This item cannot be carried by the player.">><<else>><<set $tradeMessage="This item is no longer available.">><</if>><<else>><<moveitem _tradeMerchant.items $items _tradeItem _tradeAmount>><<set _tradeAmount=_movedAmount>><<if _tradeAmount>0>><<set $playerMoney=Math.max(0,Number($playerMoney||0)-_tradeUnitPrice*_tradeAmount)>><<set $tradeMessage="Purchased "+_tradeAmount+" × "+_tradeItem.name+".">><<else>><<set $tradeMessage="The transaction could not be completed.">><</if>><</if>><<elseif _tradeMode=="sell">><<tradeitemaccepted _tradeMerchant _tradeItem>><<if !_tradeAccepted>><<set $tradeMessage="This merchant does not buy this type of item.">><<else>><<merchantprice _tradeItem "sell">><<set _tradeUnitPrice=_tradePrice>><<canfititem $items _tradeItem _tradeRequested 0 9999 false "transfer" 0>><<set _tradeAmount=_canFitAmount>><<if !_canFitItem>><<set $tradeMessage="You do not have this item.">><<else>><<moveitem $items _tradeMerchant.items _tradeItem _tradeAmount>><<set _tradeAmount=_movedAmount>><<if _tradeAmount>0>><<set $playerMoney=Math.max(0,Number($playerMoney||0)+_tradeUnitPrice*_tradeAmount)>><<sortmerchantitems _tradeMerchant>><<set $tradeMessage="Sold "+_tradeAmount+" × "+_tradeItem.name+".">><<else>><<set $tradeMessage="The transaction could not be completed.">><</if>><</if>><</if>><<else>><<set $tradeMessage="Unknown transaction type.">><</if>><</nobr>><</widget>>
<<widget "merchantrollrarity">><<nobr>><<set _merchantRarityLevel=Math.max(1,Math.min(21,Math.floor(Number(_args[0])||1)))>><<set _merchantRarityThreshold=0>><<set _merchantRarityData={uncommon:0,rare:0,epic:0}>><<for _rarityLevel,_rarityEntry range setup.merchantRarityCatalog>><<set _rarityLevelNumber=Math.floor(Number(_rarityLevel)||0)>><<if _rarityLevelNumber<=_merchantRarityLevel&&_rarityLevelNumber>=_merchantRarityThreshold>><<set _merchantRarityThreshold=_rarityLevelNumber>><<set _merchantRarityData=_rarityEntry>><</if>><</for>><<set _merchantUncommonChance=Math.max(0,Number(_merchantRarityData.uncommon)||0)>><<set _merchantRareChance=Math.max(0,Number(_merchantRarityData.rare)||0)>><<set _merchantEpicChance=Math.max(0,Number(_merchantRarityData.epic)||0)>><<set _merchantRarityRoll=random(1,100)>><<set _merchantRarity="common">><<if _merchantRarityRoll<=_merchantEpicChance>><<set _merchantRarity="epic">><<elseif _merchantRarityRoll<=_merchantEpicChance+_merchantRareChance>><<set _merchantRarity="rare">><<elseif _merchantRarityRoll<=_merchantEpicChance+_merchantRareChance+_merchantUncommonChance>><<set _merchantRarity="uncommon">><</if>><</nobr>><</widget>> ------------------------------------------------------------- <<widget "generatemerchantinventory">><<nobr>><<set _generateMerchant=_args[0]>><<set _generateMerchantLevel=Math.max(1,Math.min(21,Math.floor(Number(_args[1])||1)))>><<set _generateMerchantType=_generateMerchant?setup.merchantTypes[String(_generateMerchant.merchantType||"")]:null>><<if !_generateMerchant>><<run console.error("generatemerchantinventory: Missing merchant.")>><<elseif !_generateMerchantType>><<run console.error("generatemerchantinventory: Unknown merchant type:",_generateMerchant.merchantType)>><<else>><<set _generateMerchant.items=[]>><<set _merchantStockPercent=_generateMerchant.stockMultiplier===undefined?100:Math.max(0,Number(_generateMerchant.stockMultiplier)||0)>><<set _merchantStockMultiplier=_merchantStockPercent/100>><<set _merchantUnlockedIds=[]>><<for _unlockLevel,_unlockIds range _generateMerchantType.levels>><<set _unlockLevelNumber=Math.floor(Number(_unlockLevel)||0)>><<if _unlockLevelNumber<=_generateMerchantLevel&&Array.isArray(_unlockIds)>><<for _unlockId range _unlockIds>><<run _merchantUnlockedIds.push(String(_unlockId))>><</for>><</if>><</for>><<if _generateMerchantType.mode=="random">><<if _merchantUnlockedIds.length&&_merchantStockMultiplier>0>><<set _merchantRollsMin=Math.max(0,Math.floor(Number(_generateMerchantType.rollsMin)||0))>><<set _merchantRollsMax=Math.max(_merchantRollsMin,Math.floor(Number(_generateMerchantType.rollsMax)||_merchantRollsMin))>><<set _merchantRollCount=Math.max(0,Math.round(random(_merchantRollsMin,_merchantRollsMax)*_merchantStockMultiplier))>><<for _merchantRollIndex=0;_merchantRollIndex<_merchantRollCount;_merchantRollIndex++>><<set _merchantSelectedId=_merchantUnlockedIds[random(0,_merchantUnlockedIds.length-1)]>><<set _merchantGeneratedLevel=_generateMerchantLevel>><<if _generateMerchantLevel>1&&random(1,100)<=30>><<set _merchantGeneratedLevel=_generateMerchantLevel-1>><</if>><<merchantrollrarity _generateMerchantLevel>><<generateitem _generateMerchant.items "auto" _merchantSelectedId _merchantGeneratedLevel _merchantRarity 1>><</for>><<elseif !_merchantUnlockedIds.length>><<run console.warn("Merchant has no unlocked item IDs:",_generateMerchant.merchantType,_generateMerchantLevel)>><</if>><<elseif _generateMerchantType.mode=="fixed">><<if _merchantStockMultiplier>0>><<set _merchantQuantityMin=Math.max(1,Math.floor(Number(_generateMerchantType.quantityMin)||1))>><<set _merchantQuantityMax=Math.max(_merchantQuantityMin,Math.floor(Number(_generateMerchantType.quantityMax)||_merchantQuantityMin))>><<for _merchantSelectedId range _merchantUnlockedIds>><<set _merchantFixedQuantity=Math.max(0,Math.round(random(_merchantQuantityMin,_merchantQuantityMax)*_merchantStockMultiplier))>><<if _merchantFixedQuantity>0>><<generateitem _generateMerchant.items "auto" _merchantSelectedId _generateMerchantLevel "common" _merchantFixedQuantity>><</if>><</for>><</if>><<elseif _generateMerchantType.mode!="buyerOnly">><<run console.error("generatemerchantinventory: Unknown merchant mode:",_generateMerchantType.mode)>><</if>><<sortmerchantitems _generateMerchant>><</if>><</nobr>><</widget>> ------------------------------------------------------------- <<widget "merchantrefresh">><<nobr>><<set _refreshMerchant=_args[0]>><<set _refreshItemLevel=Math.max(1,Math.min(21,Math.floor(Number(_args[1])||1)))>><<if _refreshMerchant>><<set _refreshLast=Math.max(0,Number(_refreshMerchant.lastRefresh||0))>><<set _refreshRespawn=Math.max(0,Number(_refreshMerchant.respawn||0))>><<set _refreshGeneratedLevel=Math.max(0,Number(_refreshMerchant.itemLevel||0))>><<set _refreshFirst=_refreshLast<=0||_refreshGeneratedLevel<=0>><<set _refreshLevelChanged=_refreshGeneratedLevel!=_refreshItemLevel>><<set _refreshTimePassed=_refreshRespawn>0&&Number($refTurn||0)-_refreshLast>=_refreshRespawn>><<if _refreshFirst||_refreshLevelChanged||_refreshTimePassed>><<generatemerchantinventory _refreshMerchant _refreshItemLevel>><<set _refreshMerchant.lastRefresh=Math.max(1,Number($refTurn||1))>><<set _refreshMerchant.itemLevel=_refreshItemLevel>><</if>><</if>><</nobr>><</widget>> ------------------------------------------------------------- <<widget "tradeplayerquantity">><<nobr>><<set _tradeQuantityItem=_args[0]>><<set _tradePlayerQty=0>><<if _tradeQuantityItem&&Array.isArray($items)>><<for _tradeInventoryItem range $items>><<isitemsequal _tradeInventoryItem _tradeQuantityItem>><<if _isSame>><<set _tradePlayerQty=Math.max(0,Number(_tradeInventoryItem.quantity||1))>><<break>><</if>><</for>><</if>><</nobr>><</widget>> ------------------------------------------------------------- <<widget "tradeitemaccepted">><<nobr>><<set _tradeAcceptMerchant=_args[0]>><<set _tradeAcceptItem=_args[1]>><<set _tradeAccepted=false>><<set _tradeAcceptType=_tradeAcceptMerchant?setup.merchantTypes[String(_tradeAcceptMerchant.merchantType||"")]:null>><<if _tradeAcceptType&&_tradeAcceptItem&&Array.isArray(_tradeAcceptType.buyCategories)>><<set _tradeAccepted=_tradeAcceptType.buyCategories.includes(String(_tradeAcceptItem.category||""))>><</if>><</nobr>><</widget>> ------------------------------------------------------------- <<widget "merchantprice">><<nobr>><<set _tradePriceItem=_args[0]||{}>><<set _tradePriceMode=String(_args[1]||"buy").toLowerCase()>><<set _tradePriceBase=Math.max(0,Number(_tradePriceItem.value)||0)>><<set _tradePriceMerchant=$merchants&&$merchantId&&$merchants[$merchantId]?$merchants[$merchantId]:null>><<set _tradePriceIsGuild=_tradePriceMerchant&&String(_tradePriceMerchant.merchantType||"").toLowerCase()=="guild">><<set _tradePriceIsParts=String(_tradePriceItem.type||"").toLowerCase()=="parts">><<if _tradePriceMode=="sell">><<if _tradePriceIsGuild&&_tradePriceIsParts>><<set _tradePriceMultiplier=1>><<else>><<set _tradePriceCharisma=Math.max(0,Math.min(200,Number($playerStats.charisma||0)))>><<set _tradePriceMultiplier=Math.min(1,0.5+_tradePriceCharisma/400)>><</if>><<else>><<set _tradePriceMultiplier=1>><</if>><<set _tradePrice=Math.max(1,Math.floor(_tradePriceBase*_tradePriceMultiplier))>><</nobr>><</widget>> ------------------------------------------------------------- <<widget "tradeitemkey">><<nobr>><<set _tradeKeyItem=_args[0]||{}>><<set _tradeItemKey=String(_tradeKeyItem.templateId||_tradeKeyItem.catalogId||_tradeKeyItem.image||_tradeKeyItem.name||"item").replace(/[^a-zA-Z0-9_-]/g,"_")+"_"+String(_tradeKeyItem.level||1)+"_"+String(_tradeKeyItem.rarity||1)+"_"+String(_tradeKeyItem.material||"none")+"_"+String(_tradeKeyItem.attribute||"normal")>><</nobr>><</widget>> ------------------------------------------------------------- <<widget "sortmerchantitems">><<nobr>><<set _sortMerchant=_args[0]>><<if _sortMerchant&&Array.isArray(_sortMerchant.items)>><<run _sortMerchant.items.sort(function(a,b){var categoryA=String(a&&a.category||"");var categoryB=String(b&&b.category||"");var categoryCompare=categoryA.localeCompare(categoryB);if(categoryCompare!==0){return categoryCompare;}var nameA=String(a&&a.name||"");var nameB=String(b&&b.name||"");var nameCompare=nameA.localeCompare(nameB);if(nameCompare!==0){return nameCompare;}return Number(a&&a.power||0)-Number(b&&b.power||0);})>><</if>><</nobr>><</widget>>
<<set setup.labyrinthMapCatalog={ 2:[ [-99,-99,-99], [-99,-23,-99], [-99,-12,-99], [-99,-22,-99,-99,-99,-99,-99,-19,-99], [-99,-70,-33,-99,-99,-99,-99,-60,-20,-99], [-99,-10,-99,-99,-99,-31,-99,-98,-99], [-99,-54,-11,-62,-21,-69,-66,-28,-29,-99], [-99,-99,-99,-11,-99,-99,-29,-99], [-99,-99,-99,-10,-99], [-99,-99,-32,-63,-98,-19,-99], [-99,-99,-99,-11,-99], [-99,-36,-27,-50,-16,-99], [-99,-99,-99,-11,-99], [-99,-99,-24,-61,-99,-99,-31,-99], [-99,-99,-99,-52,-12,-11,-71,-20,-99], [-99,-99,-99,-99,-99,-99,-99,-99,-99] ], 3:[ [-99,-99,-99,-99,-99,-99,-99,-99,-99,-99], [-99,-20,-99,-99,-99,-99,-19,-99,-31,-99], [-99,-10,-99,-99,-39,-99,-98,-99,-28,-99], [-99,-52,-72,-11,-63,-66,-12,-21,-50,-12,-52,-99], [-99,-99,-10,-99,-99,-33,-99,-99,-11,-99,-52,-18,-99], [-99,-99,-12,-99,-99,-99,-99,-99,-12,-99], [-99,-99,-60,-25,-99,-99,-99,-99,-52,-52,-99], [-99,-23,-61,-99,-99,-99,-99,-99,-99,-64,-35,-99], [-99,-99,-10,-99,-36,-99,-99,-99,-99,-12,-99], [-99,-99,-54,-12,-71,-68,-12,-22,-12,-61,-99], [-99,-99,-99,-99,-99,-32,-99,-99,-99,-24,-99], [-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99] ], 4:[ [-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99], [-99,-24,-99,-99,-99,-51,-12,-52,-99,-16,-99,-34,-99,-99,-99,-33,-99,-51,-12,-60,-10,-23,-99], [-99,-12,-99,-99,-99,-17,-99,-36,-99,-49,-12,-50,-21,-12,-60,-59,-11,-51,-99,-39,-99], [-99,-11,-99,-29,-99,-99,-99,-49,-12,-51,-99,-31,-99,-99,-37,-99], [-99,-52,-10,-71,-12,-10,-11,-51,-99], [-99,-99,-98,-99,-98,-99,-98,-99,-99,-19,-99], [-99,-99,-19,-99,-20,-99,-52,-10,-12,-63,-12,-32,-99], [-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99] ], 5:[ [-99,-99,-99,-99,-99,-99], [-99,-99,-37,-49,-19,-99], [-99,-99,-99,-12,-99,-99,-20,-99], [-99,-31,-12,-65,-12,-49,-59,-19,-99], [-99,-99,-99,-99,-99,-11,-99], [-99,-99,-99,-24,-11,-50,-11,-28,-35,-99], [-99,-99,-99,-99,-99,-12,-99], [-99,-23,-99,-99,-99,-72,-32,-99], [-99,-10,-99,-99,-99,-12,-99], [-99,-52,-21,-27,-36,-50,-12,-52,-99], [-99,-99,-99,-98,-99,-15,-99,-37,-99], [-99,-99,-99,-19,-99], [-99,-99,-99,-99,-99] ], 6:[ [-99,-99,-99], [-99,-24,-99], [-99,-11,-99,-99,-23,-49,-26,-99], [-99,-12,-99,-99,-99,-12,-99], [-99,-62,-38,-99,-99,-70,-30,-99], [-99,-11,-99,-99,-99,-11,-99], [-99,-52,-12,-70,-12,-50,-18,-99], [-99,-99,-99,-35,-99,-17,-99], [-99,-99,-99,-99,-99,-99,-99] ] }>>