Compare commits

...

5 Commits

Author SHA1 Message Date
6148f73888 ALl items list 2023-03-26 08:57:44 +02:00
2e4b018834 New combat features 2023-03-24 13:40:20 +01:00
fb3d0dfd7f New combat features 2023-03-24 13:29:53 +01:00
e573f5b382 New combat features 2023-03-24 13:29:19 +01:00
ed494e69b9 Fix DR/Parry bonuses 2023-03-22 13:38:49 +01:00
11 changed files with 171 additions and 50 deletions

View File

@@ -1,2 +1,4 @@
# fvtt-pegasus-rpg
# fvtt-warhero

View File

@@ -203,6 +203,16 @@
"WH.ui.ignoreeffect": "Ignore effect",
"WH.ui.raceSkills": "Race skills",
"WH.ui.identified": "Identified",
"WH.ui.isclasssecondary": "Secondary class ?",
"WH.ui.secondaryclass": "Super warhero",
"WH.ui.meleedamagebonus": "Melee damage bonus",
"WH.ui.rangeddamagebonus": "Ranged damage bonus",
"WH.ui.notapplicable": "Not applicable",
"WH.ui.chargedaily": "Daily",
"WH.ui.chargelimited": "Limited",
"WH.ui.magiccharge": "Magic charges",
"WH.ui.chargevalue": "Charge value",
"WH.ui.allitems": "All items",
"WH.ui.bodyslots": "Body",
"WH.ui.containerslot": "Containers",

View File

@@ -55,10 +55,12 @@ export class WarheroActorSheet extends ActorSheet {
equippedArmors: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getEquippedArmors())),
equippedShields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getEquippedShields())),
powers: this.actor.sortPowers(),
allItems: this.actor.getAllItems(),
subActors: duplicate(this.actor.getSubActors()),
competency: this.actor.getCompetency(),
race: duplicate(race),
classes: duplicate(this.actor.getClasses()),
mainClass: this.actor.getMainClass(),
secondaryClass: this.actor.getSecondaryClass(),
totalMoney: this.actor.computeTotalMoney(),
equipments: duplicate(this.actor.getEquipmentsOnly()),
//moneys: duplicate(this.actor.getMoneys()),

View File

