[charactermanager] r356 committed - corrected attack calculation...

0 views
Skip to first unread message

codesite...@google.com

unread,
Oct 9, 2009, 2:33:05 PM10/9/09
to characterman...@googlegroups.com
Revision: 356
Author: todd.chambery
Date: Fri Oct 9 11:32:13 2009
Log: corrected attack calculation
- char override
- weapon proficiency
removed spell selection restriction from wizard class
added "bare" base attack bonus to main page
moved log button to the top bar
http://code.google.com/p/charactermanager/source/detail?r=356

Added:
/trunk/charmgrjs/tooltip.css
/trunk/charmgrjs/tooltip.js
Modified:
/trunk/charmgrjs/charmgr.css
/trunk/charmgrjs/charmgr.html
/trunk/charmgrjs/common.js
/trunk/charmgrjs/edit.js
/trunk/charmgrjs/edit_spells.js
/trunk/charmgrjs/edit_weapons.js
/trunk/charmgrjs/main.js

=======================================
--- /dev/null
+++ /trunk/charmgrjs/tooltip.css Fri Oct 9 11:32:13 2009
@@ -0,0 +1,14 @@
+.tip {
+ font: 10px/ 12px Arial, Helvetica, sans-serif;
+ border: solid 1px #666666;
+ width: 270px;
+ padding: 1px;
+ position: absolute;
+ z-index: 100;
+ visibility: hidden;
+ color: #333333;
+ top: 20px;
+ left: 90px;
+ background-color: #ffffcc;
+ layer-background-color: #ffffcc;
+}
=======================================
--- /dev/null
+++ /trunk/charmgrjs/tooltip.js Fri Oct 9 11:32:13 2009
@@ -0,0 +1,6 @@
+// Extended Tooltip Javascript
+// copyright 9th August 2002, 3rd July 2005, 24th August 2008
+// by Stephen Chapman, Felgall Pty Ltd
+
+// permission is granted to use this javascript provided that the below
code is not altered
+function pw() {return window.innerWidth ||
document.documentElement.clientWidth || document.body.clientWidth};
function mouseX(evt) {return evt.clientX ? evt.clientX +
(document.documentElement.scrollLeft || document.body.scrollLeft) :
evt.pageX;} function mouseY(evt) {return evt.clientY ? evt.clientY +
(document.documentElement.scrollTop || document.body.scrollTop) :
evt.pageY} function popUp(evt,oi) {if (document.getElementById) {var wp =
pw(); dm = document.getElementById(oi); ds = dm.style; st = ds.visibility;
if (dm.offsetWidth) ew = dm.offsetWidth; else if (dm.clip.width) ew =
dm.clip.width; if (st == "visible" || st == "show") { ds.visibility
= "hidden"; } else {tv = mouseY(evt) + 20; lv = mouseX(evt) - (ew/4); if
(lv < 2) lv = 2; else if (lv + ew > wp) lv -= ew/2; lv += 'px';tv += 'px';
ds.left = lv; ds.top = tv; ds.visibility = "visible";}}}
=======================================
--- /trunk/charmgrjs/charmgr.css Mon Oct 5 09:19:03 2009
+++ /trunk/charmgrjs/charmgr.css Fri Oct 9 11:32:13 2009
@@ -134,5 +134,9 @@
}

