Merge pull request #4 from Cynicide/add-skill-designations

Add skill designations
This commit is contained in:
Cynicide 2022-09-14 20:01:17 +10:00 committed by GitHub
commit cfc645d888
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 191 additions and 143 deletions

View File

@ -9,18 +9,30 @@ Small
DONE - Skills and Skill Categories are now seperate checks for Drag and Drop as some share names DONE - Skills and Skill Categories are now seperate checks for Drag and Drop as some share names
Spells ? Spells ?
5. Fix New Ranks Clickboxes - https://discord.com/channels/170995199584108546/670336275496042502/1018530650980102195 5. Fix New Ranks Clickboxes - https://discord.com/channels/170995199584108546/670336275496042502/1018530650980102195
6. Fix Favorites Clickboxes on Actor Page https://github.com/megastruktur/foundryvtt-blades-in-the-dark/blob/master/templates/actor-sheet.html#L97
https://github.com/megastruktur/foundryvtt-blades-in-the-dark/blob/00bed1cb1d222eab3ece62960941c54f3c272aac/module/blades.js#L69
6. DONE - Fix Favorites Clickboxes on Actor Page
DONE - Better Icon
DONE - Make Clickable
7. Create Default Values for Character sheet
Medium Medium
4. Inventory sorted by types 1. Inventory sorted by types
i. Drag and drop should increment an item if it already exists. i. Drag and drop should increment an item if it already exists.
ii. Equipables ii. Equipables
iii. Favorites iii. Favorites
5. Creature Sheet 2. Creature Sheet
6. Finish Character Sheet 3. Finish Character Sheet
Inventory
Spells
Status Record (Possibly large)
XP
4. Button to add all Skill Categories
5. Revisit Skill and Skill Category Progression (Pg 33)
6. DONE - Add occupational, everyman, and restricted skill categories
Large Large
6. Dice Roller 1. Dice Roller
7. Initiative System 2. Initiative System

View File

@ -50,4 +50,11 @@ rmss.stats = {
fullname: "Strength", fullname: "Strength",
shortname: "St" shortname: "St"
} }
} };
rmss.skill_designations = {
none: "None",
occupational: "Occupational",
everyman: "Everyman",
restricted: "Restricted"
};

View File