@@ -151,6 +151,11 @@ export class WarheroActor extends Actor {
}
return schools
}
getAllItems() {
let comp = duplicate(this.items || []);
WarheroUtility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */
getEquippedShields() {
let comp = duplicate(this.items.filter(item => item.type == 'shield' && item.system.slotlocation == "shield") || []);
@@ -168,9 +173,13 @@ export class WarheroActor extends Actor {
return race[0] ?? [];
}
/* -------------------------------------------- */
getClass() {
let classWH = this.items.filter(item => item.type == 'class')
return classWH[0] ?? [];
getMainClass() {
let classWH = this.items.find(item => item.type == 'class' && !item.system.issecondary)
return classWH
}
getSecondaryClass() {
let classWH = this.items.find(item => item.type == 'class' && item.system.issecondary)
return classWH
}
getClasses() {
let comp = duplicate(this.items.filter(item => item.type == "class") || []);
@@ -289,6 +298,14 @@ export class WarheroActor extends Actor {
formula += "+" + Math.floor(this.system.statistics.str.value * 1)
weapon.damageFormula2Hands = weapon.system.damage2hands + "+" + Math.floor(this.system.statistics.str.value * 1.5)
}
if (weapon.system.weapontype == "throwing" || weapon.system.weapontype == "shooting") {
formula += "+"+this.system.secondary.rangeddamagebonus.value
} else if ( weapon.system.weapontype != "special" ) {
formula += "+"+this.system.secondary.meleedamagebonus.value
if (weapon.damageFormula2Hands) {
weapon.damageFormula2Hands += "+"+this.system.secondary.meleedamagebonus.value
}
}
weapon.damageFormula = formula
}
/* -------------------------------------------- */
@@ -496,17 +513,23 @@ export class WarheroActor extends Actor {
}
getCompetency() {
let myRace = this.getRace()
let myClass = this.getClass()
let myClass1 = this.getMainClass()
let myClass2 = this.getSecondaryClass()
let competency = { weapons: {}, armors: {}, shields: {} }
if (myRace.system) {
this.updateCompetency(competency.weapons, myRace.system.weapons, game.system.warhero.config.weaponTypes)
this.updateCompetency(competency.armors, myRace.system.armors, game.system.warhero.config.armorTypes)
this.updateCompetency(competency.shields, myRace.system.shields, game.system.warhero.config.shieldTypes)
}
if (myClass.system) {
this.updateCompetency(competency.weapons, myClass.system.weapons, game.system.warhero.config.weaponTypes)
this.updateCompetency(competency.armors, myClass.system.armors, game.system.warhero.config.armorTypes)
this.updateCompetency(competency.shields, myClass.system.shields, game.system.warhero.config.shieldTypes)
if (myClass1 && myClass1.system) {
this.updateCompetency(competency.weapons, myClass1.system.weapons, game.system.warhero.config.weaponTypes)
this.updateCompetency(competency.armors, myClass1.system.armors, game.system.warhero.config.armorTypes)
this.updateCompetency(competency.shields, myClass1.system.shields, game.system.warhero.config.shieldTypes)
}
if (myClass2 && myClass2.system) {
this.updateCompetency(competency.weapons, myClass2.system.weapons, game.system.warhero.config.weaponTypes)
this.updateCompetency(competency.armors, myClass2.system.armors, game.system.warhero.config.armorTypes)
this.updateCompetency(competency.shields, myClass2.system.shields, game.system.warhero.config.shieldTypes)
}
return competency
}
@@ -708,7 +731,7 @@ export class WarheroActor extends Actor {
}
/* -------------------------------------------- */
computeDRTotal() {
let armors = this.items.filter(it => it.type == "armor")
let armors = this.items.filter(it => it.type == "armor" && it.system.slotlocation == 'armor')
let dr = 0
for (let armor of armors) {
dr += armor.system.damagereduction
@@ -717,7 +740,7 @@ export class WarheroActor extends Actor {
}
/* -------------------------------------------- */
computeParryBonusTotal() {
let shields = this.items.filter(it => it.type == "shield")
let shields = this.items.filter(it => it.type == "shield" && it.system.slotlocation == 'shield')
let parry = 0
for (let shield of shields) {
parry += shield.system.parrybonus

View File

@@ -96,7 +96,11 @@ export const WARHERO_CONFIG = {
beginturn: "WH.ui.beginturn",
endturn: "WH.ui.endturn"
},
magicCharge: {
notapplicable: "WH.ui.notapplicable",
chargedaily: "WH.ui.chargedaily",
chargelimited: "WH.ui.chargelimited",
},
identifiedState: {
unknown: "WH.conf.unknown",
yes:"WH.conf.yes",

View File

@@ -1543,7 +1543,7 @@ li {
}
.alternate-list {
margin-top: 4px;
fong2ex-wrap: nowrap;
flex-wrap: nowrap;
}
.item-filler {
flex-grow: 6;

View File

@@ -107,7 +107,7 @@
"styles": [
"styles/simple.css"
],
"version": "10.0.43",
"version": "10.0.48",
"compatibility": {
"minimum": "10",
"verified": "10",
@@ -115,7 +115,7 @@
},
"title": "Warhero RPG",
"manifest": "https://www.uberwald.me/gitea/public/fvtt-warhero/raw/branch/master/system.json",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-warhero/archive/fvtt-warhero-10.0.43.zip",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-warhero/archive/fvtt-warhero-10.0.48.zip",
"url": "https://www.uberwald.me/gitea/public/fvtt-warhero",
"background": "images/ui/warhero_welcome_page.webp",
"id": "fvtt-warhero"

View File

@@ -11,7 +11,7 @@
"biodata": {
"class": "",
"age": 0,
"size": 3,
"size": "medium",
"weight": "",
"height": "",
"hair": "",
@@ -172,6 +172,20 @@
"iscombat": true,
"value": 0
},
"meleedamagebonus": {
"label": "WH.ui.meleedamagebonus",
"abbrev": "meleedamagebonus",
"iscombat": true,
"style": "edit",
"value": 0
},
"rangeddamagebonus": {
"label": "WH.ui.rangeddamagebonus",
"abbrev": "rangeddamagebonus",
"iscombat": true,
"style": "edit",
"value": 0
},
"parrybonus": {
"label": "WH.ui.parrybonus",
"abbrev": "parrybonus",
@@ -360,6 +374,7 @@
"templates": [
"commonclassrace"
],
"issecondary": false,
"description": ""
},
"race": {
@@ -398,6 +413,8 @@
"slotused": 1,
"slotlocation": "weapon1",
"isidentified": "unknown",
"magiccharge": "notapplicable",
"chargevalue": 0,
"description": ""
},
"armor": {
@@ -409,6 +426,8 @@
"slotused": 1,
"slotlocation": "armor",
"isidentified": "unknown",
"magiccharge": "notapplicable",
"chargevalue": 0,
"description": ""
},
"shield": {
@@ -420,6 +439,8 @@
"slotused": 1,
"slotlocation": "shield",
"isidentified": "unknown",
"magiccharge": "notapplicable",
"chargevalue": 0,
"description": ""
},
"equipment": {
@@ -431,6 +452,8 @@
"slotlocation": "backpack",
"providedslot": 0,
"isidentified": "unknown",
"magiccharge": "notapplicable",
"chargevalue": 0,
"description": ""
},
"power": {

View File

@@ -21,36 +21,52 @@
<ul>
<li class="item flexrow list-item " data-item-id="{{race._id}}">
<label class="item-field-label-medium">{{localize "WH.ui.race"}}</label>
{{#if race}}
<a class="item-edit"><img class="sheet-competence-img" src="{{race.img}}"></a>
<input type="text" class="item-field-label-medium" disabled value="{{race.name}}" data-dtype="String" />
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
{{else}}
<a class="item-edit"><img class="sheet-competence-img" src="icons/svg/mystery-man.svg"></a>
{{/if}}
</li>
{{#if (count classes)}}
{{#each classes as |class idx|}}
<li class="item flexrow list-item" data-item-id="{{class._id}}">
<label class="item-field-label-medium">{{localize "WH.ui.class"}}</label>
<a class="item-edit"><img class="sheet-competence-img" src="{{class.img}}"></a>
<input type="text" class="item-field-label-medium" disabled value="{{class.name}}" data-dtype="String" />
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
{{else}}
<li class="item flexrow list-item" data-item-id="{{class._id}}">
<li class="item flexrow list-item " data-item-id="{{mainClass._id}}">
<label class="item-field-label-medium">{{localize "WH.ui.class"}}</label>
<a class="item-edit"><img class="sheet-competence-img" src="{{class.img}}"></a>
<input type="text" class="item-field-label-medium" disabled value="{{class.name}}" data-dtype="String" />
{{#if mainClass}}
<a class="item-edit"><img class="sheet-competence-img" src="{{mainClass.img}}"></a>
<input type="text" class="item-field-label-medium" disabled value="{{mainClass.name}}" data-dtype="String" />
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
{{else}}
<a class="item-edit"><img class="sheet-competence-img" src="icons/svg/mystery-man.svg"></a>
{{/if}}
</li>
<li class="item flexrow list-item " data-item-id="{{secondaryClass._id}}">
<label class="item-field-label-medium">{{localize "WH.ui.secondaryclass"}}</label>
{{#if secondaryClass}}
<a class="item-edit"><img class="sheet-competence-img" src="{{secondaryClass.img}}"></a>
<input type="text" class="item-field-label-medium" disabled value="{{secondaryClass.name}}" data-dtype="String" />
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
{{else}}
<a class="item-edit"><img class="sheet-competence-img" src="icons/svg/mystery-man.svg"></a>
{{/if}}
</li>
{{/if}}
<li class="item flexrow list-item" >
<label class="item-field-label-medium">{{localize "WH.ui.religion"}}</label>
<input type="text" class="item-field-label-medium" name="system.biodata.religion" value="{{system.biodata.religion}}" data-dtype="String" />
&nbsp;&nbsp;
<label class="item-field-label-short">{{localize "WH.ui.size"}}</label>
<select class="item-field-label-short" type="text" name="system.biodata.size" value="{{system.biodata.size}}" data-dtype="Number">
{{#select system.biodata.size}}
<option value="small">Small</option>
<option value="medium">Medium</option>
<option value="large">Large</option>
{{/select}}
</select>
</li>
</ul>
</div>
@@ -167,6 +183,9 @@
{{#with system.attributes.ini as |stat|}}
{{> systems/fvtt-warhero/templates/partial-actor-stat-block.html stat=stat key="ini" path="attributes" fieldClass="item-field-label-vlong"}}
{{/with}}
{{#with system.secondary.meleedamagebonus as |stat|}}
{{> systems/fvtt-warhero/templates/partial-actor-stat-block.html stat=stat key="meleedamagebonus" path="secondary" fieldClass="item-field-label-vlong"}}
{{/with}}
</ul>
<ul class="stat-list alternate-list">
{{#with system.attributes.txcm as |stat|}}
@@ -175,6 +194,9 @@
{{#with system.attributes.txcr as |stat|}}
{{> systems/fvtt-warhero/templates/partial-actor-stat-block.html stat=stat key="txch" path="attributes" fieldClass="item-field-label-vlong"}}
{{/with}}
{{#with system.secondary.rangeddamagebonus as |stat|}}
{{> systems/fvtt-warhero/templates/partial-actor-stat-block.html stat=stat key="rangeddamagebonus" path="secondary" fieldClass="item-field-label-vlong"}}
{{/with}}
</ul>
</div>
@@ -592,19 +614,6 @@
</div>
<div>
<ul>
<li class="flexrow item">
<label class="generic-label">{{localize "WH.ui.size"}}</label>
<select class="competence-base flexrow" type="text" name="system.biodata.size" value="{{system.biodata.size}}" data-dtype="Number">
{{#select system.biodata.size}}
<option value="1">Tiny</option>
<option value="2">Small</option>
<option value="3">Medium</option>
<option value="4">Large</option>
<option value="5">Huge</option>
<option value="6">Gargantuan</option>
{{/select}}
</select>
</li>
<li class="flexrow item">
<label class="generic-label">{{localize "WH.ui.gender"}}</label>
<input type="text" class="" name="system.biodata.sex" value="{{system.biodata.sex}}" data-dtype="String" />
@@ -635,6 +644,35 @@
</div>
<hr>
</article>
{{#if isGM}}
<div>
<ul class="stat-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header-long">
<h3><label class="items-title-text">{{localize "WH.ui.allitems"}}</label></h3>
</span>
<span class="item-field-label-medium">
<label class="short-label">{{localize "WH.ui.type"}}</label>
</span>
</li>
{{#each allItems as |item key|}}
<li class="item flexrow list-item list-item-shadow" data-item-id="{{item._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{item.img}}" /></a>
<span class="item-name-label-long">{{item.name}}</span>
<span class="item-field-label-medium">{{upperFirst item.type}}</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</div>
{{/if}}
</div>
</section>

View File

@@ -21,6 +21,10 @@
<div class="tab details" data-group="primary" data-tab="details">
<ul>
<li class="flexrow"><label class="item-field-label-long ">{{localize "WH.ui.isclasssecondary"}}</label>
<input type="checkbox" name="system.issecondary" {{checked system.issecondary}}/>
</li>
{{#each system.weapons as |weaponflag key|}}
<li class="flexrow"><label class="item-field-label-long ">{{localize "WH.ui.weapons"}} {{localize (concat "WH.conf." key)}}</label>
<input type="checkbox" class="padd-right status-small-label color-class-common item-field-label-short"

View File

@@ -21,9 +21,24 @@
</select>
</li>
<li class="flexrow"><label class="item-field-label-medium ">{{localize "WH.ui.magiccharge"}}</label>
<select class="item-field-label-long " type="text" name="system.magiccharge" value="{{system.magiccharge}}" data-dtype="String">
{{#select system.magiccharge}}
{{#each config.magicCharge as |type key|}}
<option value="{{key}}">{{localize type}}</option>
{{/each}}
{{/select}}
</select>
</li>
<li class="flexrow"><label class="item-field-label-medium ">{{localize "WH.ui.chargevalue"}}</label>
<input type="text" class="item-field-label-medium " name="system.chargevalue" value="{{system.chargevalue}}" data-dtype="Number"/>
</li>
<li class="flexrow"><label class="item-field-label-medium ">{{localize "WH.ui.quantity"}}</label>
<input type="text" class="item-field-label-medium " name="system.quantity" value="{{system.quantity}}" data-dtype="Number"/>
</li>
<li class="flexrow"><label class="item-field-label-medium">{{localize "WH.ui.cost"}}</label>
<input type="text" class="item-field-label-medium " name="system.cost" value="{{system.cost}}" data-dtype="Number"/>
</li>
</li>
<li class="flexrow"><label class="item-field-label-medium">{{localize "WH.ui.cost"}}</label>
<input type="text" class="item-field-label-medium " name="system.cost" value="{{system.cost}}" data-dtype="Number"/>
</li>