.even_row {
- background-color: #eaeaea
-}
+ background-color: #eaeaea;
+}
+
+input.two_digit {
+ width: 20px;
+}
=======================================
--- /trunk/charmgrjs/charmgr.html Mon Oct 5 09:19:03 2009
+++ /trunk/charmgrjs/charmgr.html Fri Oct 9 11:32:13 2009
@@ -10,6 +10,8 @@
</script>
<script type='text/javascript' src='jquery.selectboxes.js'>
</script>
+ <script type="text/javascript" src="tooltip.js">
+ </script>
<script type='text/javascript' src='common.js'>
</script>
<script type='text/javascript' src='views.js'>
@@ -46,6 +48,9 @@
<style type="text/css" media="all">
@import "jquery-ui-1.7.2.custom.css";
</style>
+ <style type="text/css" media="all">
+ @import "tooltip.css";
+ </style>
<meta http-equiv="Content-Type" content= "text/html;
charset=iso-8859-1">
<title>D&amp;D Character Manager</title>
</head>
=======================================
--- /trunk/charmgrjs/common.js Fri Oct 9 03:40:47 2009
+++ /trunk/charmgrjs/common.js Fri Oct 9 11:32:13 2009
@@ -42,7 +42,7 @@
$('#linkspart')
.html(
links_html
- + "<td class='view box'><a id='load' class='view'
onclick='import_character()'>Load</a></td><td class='view box'><a id='load'
class='view' onclick='export_character()'>Save</a></td><td align='right'
style='width: 100%; color: blue'>"
+ + "<td class='view box'><a id='load' class='view'
onclick='import_character()'>Load</a></td><td class='view box'><a id='load'
class='view' onclick='export_character()'>Save</a></td><td class='view
box'><a id='load' class='view' onclick='export_character()'>Log</a></td><td
align='right' style='width: 100%; color: blue'>"
+ chardata['name'] + "</td><td style='color: blue'>" +
race.shortname + "</td><td style='color: blue'>" + clazz.shortname
+ "</td><td style='color: blue'>(" + (calc_level(chardata['xp']) + 1)
+ ")</td></tr></table>");
}

@@ -265,7 +265,11 @@
var weapon_damage = (char_weapon != null && char_weapon.dam != null ?
char_weapon.dam.toString() : weapon.dam.toString()).split('/');
var damage = '';
for(var i in weapon_damage) {
- damage += weapon_damage[i] +
pos(Math.max(calc_ability_modifier(ability_score), 1) + feat_mod);
+ // scrape out the mod
+ var dam_components = weapon_damage[i].split(/\+|-/);
+ var die = dam_components[0];
+ var weapon_mod = dam_components.length > 1 ?
parseInt(dam_components[1]) : 0;
+ damage += die + pos(Math.max(calc_ability_modifier(ability_score), 1) +
feat_mod + weapon_mod);
damage += (parseInt(i) + 1 < weapon_damage.length ? ' / ' : '');
}
return damage;
=======================================
--- /trunk/charmgrjs/edit.js Fri Oct 9 03:40:47 2009
+++ /trunk/charmgrjs/edit.js Fri Oct 9 11:32:13 2009
@@ -44,10 +44,10 @@
}
ability_html += "</tr>\n<tr>";
for (id in abilities) {
- ability_html += "<td align='center'><input id='ability_" + abilities[id]
+ "' style='width: 20px' name='" + abilities[id]
+ ability_html += "<td align='center'><input id='ability_" + abilities[id]
+ "' class='two_digit' name='" + abilities[id]
+ "score' value='' onblur='recalc_edit_page(chardata)'
type='text'></td>";
}
- ability_html += "<td><b>XP</b><input id='xp' type='text' name='xp'
value='' size='5' onblur='recalc_edit_page(chardata)'/> &nbsp;<input
type='button' style='width: 35px' onclick='update_log(chardata)'
value='Log' /></td>";
+ ability_html += "<td><b>XP</b> <input id='xp' type='text' name='xp'
value='' size='5' onblur='recalc_edit_page(chardata)'/></td>";
ability_html += "</tr>\n<tr>";