@ -49,10 +49,10 @@ export default class RMSSPlayerSheet extends ActorSheet {
console.log(owneditems); console.log(owneditems);
var owneditemslist = Object.values(owneditems); var ownedskillcatlist = Object.values(owneditems);
// Check if the dragged item is not in the array and not owned // Check if the dragged item is not in the array and not owned
if (!owneditemslist.includes(itemData.name)) { if (!ownedskillcatlist.includes(itemData.name)) {
console.log("Not Owned!"); console.log("Not Owned!");
super._onDropItem(event, data); super._onDropItem(event, data);
} }
@ -62,10 +62,10 @@ export default class RMSSPlayerSheet extends ActorSheet {
console.log(owneditems); console.log(owneditems);
var owneditemslist = Object.values(owneditems); var ownedskilllist = Object.values(owneditems);
// Check if the dragged item is not in the array and not owned // Check if the dragged item is not in the array and not owned
if (!owneditemslist.includes(itemData.name)) { if (!ownedskilllist.includes(itemData.name)) {
console.log("Not Owned!"); console.log("Not Owned!");
super._onDropItem(event, data); super._onDropItem(event, data);
} }
@ -155,6 +155,21 @@ export default class RMSSPlayerSheet extends ActorSheet {
//console.log(ev.currentTarget.getAttribute("data-item-id")); //console.log(ev.currentTarget.getAttribute("data-item-id"));
item.delete(); item.delete();
}); });
// Check/Uncheck Favorite
html.find('.skill-favorite').click(ev => {
const item = this.actor.items.get(ev.currentTarget.getAttribute("data-item-id"));
console.log(item);
console.log("Before change: " + item.system.favorite);
if (item.system.favorite === true) {
console.log("Setting False");
item.update({system: {"favorite": false}});
} else {
console.log("Setting True");
item.update({system: {"favorite": true}});
}
console.log("After change: " + item.system.favorite);
});
} }
async _onItemCreate(event) { async _onItemCreate(event) {

View File

@ -21,7 +21,10 @@ export default class RMSSSkillSheet extends ItemSheet {
const baseData = await super.getData(); const baseData = await super.getData();
var enrichedDescription = await TextEditor.enrichHTML(this.item.system.description, {async: true}); var enrichedDescription = await TextEditor.enrichHTML(this.item.system.description, {async: true});
// Get a list of stats that can be used as applicable stats
var designations = this.getSkillDesignations(CONFIG);
// Get a list of the parent item's skill categories for the dropdown // Get a list of the parent item's skill categories for the dropdown
var owned_skillcats = this.prepareSkillCategoryValues(); var owned_skillcats = this.prepareSkillCategoryValues();
@ -38,7 +41,8 @@ export default class RMSSSkillSheet extends ItemSheet {
config: CONFIG.rmss, config: CONFIG.rmss,
owned_skillcats: owned_skillcats, owned_skillcats: owned_skillcats,
enrichedDescription: enrichedDescription, enrichedDescription: enrichedDescription,
selected_skillcat: selected_skillcat selected_skillcat: selected_skillcat,
designations: designations
}; };
return sheetData; return sheetData;
@ -58,6 +62,16 @@ export default class RMSSSkillSheet extends ItemSheet {
} }
} }
getSkillDesignations(CONFIG) {
var designations = {};
// Get a list of designations from the config
for (const item in CONFIG.rmss.skill_designations) {
designations[CONFIG.rmss.skill_designations[item]] = CONFIG.rmss.skill_designations[item];
}
return designations;
}
// Determine which Stat is selected and test that it is in the current list of categories. // Determine which Stat is selected and test that it is in the current list of categories.
prepareSelectedSkillCategory(ownedskillcats, selected_category) { prepareSelectedSkillCategory(ownedskillcats, selected_category) {

View File

@ -35,8 +35,8 @@ async function preloadHandlebarsTemplates() {
"systems/rmss/templates/sheets/actors/parts/actor-fav-skills.html", "systems/rmss/templates/sheets/actors/parts/actor-fav-skills.html",
"systems/rmss/templates/sheets/actors/parts/actor-items.html", "systems/rmss/templates/sheets/actors/parts/actor-items.html",
"systems/rmss/templates/sheets/actors/parts/actor-money.html", "systems/rmss/templates/sheets/actors/parts/actor-money.html",
"systems/rmss/templates/sheets/actors/parts/actor-skill-categories-grid.html", "systems/rmss/templates/sheets/actors/parts/actor-skill-categories.html",
"systems/rmss/templates/sheets/actors/parts/actor-skills-grid.html" "systems/rmss/templates/sheets/actors/parts/actor-skills.html"
]; ];
return loadTemplates(templatePaths); return loadTemplates(templatePaths);
} }

View File

