diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/ResourceLoader.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/ResourceLoader.java index d08c2de50..5e1db4c9f 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/ResourceLoader.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/ResourceLoader.java @@ -183,7 +183,7 @@ public final class ResourceLoader { loader.prepareTileset(R.drawable.monsters_warrior1, "monsters_warrior1", src_sz1x1, defaultTileSize); //loader.prepareTileset(R.drawable.monsters_wraiths, "monsters_wraiths", new Size(3, 1), defaultTileSize); loader.prepareTileset(R.drawable.monsters_zombie1, "monsters_zombie1", src_sz1x1, defaultTileSize); - loader.prepareTileset(R.drawable.monsters_zombie2, "monsters_zombie2", src_sz1x1, defaultTileSize); + //loader.prepareTileset(R.drawable.monsters_zombie2, "monsters_zombie2", src_sz1x1, defaultTileSize); //loader.prepareTileset(R.drawable.monsters_dragon1, "monsters_dragon1", src_sz1x1, dst_sz4x3); if (AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES) { diff --git a/AndorsTrailEdit/AndorsTrailEditor.js b/AndorsTrailEdit/AndorsTrailEditor.js index 6f1afa2ab..aec130ed0 100644 --- a/AndorsTrailEdit/AndorsTrailEditor.js +++ b/AndorsTrailEdit/AndorsTrailEditor.js @@ -16,7 +16,6 @@ IncludeJavascript("Editor_Droplist.js"); IncludeJavascript("Editor_Conversation.js"); IncludeJavascript("Editor_Monster.js"); -IncludeJavascript("inc/jquery.shorten.min.js"); IncludeJavascript("inc/jquery.dynatree.min.js"); @@ -92,23 +91,56 @@ function addExampleModelItems(model) { function startEditor() { model = { - actorConditions: new DataStore('actorcondition', new FieldList("[id|name|iconID|isStacking|" + actorConditions: new DataStore({ + objectTypename: 'actorcondition' + ,fieldList: new FieldList("[id|name|iconID|isStacking|" + "hasRoundEffect|round_visualEffectID|round_boostHP_Min|round_boostHP_Max|round_boostAP_Min|round_boostAP_Max|" + "hasFullRoundEffect|fullround_visualEffectID|fullround_boostHP_Min|fullround_boostHP_Max|fullround_boostAP_Min|fullround_boostAP_Max|" + "hasAbilityEffect|boostMaxHP|boostMaxAP|moveCostPenalty|attackCost|attackChance|criticalChance|criticalMultiplier|attackDamage_Min|attackDamage_Max|blockChance|damageResistance|" - + "];")) - ,quests: new DataStore('quest', new FieldList("[id|name|showInLog|stages[progress|logText|rewardExperience|finishesQuest|]|];")) - ,items: new DataStore('item', new FieldList("[searchTag|iconID|name|category|baseMarketCost|" + + "];" + ) + ,idField: 'id' + ,nameField: 'name' + }) + ,quests: new DataStore({ + objectTypename: 'quest' + ,fieldList: new FieldList("[id|name|showInLog|stages[progress|logText|rewardExperience|finishesQuest|]|];") + ,idField: 'id' + ,nameField: 'name' + }) + ,items: new DataStore({ + objectTypename: 'item' + ,fieldList: new FieldList("[searchTag|iconID|name|category|baseMarketCost|" + "hasEquipEffect|equip_boostMaxHP|equip_boostMaxAP|equip_moveCostPenalty|equip_attackCost|equip_attackChance|equip_criticalChance|equip_criticalMultiplier|equip_attackDamage_Min|equip_attackDamage_Max|equip_blockChance|equip_damageResistance|equip_conditions[condition|magnitude|]|" + "hasUseEffect|use_boostHP_Min|use_boostHP_Max|use_boostAP_Min|use_boostAP_Max|use_conditionsSource[condition|magnitude|duration|chance|]|" + "hasHitEffect|hit_boostHP_Min|hit_boostHP_Max|hit_boostAP_Min|hit_boostAP_Max|hit_conditionsSource[condition|magnitude|duration|chance|]|hit_conditionsTarget[condition|magnitude|duration|chance|]|" + "hasKillEffect|kill_boostHP_Min|kill_boostHP_Max|kill_boostAP_Min|kill_boostAP_Max|kill_conditionsSource[condition|magnitude|duration|chance|]|" - + "];")) - ,droplists: new DataStore('droplist', new FieldList("[id|items[itemID|quantity_Min|quantity_Max|chance|]|];"), 'id') - ,dialogue: new DataStore('dialogue', new FieldList("[id|message|progressQuest|rewardDropListID|replies[text|nextPhraseID|requires_Progress|requires_itemID|requires_Quantity|]|];"), 'id') - ,monsters: new DataStore('monster', new FieldList("[iconID|name|tags|size|maxHP|maxAP|moveCost|attackCost|attackChance|criticalChance|criticalMultiplier|attackDamage_Min|attackDamage_Max|blockChance|damageResistance|droplistID|phraseID|" + + "];" + ) + ,idField: 'searchTag' + ,nameField: 'name' + }) + ,droplists: new DataStore({ + objectTypename: 'droplist' + ,fieldList: new FieldList("[id|items[itemID|quantity_Min|quantity_Max|chance|]|];") + ,idField: 'id' + ,nameField: 'id' + }) + ,dialogue: new DataStore({ + objectTypename: 'dialogue' + ,fieldList: new FieldList("[id|message|progressQuest|rewardDropListID|replies[text|nextPhraseID|requires_Progress|requires_itemID|requires_Quantity|]|];") + ,idField: 'id' + ,nameField: 'id' + }) + ,monsters: new DataStore({ + objectTypename: 'monster' + ,fieldList: new FieldList("[iconID|name|tags|size|maxHP|maxAP|moveCost|attackCost|attackChance|criticalChance|criticalMultiplier|attackDamage_Min|attackDamage_Max|blockChance|damageResistance|droplistID|phraseID|" + "hasHitEffect|onHit_boostHP_Min|onHit_boostHP_Max|onHit_boostAP_Min|onHit_boostAP_Max|onHit_conditionsSource[condition|magnitude|duration|chance|]|onHit_conditionsTarget[condition|magnitude|duration|chance|]|" - + "];")) + + "];" + ) + ,idField: 'name' + ,nameField: 'name' + }) }; addExampleModelItems(model); diff --git a/AndorsTrailEdit/DataStore.js b/AndorsTrailEdit/DataStore.js index c64053aed..d17ad7b76 100644 --- a/AndorsTrailEdit/DataStore.js +++ b/AndorsTrailEdit/DataStore.js @@ -22,10 +22,11 @@ var specialEncodings = [ ]; -function DataStore(objectTypename, fieldList, nameField) { - this.objectTypename = objectTypename; - this.fieldList = fieldList; - this.nameField = nameField ? nameField : 'name'; +function DataStore(input) { + this.objectTypename = input.objectTypename; + this.fieldList = input.fieldList; + this.nameField = input.nameField ? input.nameField : 'name'; + this.idField = input.idField ? input.idField : 'id'; this.items = []; this.add = function(obj) { @@ -38,7 +39,8 @@ function DataStore(objectTypename, fieldList, nameField) { this.clear = function() { this.items = {}; } this.findById = function(id) { for (var i = 0; i < this.items.length; ++i) { - if (this.items[i].id == id) return this.items[i]; + var item = this.items[i]; + if (item[this.idField] == id) return item; } } diff --git a/AndorsTrailEdit/EditorFunctions.js b/AndorsTrailEdit/EditorFunctions.js index 1582b6a51..154ff2eda 100644 --- a/AndorsTrailEdit/EditorFunctions.js +++ b/AndorsTrailEdit/EditorFunctions.js @@ -63,14 +63,16 @@ function applyCommonEditorBindings(div, obj, dataStore) { } } -function bindFieldToDataStore(field, dataStore, converter) { +function bindFieldToDataStore(field, dataStore) { var dataCallback = function(request, response) { var result = []; var pattern = new RegExp(request.term, "i"); dataStore.items.forEach(function(obj) { - var name = converter(obj); - if (name.match(pattern)) { - result.push(name); + var id = obj[dataStore.idField]; + var name = obj[dataStore.nameField]; + var displayName = name + " (" + id + ")"; + if (displayName.match(pattern)) { + result.push({label: displayName, value: id}); } }); response(result); @@ -85,6 +87,13 @@ function bindFieldToDataStore(field, dataStore, converter) { }); } +function shortenString(str, maxChars) { + if (!str) return str; + str = str.toString(); + if (str.length <= maxChars) return str; + return str.substring(0, maxChars) + ".."; +} + function applyTableEditor(input) { var updateRowText = function(row, obj) { @@ -92,9 +101,7 @@ function applyTableEditor(input) { var id = $( this ).attr("id"); var val = obj[id]; val = val ? val : ""; - $( this ).text(val).shorten({ - width: '200' - }).css('display',''); + $( this ).text(shortenString(val, 30)); }); }; diff --git a/AndorsTrailEdit/Editor_Conversation.js b/AndorsTrailEdit/Editor_Conversation.js index 1aa67e9d9..85f476a26 100644 --- a/AndorsTrailEdit/Editor_Conversation.js +++ b/AndorsTrailEdit/Editor_Conversation.js @@ -64,8 +64,8 @@ function buildEditorForPhrase(div, phrase, tree, treeNode) { checkboxHidesElement( $( '#hasProgressQuest', dialoguePhrase ), $( '#hasProgressQuestDisplay', dialoguePhrase ), phrase.progressQuest); checkboxHidesElement( $( '#hasRewardDroplist', dialoguePhrase ), $( '#hasRewardDroplistDisplay', dialoguePhrase ), phrase.rewardDropListID); - bindFieldToDataStore( $( "#progressQuest", dialoguePhrase ), model.quests , function(obj) { return obj.id; } ); - bindFieldToDataStore( $( "#rewardDropListID", dialoguePhrase ), model.droplists , function(obj) { return obj.id; } ); + bindFieldToDataStore( $( "#progressQuest", dialoguePhrase ), model.quests); + bindFieldToDataStore( $( "#rewardDropListID", dialoguePhrase ), model.droplists); var reloadReplyTable = function() { applyTableEditor({ @@ -177,12 +177,13 @@ function buildEditorForReply(div, reply, tree, treeNode) { checkboxHidesElement( $( '#requiresItems', dialogueReply ), $( '#requiresItemsDisplay', dialogueReply ), reply.requires_itemID); checkboxHidesElement( $( '#requiresQuest', dialogueReply ), $( '#requiresQuestDisplay', dialogueReply ), reply.requires_Progress); - bindFieldToDataStore( $( "#requires_itemID", dialogueReply ), model.items , function(obj) { return obj.searchTag; } ); - bindFieldToDataStore( $( "#requires_Progress", dialogueReply ), model.quests , function(obj) { return obj.id; } ); + bindFieldToDataStore( $( "#requires_itemID", dialogueReply ), model.items); + bindFieldToDataStore( $( "#requires_Progress", dialogueReply ), model.quests); var replyLeadsTo = $( "#replyLeadsTo", dialogueReply ); - replyLeadsTo.change(function() { nextPhraseID.val( $(this).val() ).change(); }); replyLeadsTo.val(reply.nextPhraseID); + if (!replyLeadsTo.val()) { replyLeadsTo.val(""); } + replyLeadsTo.change(function() { nextPhraseID.val( $(this).val() ).change(); }); changeHidesElement(replyLeadsTo, $( "#nextPhraseIDDisplay", dialogueReply ) , function() { return replyLeadsTo.val() == ''; } ); var nextPhraseID = $( "#nextPhraseID", dialogueReply ); @@ -229,11 +230,11 @@ function buildEditorForReply(div, reply, tree, treeNode) { // Tree node title generators function getPhraseNodeText(phrase) { - return phrase.message ? phrase.message : "(no phrase text)"; + return phrase.message ? shortenString(phrase.message, 30) : "(no phrase text)"; } function getReplyNodeText(reply) { - return reply.text ? reply.text : "(no reply text)"; + return reply.text ? shortenString(reply.text, 30) : "(no reply text)"; } // ======================================================== diff --git a/AndorsTrailEdit/Editor_Droplist.js b/AndorsTrailEdit/Editor_Droplist.js index e1edbb08f..41de64c39 100644 --- a/AndorsTrailEdit/Editor_Droplist.js +++ b/AndorsTrailEdit/Editor_Droplist.js @@ -10,7 +10,7 @@ function createDroplistEditor(obj) { array: obj.items, templateFunction: function() { return { quantity: 1, chance: 100 } }, editorSetup: function(div) { - bindFieldToDataStore( $( "#itemID", div ), model.items , function(obj) { return obj.searchTag; } ); + bindFieldToDataStore( $( "#itemID", div ), model.items); } }); diff --git a/AndorsTrailEdit/Editor_Item.js b/AndorsTrailEdit/Editor_Item.js index ff632fd39..e84f48a93 100644 --- a/AndorsTrailEdit/Editor_Item.js +++ b/AndorsTrailEdit/Editor_Item.js @@ -16,7 +16,7 @@ function createItemEditor(obj) { if (!obj.hit_conditionsTarget) obj.hit_conditionsTarget = []; if (!obj.kill_conditionsSource) obj.kill_conditionsSource = []; var setupEditor = function(div) { - bindFieldToDataStore( $( "#condition", div ), model.actorConditions , function(obj) { return obj.id; } ); + bindFieldToDataStore( $( "#condition", div ), model.actorConditions); } applyTableEditor({ @@ -55,6 +55,12 @@ function createItemEditor(obj) { editorSetup: setupEditor }); + $( "#baseMarketCost", div ).change(function() { + var val = parseInt( $( this ).val() ); + $( "#marketCost_Sell", div ).val(Math.round(val * (100 + 15) / 100)); + $( "#marketCost_Buy", div ).val(Math.round(val * (100 - 15) / 100)); + }).change(); + return div; } diff --git a/AndorsTrailEdit/Editor_Monster.js b/AndorsTrailEdit/Editor_Monster.js index 302c43813..dfe788af6 100644 --- a/AndorsTrailEdit/Editor_Monster.js +++ b/AndorsTrailEdit/Editor_Monster.js @@ -1,5 +1,8 @@ function createMonsterEditor(obj) { + if (!obj.maxAP) { obj.maxAP = 10; } + if (!obj.size) { obj.size = "1x1"; } + var div = $( "#templates #editMonster" ).clone(); applyCommonEditorBindings(div, obj, model.monsters); checkboxHidesElement(div.find('#hasConversation'), div.find('#hasConversationDisplay'), obj.phraseID); @@ -7,13 +10,13 @@ function createMonsterEditor(obj) { checkboxHidesElement(div.find('#hasCritical'), div.find('#hasCriticalDisplay'), obj.criticalChance || obj.criticalMultiplier); checkboxHidesElement(div.find('#hasHitEffect'), div.find('#hasHitEffectDisplay'), obj.hasHitEffect); imageSelector.imageify(div.find('#monsterimage'), div.find('#iconID'), 'monsters'); - bindFieldToDataStore( $( "#droplistID", div ), model.droplists , function(obj) { return obj.id; } ); + bindFieldToDataStore( $( "#droplistID", div ), model.droplists ); var createNewCondition = function() { return { chance: 100, magnitude: 1 }; } if (!obj.onHit_conditionsSource) obj.onHit_conditionsSource = []; if (!obj.onHit_conditionsTarget) obj.onHit_conditionsTarget = []; var setupEditor = function(div) { - bindFieldToDataStore( $( "#condition", div ), model.actorConditions , function(obj) { return obj.id; } ); + bindFieldToDataStore( $( "#condition", div ), model.actorConditions ); } applyTableEditor({ table: $( "#onHit_conditionsSource", div ), @@ -29,6 +32,42 @@ function createMonsterEditor(obj) { templateFunction: createNewCondition, editorSetup: setupEditor }); + + var expDependsOn = []; + var div100 = function(v) { return v / 100; } + var v = function(s) { + var field = $( s, div ); + expDependsOn.push(field); + var val = field.val(); + if (!val) return 0; + return parseInt(val); + } + var updateExperience = function() { + /* + final float avgAttackHP = t.getAttacksPerTurn(maxAP) * div100(t.attackChance) * t.damagePotential.averagef() * (1 + div100(t.criticalChance) * t.criticalMultiplier); + final float avgDefenseHP = maxHP * (1 + div100(t.blockChance)) + Constants.EXP_FACTOR_DAMAGERESISTANCE * t.damageResistance; + return (int) Math.ceil((avgAttackHP * 3 + avgDefenseHP) * Constants.EXP_FACTOR_SCALING); + */ + + expDependsOn = []; + + var EXP_FACTOR_DAMAGERESISTANCE = 9; + var EXP_FACTOR_SCALING = 0.7; + + var attacksPerTurn = Math.floor(v("#maxAP") / v("#attackCost")); + var avgDamagePotential = (v("#attackDamage_Min") + v("#attackDamage_Max")) / 2; + var avgAttackHP = attacksPerTurn * div100(v("#attackChance")) * avgDamagePotential * (1 + div100(v("#criticalChance")) * v("#criticalMultiplier")); + var avgDefenseHP = v("#maxHP") * (1 + div100(v("#blockChance"))) + EXP_FACTOR_DAMAGERESISTANCE * v("#damageResistance"); + var experience = (avgAttackHP * 3 + avgDefenseHP) * EXP_FACTOR_SCALING; + + $( "#experience", div ).val(Math.ceil(experience)); + }; + + updateExperience(); + jQuery.each(expDependsOn, function(idx, o) { + o.change(updateExperience); + }); + return div; } diff --git a/AndorsTrailEdit/editor.html b/AndorsTrailEdit/editor.html index f10ea7636..f429c4095 100644 --- a/AndorsTrailEdit/editor.html +++ b/AndorsTrailEdit/editor.html @@ -19,7 +19,7 @@
+