// race mods
@@ -87,7 +87,7 @@
skill_html += "<tr><td><a id='skill_" + allskills[skill].id
+ "' class='fake_link' onclick='show_item_detail(skills, " +
allskills[skill].id + ")'>"
+ allskills[skill].name + "</a></td><td><input id='skill_" +
allskills[skill].id
- + "_input' style='width: 20px' value=''
onblur='recalc_edit_page(chardata)'></td></tr>";
+ + "_input' class='two_digit' value=''
onblur='recalc_edit_page(chardata)'></td></tr>";
$('#skill_' +
allskills[skill].id).bind('blur', 'recalc_edit_page(chardata)');
}
skill_html += "</table>";
=======================================
--- /trunk/charmgrjs/edit_spells.js Tue Sep 22 18:50:15 2009
+++ /trunk/charmgrjs/edit_spells.js Fri Oct 9 11:32:13 2009
@@ -14,14 +14,14 @@
var spells_html = "<form>";
for ( var i in clazz.spells_known[level]) {
if (clazz.spells_known[level][i] != '-') {
+ // wizards don't have known spells
var curr_spells_chosen_count = chardata['spells'][i] == null ? 0 :
chardata['spells'][i].length;
+ var spell_selections_remaining = clazz.id == 9 ? "Spell selections
remaining: " + (clazz.spells_known[level][i] -
curr_spells_chosen_count) : "";
spells_html += "<div style='float: left; font-size: x-small;
background-color: #8DC3E9'>Level "
+ i
+ "</div><div id='spells_remaining_"
+ i
- + "' style='float: right; font-size: x-small; background-color:
#8DC3E9'>Spell selections remaining: "
- + (clazz.spells_known[level][i] - curr_spells_chosen_count)
- + "&nbsp;</div><div style='clear: both'></div>";
+ + "' style='float: right; font-size: x-small; background-color:
#8DC3E9'></div><div style='clear: both'></div>";
spells_html += "<div id='spells_" + i
+ "'><table style='border: 1px solid #D0D0D0' width='100%' border='0'
margin='0'><tr><tr>";
for ( var j in clazz.spells[i]) {
@@ -57,13 +57,15 @@
// parse the current
var spells_remaining_text = $('#spells_remaining_' + level).text();
var spells_remaining =
parseInt(spells_remaining_text.substring(spells_remaining_text.indexOf(":")
+ 2));
- if (!checked || spells_remaining > 0) {
- $('#spells_remaining_' + level).text("Spell selections remaining: " +
(spells_remaining + (checked ? -1 : 1)));
- } else {
- $('#spell_' + spell_id).attr('checked', false);
- alert('No spells selections remaining.');
- }
-
+ // wizards don't have known spells
+ if(clazz.id == 9) {
+ if (!checked || spells_remaining > 0) {
+ $('#spells_remaining_' + level).text("Spell selections remaining: " +
(spells_remaining + (checked ? -1 : 1)));
+ } else {
+ $('#spell_' + spell_id).attr('checked', false);
+ alert('No spells selections remaining.');
+ }
+ }
// need to check the screen, since the above code may have unchecked (over
// the max)
if ($('#spell_' + spell_id).attr('checked')) {
=======================================
--- /trunk/charmgrjs/edit_weapons.js Sun Oct 4 15:06:05 2009
+++ /trunk/charmgrjs/edit_weapons.js Fri Oct 9 11:32:13 2009
@@ -86,6 +86,8 @@
var value = $("#" + id_name + "_" + item_index + edit_attr_name).val();
if(value != null && value.length > 0) {
chardata[data_name][item_index][edit_attr_name] = value;
+ } else {
+ delete chardata[data_name][item_index][edit_attr_name];
}
}

=======================================
--- /trunk/charmgrjs/main.js Fri Oct 9 03:40:47 2009
+++ /trunk/charmgrjs/main.js Fri Oct 9 11:32:13 2009
@@ -47,7 +47,7 @@
function build_main_page(chardata) {
set_links_part(chardata, 0);
// build the div structure
- var main_page_layout = "<div id='topline'></div><div id='topleft'
class='dp66'><div id='abilitiespart' class='dp50'></div><div
id='middlepart' class='dp40'><div id='someotherpart'></div></div><div
id='featspart' class='dp100'></div><div id='specialpart'
class='dp100'></div><div id='weaponspart' class='dp100'></div><div
id='armorpart' class='dp100'></div><div id='spellspart'
class='dp100'></div></div><div id='skillspart' class='dp33'></div>";
+ var main_page_layout = "<div id='topline'></div><div id='topleft'
class='dp66'><div id='abilitiespart' class='dp40' style='float:
left'></div><div id='middlepart' class='dp50' style='margin-left: 10px;
float: left;'></div><div id='featspart' class='dp100'></div><div
id='specialpart' class='dp100'></div><div id='weaponspart'
class='dp100'></div><div id='armorpart' class='dp100'></div><div
id='spellspart' class='dp100'></div></div><div id='skillspart'
class='dp33'></div>";
$('#content').html(main_page_layout);

// ability scores
@@ -56,7 +56,7 @@
ability_html += "<tr><td><b>" + abilities[id] + "</b>:</td>";
ability_html += "<td id='ability_score_full" + id + "'></td>";
ability_html += "<td><input ability_id='" + id + "' id='ability_" + id
- + "_score' size='1' value='' type='text'
onblur='recalc_main_page(chardata)'></td>";
+ + "_score' class='two_digit' value='' type='text'
onblur='recalc_main_page(chardata)'></td>";
ability_html += "<td id='ability_" + id + "_mod'
align='right'></td></tr>";
}

@@ -85,8 +85,9 @@
var fort_html = "<tr><td>Fort</td><td id='fort' class='box
numeric'></td><td>Touch</td><td id='touch' class='box numeric'></td></tr>";
var ref_html = "<tr><td>Ref</td><td id='ref' class='box
numeric'></td><td>Flat</td><td id='flat' class='box numeric'></td></tr>";
var will_html = "<tr><td>Will</td><td id='will' class='box
numeric'></td><td>SR</td><td id='spell_resistance' class='box
numeric'></td></tr>";
- will_html += "<tr><td colspan='4'><input id='add_note' type='button'
onclick='show_note_dialog()' /></td></tr>";
- $('#someotherpart').html(ac_html + init_html + spacer + fort_html +
ref_html + will_html + "</table>");
+ will_html += "<tr><td>Att</td><td><input id='attack_mod' type='text'
class='two_digit'/></td><td><input type='button' text='+' /></td><td><input
type='button' text='+' /></td></tr>";
+ will_html += "<tr><td>Dam</td><td><input id='damage_mod' type='text'
class='two_digit'/></td><td><input type='button' text='+' /></td><td><input
type='button' text='+' /></td></tr>";
+ $('#middlepart').html(ac_html + init_html + spacer + fort_html + ref_html
+ will_html + "</table>");

// conditional feats
// TODO - this should be on a slider
@@ -174,7 +175,8 @@


// weapons
- var weapon_html = "";
+ // base attack information
+ var weapon_html = "Base Attack Bonus: <span
id='base_attack_bonus'></span>";
for (var j in chardata.weapons) {
var weapon_data = weapons.first( {
id : chardata.weapons[j]['weapon_id']
@@ -190,7 +192,7 @@
weapon_html += "<tr><td>Att</td><td id='weapon_" + j + "_att'
class='box' width='100%'></td></tr>";
weapon_html += "<tr><td>Dam</td><td id='weapon_" + j + "_dam'
class='box' width='100%'></td></tr>";
weapon_html += "<tr><td>Crit</td><td id='weapon_" + j + "_crit'
width='100%'></td></tr>";
- weapon_html += "<tr><td valign='top'>Note</td><td id='weapon_" + j
+ "_note' width='100%'></td></tr>";
+ weapon_html += "<tr><td valign='top'>Note</td><td id='weapon_" + j
+ "_note' width='100%'></td></tr></table>";
}
$('#weaponspart').html(weapon_html);

@@ -206,7 +208,7 @@
// populate with char overrides
armor_html += "<tr><td>Bon</td><td id='armor_" + j + "_bon' class='box'
width='100%'></td></tr>";
armor_html += "<tr><td>ACP</td><td id='armor_" + j + "_acp' class='box'
width='100%'></td></tr>";
- armor_html += "<tr><td valign='top'>Note</td><td id='armor_" + j
+ "_note' width='100%'></td></tr>";
+ armor_html += "<tr><td valign='top'>Note</td><td id='armor_" + j
+ "_note' width='100%'></td></tr></table>";
}
$('#armorpart').html(armor_html);

@@ -311,7 +313,9 @@
$('#hp').text(chardata.hp == null ? '' : calc_hp(chardata.hp,
chardata.feats));
$('#hp_input').val(chardata.hp == null ? '' : chardata.hp);
$('#level').text(calc_level(chardata.xp == null ? 0 : chardata.xp) + 1);
-
+// $('#attack_mod').spinner();
+// $('#damage_mod').spinner();
+
// ability scores
var allabilities = chardata.abilities;
for (id in abilities) {
@@ -347,6 +351,7 @@
}

function recalc_main_page(chardata) {
+ clazz = classes.first({ id: chardata.class_id });
var str_score = $('#ability_0_score').val();
var dex_score = $('#ability_1_score').val();
var con_score = $('#ability_3_score').val();
@@ -406,14 +411,22 @@
$('#touch').text(calc_touch_ac(dex_score, chardata.race_id,
chardata.feats));
$('#flat').text(calc_flat_footed_ac(chardata.armor));
$('#spell_resistance').text(calc_spell_resistance(chardata));
+
+ // TODO - refactor to consolidate with calc_attack
+ var base_attack_bonuses =
clazz.base_attack_bonus[level].toString().split('/');
+ // recompose with modifiers thrown in
+ var attacks = '';
+ for (i in base_attack_bonuses) {
+ attacks += pos(parseInt(base_attack_bonuses[i]));
+ attacks += (parseInt(i) + 1 < base_attack_bonuses.length ? '/' : '');
+ }
+
+ $('#base_attack_bonus').text(attacks);
// spells
// TODO - what's the modifier for SPD?
var spells_per_day = [ 0, 0, 0, 0, 0, 0 ];
- if (chardata.class_id != null) {
- var spells_per_day = classes.first( {
- id : chardata.class_id
- }).spells_per_day[level];
- }
+ spells_per_day = clazz.spells_per_day[level];
+
for (var i in spells_per_day) {
$('#spd_count' + i).text(spells_per_day[i]);
}
@@ -468,7 +481,7 @@
}

function calc_attack(str_score, dex_score, class_id, xp, char_weapon,
weapon, char_feats) {
- var attack_override = char_weapon.attack != null ?
parseInt(char_weapon.attack) : 0;
+ var attack_override = char_weapon.att != null ?
parseInt(char_weapon.att) : 0;
var ability_score = str_score;
// weapon finesse
var has_weapon_finesse = char_feats != null && char_feats.first({
@@ -490,17 +503,17 @@
if (char_feats != null) {
if(weapon.category == 'simple') {
var simple_weapon_prof = char_feats.first({ feat_id: 61 });
- if(is_class_feat(class_id, xp, 61) || simple_weapon_prof &&
jQuery.inArray(String(weapon.id), simple_weapon_prof.multi) > -1) {
+ if(is_class_feat(class_id, 61, xp) || (simple_weapon_prof &&
(jQuery.inArray(String(weapon.id), simple_weapon_prof.multi) > -1))) {
weapon_proficiency = 0;
}
} else if (weapon.category == 'martial') {
var martial_weapon_prof = char_feats.first({ feat_id: 43 });
- if(is_class_feat(class_id, xp, 43) || martial_weapon_prof &&
jQuery.inArray(String(weapon.id), martial_weapon_prof.multi) > -1) {
+ if(is_class_feat(class_id, 43, xp) || (martial_weapon_prof &&
(jQuery.inArray(String(weapon.id), martial_weapon_prof.multi) > -1))) {
weapon_proficiency = 0;
}
} else if (weapon.category == 'exotic') {
var exotic_weapon_prof = char_feats.first({ feat_id: 24 });
- if(exotic_weapon_prof && jQuery.inArray(String(weapon.id),
exotic_weapon_prof.multi) > -1) {
+ if(exotic_weapon_prof && (jQuery.inArray(String(weapon.id),
exotic_weapon_prof.multi) > -1)) {
weapon_proficiency = 0;
}
}
@@ -515,6 +528,7 @@
}
}

+ var clazz = classes.first({ id: class_id });
// Melee Attack Roll: 1d20 + base attack bonus + Strength modifier + size
modifier.
// Ranged Attack Roll: 1d20 + Base attack bonus + Dexterity modifier +
size modifier + range penalty
base_attack_bonus = clazz.base_attack_bonus[calc_level(xp)];

Reply all
Reply to author
Forward
0 new messages