@ -81,92 +81,92 @@
"stats": { "stats": {
"agility": { "agility": {
"shortname": "Ag", "shortname": "Ag",
"temp": 1, "temp": 0,
"potential": 2, "potential": 0,
"basic_bonus": 3, "basic_bonus": 0,
"racial_bonus": 4, "racial_bonus": 0,
"special_bonus": 5, "special_bonus": 0,
"stat_bonus": 0 "stat_bonus": 0
}, },
"constitution": { "constitution": {
"shortname": "Co", "shortname": "Co",
"temp": 6, "temp": 0,
"potential": 7, "potential": 0,
"basic_bonus": 8, "basic_bonus": 0,
"racial_bonus": 9, "racial_bonus": 0,
"special_bonus": 10, "special_bonus": 0,
"stat_bonus": 0 "stat_bonus": 0
}, },
"memory": { "memory": {
"shortname": "Me", "shortname": "Me",
"temp": 11, "temp": 0,
"potential": 12, "potential": 0,
"basic_bonus": 13, "basic_bonus": 0,
"racial_bonus": 14, "racial_bonus": 0,
"special_bonus": 15, "special_bonus": 0,
"stat_bonus": 0 "stat_bonus": 0
}, },
"reasoning": { "reasoning": {
"shortname": "Re", "shortname": "Re",
"temp": 16, "temp": 0,
"potential": 17, "potential": 0,
"basic_bonus": 18, "basic_bonus": 0,
"racial_bonus": 19, "racial_bonus": 0,
"special_bonus": 20, "special_bonus": 0,
"stat_bonus": 0 "stat_bonus": 0
}, },
"self_discipline": { "self_discipline": {
"shortname": "SD", "shortname": "SD",
"temp": 21, "temp": 0,
"potential": 22, "potential": 0,
"basic_bonus": 23, "basic_bonus": 0,
"racial_bonus": 24, "racial_bonus": 0,
"special_bonus": 25, "special_bonus": 0,
"stat_bonus": 0 "stat_bonus": 0
}, },
"empathy": { "empathy": {
"shortname": "Em", "shortname": "Em",
"temp": 26, "temp": 0,
"potential": 27, "potential": 0,
"basic_bonus": 28, "basic_bonus": 0,
"racial_bonus": 29, "racial_bonus": 0,
"special_bonus": 30, "special_bonus": 0,
"stat_bonus": 0 "stat_bonus": 0
}, },
"intuition": { "intuition": {
"shortname": "In", "shortname": "In",
"temp": 31, "temp": 0,
"potential": 32, "potential": 0,
"basic_bonus": 33, "basic_bonus": 0,
"racial_bonus": 34, "racial_bonus": 0,
"special_bonus": 35, "special_bonus": 0,
"stat_bonus": 0 "stat_bonus": 0
}, },
"presence": { "presence": {
"shortname": "Pr", "shortname": "Pr",
"temp": 36, "temp": 0,
"potential": 37, "potential": 0,
"basic_bonus": 38, "basic_bonus": 0,
"racial_bonus": 39, "racial_bonus": 0,
"special_bonus": 40, "special_bonus": 0,
"stat_bonus": 0 "stat_bonus": 0
}, },
"quickness": { "quickness": {
"shortname": "Qu", "shortname": "Qu",
"temp": 41, "temp": 0,
"potential": 42, "potential": 0,
"basic_bonus": 43, "basic_bonus": 0,
"racial_bonus": 44, "racial_bonus": 0,
"special_bonus": 45, "special_bonus": 0,
"stat_bonus": 0 "stat_bonus": 0
}, },
"strength": { "strength": {
"shortname": "St", "shortname": "St",
"temp": 46, "temp": 0,
"potential": 47, "potential": 0,
"basic_bonus": 48, "basic_bonus": 0,
"racial_bonus": 49, "racial_bonus": 0,
"special_bonus": 50, "special_bonus": 0,
"stat_bonus": 0 "stat_bonus": 0
} }
} }
@ -266,24 +266,25 @@
"category" : "", "category" : "",
"ranks": 0, "ranks": 0,
"new_ranks": 0, "new_ranks": 0,
"rank_bonus": 0, "rank_bonus": -15,
"category_bonus": 0, "category_bonus": 0,
"item_bonus": 0, "item_bonus": 0,
"special_bonus_1": 0, "special_bonus_1": 0,
"special_bonus_2": 0, "special_bonus_2": 0,
"total_bonus": 0, "total_bonus": 0,
"favorite": false "favorite": false,
"designation": "None"
}, },
"skill_category": { "skill_category": {
"templates": ["base"], "templates": ["base"],
"applicable_stats": "St/Ag/St", "applicable_stats": "None",
"app_stat_1": "None", "app_stat_1": "None",
"app_stat_2": "None", "app_stat_2": "None",
"app_stat_3": "None", "app_stat_3": "None",
"development_cost": "0", "development_cost": "0",
"ranks": 0, "ranks": 0,
"new_ranks": 0, "new_ranks": 0,
"rank_bonus": 0, "rank_bonus": -15,
"stat_bonus": 0, "stat_bonus": 0,
"prof_bonus": 0, "prof_bonus": 0,
"special_bonus_1": 0, "special_bonus_1": 0,

View File

@ -1,35 +1,33 @@
<table> <div class="skillcat-grid-container">
<th><div class="table-font table-bold table-center">{{ localize "rmss.pc_sheet_skill_categories.skillcat_name" }}</div></th> <div class="skillcat-grid-heading">{{ localize "rmss.pc_sheet_skill_categories.skillcat_name" }}</div>
<th><div class="table-font table-bold table-center">{{ localize "rmss.pc_sheet_skill_categories.applicable_stats" }}</div></th> <div class="skillcat-grid-heading">{{ localize "rmss.pc_sheet_skill_categories.applicable_stats" }}</div>
<th><div class="table-font table-bold table-center">{{ localize "rmss.pc_sheet_skill_categories.dev_cost" }}</div></th> <div class="skillcat-grid-heading">{{ localize "rmss.pc_sheet_skill_categories.dev_cost" }}</div>
<th><div class="table-font table-bold table-center">{{ localize "rmss.pc_sheet_skill_categories.ranks" }}</div></th> <div class="skillcat-grid-heading">{{ localize "rmss.pc_sheet_skill_categories.ranks" }}</div>
<th><div class="table-font table-bold table-center">{{ localize "rmss.pc_sheet_skill_categories.new_ranks" }}</div></th> <div class="skillcat-grid-heading">{{ localize "rmss.pc_sheet_skill_categories.new_ranks" }}</div>
<th><div class="table-font table-bold table-center">{{ localize "rmss.pc_sheet_skill_categories.rank_bonus" }}</div></th> <div class="skillcat-grid-heading">{{ localize "rmss.pc_sheet_skill_categories.rank_bonus" }}</div>
<th><div class="table-font table-bold table-center">{{ localize "rmss.pc_sheet_skill_categories.stat_bonus" }}</div></th> <div class="skillcat-grid-heading">{{ localize "rmss.pc_sheet_skill_categories.stat_bonus" }}</div>
<th><div class="table-font table-bold table-center">{{ localize "rmss.pc_sheet_skill_categories.prof_bonus" }}</div></th> <div class="skillcat-grid-heading">{{ localize "rmss.pc_sheet_skill_categories.prof_bonus" }}</div>
<th><div class="table-font table-bold table-center">{{ localize "rmss.pc_sheet_skill_categories.special_bonus" }}</div></th> <div class="skillcat-grid-heading">{{ localize "rmss.pc_sheet_skill_categories.special_bonus" }}</div>
<th><div class="table-font table-bold table-center">{{ localize "rmss.pc_sheet_skill_categories.special_bonus" }}</div></th> <div class="skillcat-grid-heading">{{ localize "rmss.pc_sheet_skill_categories.special_bonus" }}</div>
<th><div class="table-font table-bold table-center">{{ localize "rmss.pc_sheet_skill_categories.total_bonus" }}</div></th> <div class="skillcat-grid-heading">{{ localize "rmss.pc_sheet_skill_categories.total_bonus" }}</div>
<th><div class="table-controls"> <div class="skillcat-grid-heading">
<a class="item-create" title="Create Skill Category" data-type="skill_category"><i class="fas fa-plus"></i>{{ localize "rmss.pc_sheet_skill_categories.add_skillcat" }}</a> <!-- <a class="item-create" title="Create Skill Category" data-type="skill_category"><i class="fas fa-plus"></i>{{ localize "rmss.pc_sheet_skill_categories.add_skillcat" }}</a>-->
</div></th> </div>
{{#each skillcat as |skill_category id|}} {{#each skillcat as |skill_category id|}}
<tr class="item" data-item-id="{{skill_category._id}}"> <div>{{skill_category.name}}</div>
<td><div class="table-font table-bold">{{skill_category.name}}</div></td> <div>{{skill_category.system.applicable_stats}}</div>
<td><div class="table-font">{{skill_category.system.applicable_stats}}</div></td> <div>{{skill_category.system.development_cost}}</div>
<td><div class="table-font">{{skill_category.system.development_cost}}</div></td> <div>{{skill_category.system.ranks}}</div>
<td><div class="table-font">{{skill_category.system.ranks}}</div></td> <div>{{skill_category.system.new_ranks}}</div>
<td><div class="table-font">{{skill_category.system.new_ranks}}</div></td> <div>{{skill_category.system.rank_bonus}}</div>
<td><div class="table-font">{{skill_category.system.rank_bonus}}</div></td> <div>{{skill_category.system.stat_bonus}}</div>
<td><div class="table-font">{{skill_category.system.stat_bonus}}</div></td> <div>{{skill_category.system.prof_bonus}}</div>
<td><div class="table-font">{{skill_category.system.prof_bonus}}</div></td> <div>{{skill_category.system.special_bonus_1}}</div>
<td><div class="table-font">{{skill_category.system.special_bonus_1}}</div></td> <div>{{skill_category.system.special_bonus_2}}</div>
<td><div class="table-font">{{skill_category.system.special_bonus_2}}</div></td> <div>{{skill_category.system.total_bonus}}</div>
<td><div class="table-font">{{skill_category.system.total_bonus}}</div></td> <div>
<td><div class="table-controls"> <a class="item-edit" title="Edit Category" data-item-id="{{skill_category._id}}"><i class="fas fa-edit"></i></a>
<a class="item-edit" title="Edit Category"><i class="fas fa-edit"></i></a> <a class="item-delete item" title="Delete Category" data-item-id="{{skill_category._id}}"><i class="fas fa-trash"></i></a>
<a class="item-delete" title="Delete Category"><i class="fas fa-trash"></i></a> </div>
</div></td>
</tr>
{{/each}} {{/each}}
</table> </div>

View File

@ -1,35 +1,36 @@
<table> <div class="skills-grid-container">
<th><div class="skill-name skill-headeritem">{{ localize "rmss.pc_sheet_skills.favorite" }}</div></th> <div class="skills-grid-heading">{{ localize "rmss.pc_sheet_skills.favorite" }}</div>
<th><div class="skill-name skill-headeritem">{{ localize "rmss.pc_sheet_skills.skill_name" }}</div></th> <div class="skills-grid-heading">{{ localize "rmss.pc_sheet_skills.skill_name" }}</div>
<th><div class="skill-entry skill-headeritem">{{ localize "rmss.pc_sheet_skills.ranks" }}</div></th> <div class="skills-grid-heading">{{ localize "rmss.pc_sheet_skills.ranks" }}</div>
<th><div class="skill-entry skill-headeritem">{{ localize "rmss.pc_sheet_skills.new_ranks" }}</div></th> <div class="skills-grid-heading">{{ localize "rmss.pc_sheet_skills.new_ranks" }}</div>
<th><div class="skill-entry skill-headeritem">{{ localize "rmss.pc_sheet_skills.rank_bonus" }}</div></th> <div class="skills-grid-heading">{{ localize "rmss.pc_sheet_skills.rank_bonus" }}</div>
<th><div class="skill-entry skill-headeritem">{{ localize "rmss.pc_sheet_skills.category_bonus" }}</div></th> <div class="skills-grid-heading">{{ localize "rmss.pc_sheet_skills.category_bonus" }}</div>
<th><div class="skill-entry skill-headeritem">{{ localize "rmss.pc_sheet_skills.item_bonus" }}</div></th> <div class="skills-grid-heading">{{ localize "rmss.pc_sheet_skills.item_bonus" }}</div>
<th><div class="skill-entry skill-headeritem">{{ localize "rmss.pc_sheet_skills.special_bonus" }}</div></th> <div class="skills-grid-heading">{{ localize "rmss.pc_sheet_skills.special_bonus" }}</div>
<th><div class="skill-entry skill-headeritem">{{ localize "rmss.pc_sheet_skills.special_bonus" }}</div></th> <div class="skills-grid-heading">{{ localize "rmss.pc_sheet_skills.special_bonus" }}</div>
<th><div class="skill-entry skill-headeritem">{{ localize "rmss.pc_sheet_skills.total_bonus" }}</div></th> <div class="skills-grid-heading">{{ localize "rmss.pc_sheet_skills.total_bonus" }}</div>
<th><div class="skill-controls"> <div class="skills-grid-heading">
<a class="skill-control item-create" title="Create Skill" data-type="skill"><i class="fas fa-plus"></i>{{ localize "rmss.pc_sheet_skills.add_skill" }}</a> <!--<a class="item-create" title="Create Skill" data-type="skill"><i class="fas fa-plus"></i>{{ localize "rmss.pc_sheet_skills.add_skill" }}</a>-->
</div></th> </div>
{{#each playerskill as |skill id|}} {{#each playerskill as |skill id|}}
<tr class="item" data-item-id="{{skill._id}}"> {{#if skill.system.favorite}}
<td><div class="skill-entry item-prop"><input type="checkbox" name="system.favorite" {{checked skill.system.favorite}}/></div></td> <div><a class="skill-favorite" data-item-id="{{skill._id}}"><i class="fa-regular fa-square-check"></i></a></div>
<td><div class="skill-name"> {{else}}
<h4>{{skill.name}}</h4> <div><a class="skill-favorite" data-item-id="{{skill._id}}"><i class="fa-regular fa-square"></i></a></div>
</div></td> {{/if}}
<td><div class="skill-entry item-prop">{{skill.system.ranks}}</div></td> <!--<div><input type="checkbox" name="system.favorite" {{checked skill.system.favorite}}/></div>-->
<td><div class="skill-entry item-prop">{{skill.system.new_ranks}}</div></td> <div>{{skill.name}}</div>
<td><div class="skill-entry item-prop">{{skill.system.rank_bonus}}</div></td> <div>{{skill.system.ranks}}</div>
<td><div class="skill-entry item-prop">{{skill.system.category_bonus}}</div></td> <div>{{skill.system.new_ranks}}</div>
<td><div class="skill-entry item-prop">{{skill.system.item_bonus}}</div></td> <div>{{skill.system.rank_bonus}}</div>
<td><div class="skill-entry item-prop">{{skill.system.special_bonus_1}}</div></td> <div>{{skill.system.category_bonus}}</div>
<td><div class="skill-entry item-prop">{{skill.system.special_bonus_2}}</div></td> <div>{{skill.system.item_bonus}}</div>
<td><div class="skill-entry item-prop">{{skill.system.total_bonus}}</div></td> <div>{{skill.system.special_bonus_1}}</div>
<td><div class="skill-controls"> <div>{{skill.system.special_bonus_2}}</div>
<a class="skill-control item-edit" title="Edit Skill"><i class="fas fa-edit"></i></a> <div>{{skill.system.total_bonus}}</div>
<a class="skill-control item-delete" title="Delete Skill"><i class="fas fa-trash"></i></a> <div>
</div></td> <a class="item-edit" title="Edit Skill" data-item-id="{{skill._id}}"><i class="fas fa-edit"></i></a>
</tr> <a class="item-delete" title="Delete Skill" data-item-id="{{skill._id}}"><i class="fas fa-trash"></i></a>
</div>
{{/each}} {{/each}}
</table> </div>

View File

@ -86,11 +86,11 @@
</div> </div>
<div class="tab skill_categories" data-group="primary" data-tab="SkillCategory"> <div class="tab skill_categories" data-group="primary" data-tab="SkillCategory">
{{> "systems/rmss/templates/sheets/actors/parts/actor-skill-categories-grid.html" }} {{> "systems/rmss/templates/sheets/actors/parts/actor-skill-categories.html" }}
</div> </div>
<div class="tab skills" data-group="primary" data-tab="Skills"> <div class="tab skills" data-group="primary" data-tab="Skills">
{{> "systems/rmss/templates/sheets/actors/parts/actor-skills-grid.html" }} {{> "systems/rmss/templates/sheets/actors/parts/actor-skills.html" }}
</div> </div>
<div class="tab equipment" data-group="primary" data-tab="Equipment"> <div class="tab equipment" data-group="primary" data-tab="Equipment">

View File

@ -1,13 +1,7 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> <header class="sheet-header">
<img src="{{item.img}}" data-edit="img" title="{{item.name}}" height="64" width="64"/> <img src="{{item.img}}" data-edit="img" title="{{item.name}}" height="64" width="64"/>
{{#if item.isOwned}}
<h1>{{item.name}}</h1>
{{else}}
<h1><input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'Name' }}"/></h1> <h1><input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'Name' }}"/></h1>
{{/if}}
</header> </header>
<div class="sheet-content"> <div class="sheet-content">
<div class="applicable-stats-grid-container"> <div class="applicable-stats-grid-container">

View File

@ -10,6 +10,12 @@
{{selectOptions owned_skillcats selected=selected_skillcat }} {{selectOptions owned_skillcats selected=selected_skillcat }}
</select> </select>
</div> </div>
<div>
Skill Designation
<select name="system.designation" class="app-stat-selector" value="{{system.designation}}" itemid="{{ item._id }}">
{{selectOptions designations selected=system.designation}}
</select>
</div>
<div> <div>
<table> <table>
<tr> <tr>