diff --git a/RolemasterUnified_Official/rolemasterunified.css b/RolemasterUnified_Official/rolemasterunified.css index 9fb651af7574..8c6a586919d1 100644 --- a/RolemasterUnified_Official/rolemasterunified.css +++ b/RolemasterUnified_Official/rolemasterunified.css @@ -34,6 +34,11 @@ url('https://fonts.googleapis.com/css2?family=Material+Icons|Material+Icons+Outl url("https://db.onlinewebfonts.com/t/311c85b74d202c797a636fe182cde796.svg#PragRoman")format("svg"); } + + +/* phttps://wiki.roll20.net/Character_Sheet_Development/Dark_Mode */ + + h2 { font-family: 'PragRoman', 'myPragRoman', 'IM Fell DW Pica', 'Kaushan Script', 'Chalkduster', 'Trattatello', 'Luminari', fantasy, serif; } @@ -761,6 +766,10 @@ button.nodie { transition: border-left 300ms ease-in-out, padding-left 300ms ease-in-out; } +.sheet-rolltemplate-darkmode .sheet-rolltemplate-rmurollbox { + background-image: linear-gradient(to right bottom, #8e2de2, #4a00e0); +} + .sheet-rolltemplate-rmucritical { padding: 1rem; width: 95%; @@ -813,7 +822,7 @@ button.nodie { .sheet-rolltemplate-rmuattacktarget .inlinerollresult, .sheet-rolltemplate-noboxes .inlinerollresult { - background-color: transparent; + background-color: transparent !important; border: none !important; padding: 0; font-weight: inherit; @@ -1130,6 +1139,57 @@ button.nodie { /* vim: set sts=4 sw=4 syn=css : */ +/* https://cssloaders.github.io */ + +.loader{ + width: 100px; + height: 75px; + margin: 0 auto; + background: #fff; + position: relative; + border-radius: 100%; +} +.loader:before { + content: ''; + position: absolute; + box-sizing: border-box; + border: 15px solid transparent; + border-top: 25px solid #fff; + transform: rotate(45deg); + top: 50px; + left: -15px; +} + +.loader:after { + content: ''; + width: 12px; + height: 12px; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50% , -50%); + border-radius: 50%; + background-color: #FF3D00; + box-shadow: 20px 0 #FF3D00, -20px 0 #FF3D00; + animation: flash 0.5s ease-out infinite alternate; +} + +@keyframes flash { + 0% { + background-color: rgba(255, 60, 0, 0.25); + box-shadow: 20px 0 rgba(255, 60, 0, 0.25), -20px 0 #FF3D00; + } + 50% { + background-color: #FF3D00; + box-shadow: 20px 0 rgba(255, 60, 0, 0.25), -20px 0 rgba(255, 60, 0, 0.25); + } + 100% { + background-color: rgba(255, 60, 0, 0.25); + box-shadow: 20px 0 #FF3D00, -20px 0 rgba(255, 60, 0, 0.25); + } +} + + /* vim: set sts=4 sw=4 syn=css : */ diff --git a/RolemasterUnified_Official/rolemasterunified.html b/RolemasterUnified_Official/rolemasterunified.html index 7deecf1d276e..94307616ba21 100644 --- a/RolemasterUnified_Official/rolemasterunified.html +++ b/RolemasterUnified_Official/rolemasterunified.html @@ -206,10 +206,10 @@ -->
- {{who}} casts {{computed::spell}}
+ {{who}} casts {{computed::spell}}
+ Result: {{computed::total}} = {{computed::roll}} + {{mod}}

Modifiers: {{mod}} = {{computed::modlog}}

- Result: {{computed::total}} = {{computed::roll}} + {{mod}}
{{computed::result}}
{{who}} now has {{computed::pp}} PP ({{computed::ppmsg}})
@@ -228,10 +228,10 @@
- {{computed::who}} rolls {{computed::skill}}
+ {{computed::who}} rolls {{computed::skill}}
+ Result: {{computed::total}} = {{computed::rollstr}} + {{computed::mod}}

Modifiers: {{computed::mod}} = {{computed::modlog}}

- Result: {{computed::total}} = {{computed::rollstr}} + {{computed::mod}}
{{computed::result}}
{{#rollTotal() computed::hasextra 1}} {{computed::extratext}}
@@ -2209,7 +2209,7 @@

Creature

Initiative - + @@ -2217,11 +2217,26 @@

Creature

RRs - Channeling - Essence - Mentalism - Physical - Fear + Channeling + + + Essence + + + Mentalism + + + Physical + + + Fear + +
@@ -2319,8 +2334,18 @@

Actions

Eat/Drink
-
Concentration
-
Free Action Used
+
Concentration
+
Free Used
+
AP/Phase
+
+ +
+
+
@@ -2422,6 +2447,20 @@

Status

+
+

Injuries

+ +

Apply an injury.
+ Hits, Penalty, Fatigue, Bleed, Staggered, + pRone, Knockback, Grappled, Q/W/E Stun 25/50/75, + Location (1 head, 2, chest, 3 arms, 4 leg) and siDe (1 Left, 2 right). + Z ends. +

+ + + +
+
@@ -2442,6 +2481,12 @@

Status

Name +
+ + +
+ +
@@ -2497,8 +2542,8 @@

Statistics


-
ProfessionRaceLevelCultureRealmReligionAgeSkinEyesGenderBuildHeightWeightyWeight allowance -CarriedEnc PenaltyMax PaceManuever PenaltyyBase Move (BMR) +
ProfessionRaceLevelCultureRealmReligionAgeSkinEyesHairGenderBuildHeightWeightyWeight allowance +CarriedEnc PenaltyMax PaceyBase Move (BMR) SizeRecovery MultiplierRoutineEasyLightMediumHardVery HardExt. HardSheer FollyAbsurdNigh Impossible EP @@ -2657,7 +2702,7 @@

Attacks

y Initiative - + @@ -5302,12 +5347,16 @@

Recalculate

+

See orange dots flashing for ages? Means one of our workers has a problem. +Click this to reset and report a bug.

+ +

Injuries

-

Apply an injury. Format is Uppercase letter, followed by a number. Letter -sare H hits, P penalty, F fatigue, B blleed, S staggered P pRone, K kniocked +

Apply an injury. Format is Uppercase letter, followed by a number. Letters +are H hits, P penalty, F fatigue, B bleed, S staggered P pRone, K kniocked back, G grapped %, Q/W/E Stun 25/50/77 X breakage roll, Location (1 head, 2, chest, 3 arms, 4 leg) and siDe (1 Left, 2 right). For bleed and penalties you need side and location. A Z ends the list.

@@ -5346,7 +5395,7 @@

Custom Spell List


-Revision 2e32329e9a28648dcbfa94d7e228eaf22f91faed +Revision 1c08006943a1f9e620fbedf32c272c900c3ac21a
@@ -6564,6 +6613,9 @@

Custom Spell List

cb: func }; pendingList.push(item); + if (pendingList.length == 1) { + setAttrs({workpending: 1}); + } } /* Same as addPendingFunction, but inserts at head of queue. @@ -6578,6 +6630,9 @@

Custom Spell List

cb: func }; pendingList.unshift(item); + if (pendingList.length == 1) { + setAttrs({workpending: 1}); + } } let asyncTimeout = false; @@ -6613,6 +6668,7 @@

Custom Spell List

rmuasync = 0; } } + setAttrs({workpending: 0}); } function pendingInfo() { @@ -6620,8 +6676,13 @@

Custom Spell List

} function pendingReset() { - let rmuasync = 0; - let pendingList = [] + console.log("Pending reset"); + if (rmuasync) { + console.log(`Pending reset: ${rmuasync} with ${pendingList.length} queued`); + rmuasync = 0; + pendingList = []; + setAttrs({workpending: 0}); + } } function onCheck(str, func) { @@ -6644,6 +6705,10 @@

Custom Spell List

on(str, func); } +onCheck("clicked:resetworkers", () => { + pendingReset(); +}); + let RMURaces = {}; @@ -7688,9 +7753,6 @@

Custom Spell List

let scrlog = slog + rlog + `${bonus} Spell Type bonus\n` let realmstat = RMUSkills.getStat('rs'); - scrlog += `${realmstat} Realm Stat`; - - let mastery = realmstat + realmstat + RMUSkills.getStat('me') + RMUSkills.getSkillBonus(ranks); @@ -8190,6 +8252,8 @@

Custom Spell List

return; } if (newlist.Category && newlist.Category == 'Creature') { + console.log("Doing creature"); + setAttrs({uploadspelllistmessage: "Creature..."}); return creature.newCreature(newlist.Name, newlist); } console.log("has name"); @@ -8686,7 +8750,7 @@

Custom Spell List

} } else { hideChoices([`${basename} .talent_tier_show`]); - list.push(`Tier 1: ${cost} dp`); + list.push(`Tier 1: ${cost} dp~${cost}`); } setCharmancerOptions(`${basename}_tier`, list); @@ -9382,7 +9446,11 @@

Custom Spell List

const pot = miscBonusTotal(stats[`${statname}_pot_misc`])[0]; for (let i = 0 ; i < count ; i ++) { let gain = RMUStats.statgainroll(temp, pot); - tempraw = miscRawAppend(tempraw, message, gain); + let thismessage = message; + if (count > 1) { + thismessage = `${message} #{i + 1}`; + } + tempraw = miscRawAppend(tempraw, thismessage, gain); temp += gain; } setAttrsPending({[`${statname}_misc`]: miscRawToString(tempraw)}); @@ -9499,13 +9567,13 @@

Custom Spell List

let st1 = svals[stg1]; const g1 = RMUStats.statgainroll(st1.temp, st1.pot); st1.temp += g1; - miscRawAppend(st1.misc, "Creation stat gain", g1); + miscRawAppend(st1.misc, `Creation stat gain - ${suffix} A`, g1); const stg2 = optionDecode(statsdata[`statgain${suffix}b`]); let st2 = svals[stg2]; const g2 = RMUStats.statgainroll(st2.temp, st2.pot); st2.temp += g2; - miscRawAppend(st2.misc, "Creation stat gain", g2); + miscRawAppend(st2.misc, `Creation stat gain - ${suffix} B`, g2); break; } } @@ -9703,7 +9771,7 @@

Custom Spell List

}; x.getSelectList = function(talentObj) { - if (x.talentFuncs[talentObj.data.type].select) { + if (x.talentFuncs[talentObj?.data?.type]?.select) { return x.talentFuncs[talentObj.data.type].select(talentObj); } rmuerror("No select function for ", talentObj.data.type, talentObj); @@ -9723,7 +9791,8 @@

Custom Spell List

tier = parseIntDefault(tier, 1); console.log(`Looking for '${talentObj.data.type} in `, x.applyFuncs); - if (x.talentFuncs[talentObj.data.type].apply) { + + if (x?.talentFuncs[talentObj?.data?.type]?.apply) { x.talentFuncs[talentObj.data.type].apply(talentObj, tier, choice, source); } else { rmuerror("Unknown talent type:", talentObj.data.type, talentObj); @@ -10338,8 +10407,9 @@

Custom Spell List

}) addPendingFunction("CMFinish: Generate Height and Weight", () => { - generateHeightWeight(data.race.data.race, - cleanCompendiumName(data.race.values.gender)); + const gender = cleanCompendiumName(data.race.values.gender) + generateHeightWeight(data.race.data.race, gender); + setAttrs({gender: gender}); // Nothing depends - just send it }); // Culture @@ -10413,7 +10483,7 @@

Custom Spell List

addLanguage(culture, `${name} - S`, sr); } if (wr > 0) { - addLanguage(culture, `${name} - W`, sr); + addLanguage(culture, `${name} - W`, wr); } } }); @@ -11341,12 +11411,12 @@

Custom Spell List

updates.at_torso_info = name; break; case 'Vambraces': - updates.at_legs = json.AT; - updates.at_legs_info = name; - break; - case 'Greaves': updates.at_arms = json.AT; updates.at_arms_info = name; + break; + case 'Greaves': + updates.at_legs = json.AT; + updates.at_legs_info = name; break default: updates.at_head = json.AT; @@ -11355,27 +11425,28 @@

Custom Spell List

updates.at_arms = json.AT; updates.at_head_info = updates.at_torso_info = updates.at_legs_info = updates.at_arms_info = name; - } - } - if (json['DB Bonus']) { - updates.shield_type_bonus = json['DB Bonus']; - updates.shield_type_nattacks = json['Attacks Blocked']; - } - if (json['Attack Table']) { - RMUInventory.updateWeapon(name, json); - } + } + } + if (json['DB Bonus']) { + updates.shield_type_bonus = json['DB Bonus']; + updates.shield_type_nattacks = json['Attacks Blocked']; + } + if (json['Attack Table']) { + RMUInventory.updateWeapon(name, json); + } - }); - setAttrsPending(updates); - }); }); + setAttrsPending(updates); + }); + }); } // Someone changed a system relaed thing; or equpped something RMUInventory.updateEquipped = function() { - console.log("UPdate equipped"); - addPendingFunction("Delete creatied attacks", RMUInventory.deleteCreatedAttacks); - addPendingFunction("Add Special Equipement", RMUInventory.addSpecialEquipment); + console.log("Update equipped"); + pendingInfo(); + addPendingFunction("Delete created attacks", RMUInventory.deleteCreatedAttacks); + addPendingFunction("Add Special Equipment", RMUInventory.addSpecialEquipment); addPendingFunction("Update bonuses for Attacks", attacks.updateAttackBonuses); checkPending(); } @@ -11491,6 +11562,7 @@

Custom Spell List

onCheck('clicked:repeating_stuff:deleteitem', (ev) => { const basename = ev.sourceAttribute.replace("_deleteitem", ""); removeRepeatingRow(basename); + RMUInventory.updateEquipped(); }); @@ -13385,10 +13457,10 @@

Custom Spell List

}); }); -onCheck("clicked:rollinitative", () => { - startRoll('&{template:rmuinit} [[ [[ 2d10 ]] + @{initiative} &{tracker} ]] ' + +onCheck("clicked:rollinitiative", () => { + startRoll('&{template:rmuinit} [[ [[ 2d10 ]] + @{initiative} &{tracker}]] ' + '{\{actor=@{character_name} }} ' + - '{]{bonus=@{initiative} }} {\{total=$[[1]]}} {\{roll=$[[0]]}}', + '{\{bonus=@{initiative} }} {\{total=$[[1]]}} {\{roll=$[[0]]}}', (roll) => { finishRoll(roll.rollId, {}); }); @@ -13550,7 +13622,12 @@

Custom Spell List

updates.rr_fear_bonus = cdata.Fear; // Attacks: Format is 8M(5)be. OB - SizeLetter - Size Numberic - Attack Table - let attacks = JSON.parse(cdata['data-attack']); + let attacks = ""; + if (typeof(cdata['data-attack']) == 'string') { + attacks = JSON.parse(cdata['data-attack']); + } else { + attacks = cdata['data-attack']; + } console.log(attacks); for (attack of attacks) { // FIXME: Not dealign with additiona criiticals here @@ -13587,11 +13664,15 @@

Custom Spell List

VrmuSetAttrs(nu); }); } - + updates[`${prefix}_type`] = type; } - let moves = JSON.parse(cdata['data-move']) + console.log('move is', cdata['data-move']); + const moves = (typeof(cdata['data-move']) == 'string') ? + JSON.parse(cdata['data-move']) : + cdata['data-move']; + for (const { type, pace, bmr } of moves) { //for (const move of moves) { console.log("move", type, pace, bmr); @@ -13625,7 +13706,7 @@

Custom Spell List

console.log("basenae", basename); const toget = [ 'character_name', - 'size', + 'size', `${basename}_ob`, `${basename}_attack`, `${basename}_attacksize`, diff --git a/RolemasterUnified_Official/sheet.json b/RolemasterUnified_Official/sheet.json index bab4f33c89ad..262e66d2810f 100644 --- a/RolemasterUnified_Official/sheet.json +++ b/RolemasterUnified_Official/sheet.json @@ -8,5 +8,5 @@ "legacy": false, "printable": true, "compendium": "RMU", - "version": "1726118554" + "version": "1726553860" } diff --git a/RolemasterUnified_Official/translation.json b/RolemasterUnified_Official/translation.json index 8eb2ec0c9874..a74dfa29ac8d 100644 --- a/RolemasterUnified_Official/translation.json +++ b/RolemasterUnified_Official/translation.json @@ -94,6 +94,7 @@ "elfhigh": "Elf, high", "elfwood": "Elf, wood", "em": "Em", + "em/pr": "em/pr", "empathy": "Empathy", "engineering": "Engineering", "environmental": "Environmental", @@ -143,6 +144,8 @@ "illusioncrafting": "Illusion Crafting", "illusionist": "Illusionist", "in": "In", + "in/em": "in/em", + "in/pr": "in/pr", "influence": "Influence", "informational": "Informational", "innkeeper": "Innkeeper", diff --git a/RolemasterUnified_Official/updates.md b/RolemasterUnified_Official/updates.md index 8531773dc015..12b9d2a6054c 100644 --- a/RolemasterUnified_Official/updates.md +++ b/RolemasterUnified_Official/updates.md @@ -1,3 +1,46 @@ +# 2024-9-17 + +Miscalenous bug fix week! + +After one week of activity there are a number of bugs. Talents seemed to cause most grief - I've +fixed a lot of them. Hopefully this means peoples sheets won't lock up anymore. + +Otherwise it's a whole host of little things. + +- Hair is now a box you can edit +- Save gender set during character creation +- Initiative: + - Fix the button so it works again (stupid roll20 quotes) + - Show the penalty in the result box + - Send the value to the tracker +- Fix a few missing translation strings. +- Set correct ranks for written languages. +- On creation, make sure each stat gain has a unique name +- Creature: + - Allow JSON and string items. + - RR rolls for creatures + - Injuries for creatures +- Talents + - Save talent cost correctly for single tier talents + - Fix some of the talents that cause problems on some browsers. + - Handle more errors + - Delete a malformed talent in the database +- Roll templates (side panel) + - Add basic darkmode support + - Put the results before the mods for skills and spell rolls. +- Can edit height/weight/build on sheet +- Stat gains uniquely identified during levelup +- Fix for item's name's template in the compendium +- Partial fix for vmabraces`greaves +- Fix for short bow and long bow attack tables +- Remove old Claw & Shockbolt hacks from compendium +- Spells correct display of realm stats +- Fix vambrace and greave ordering +- Update equipment on deletion +- Add a pending reset button to hopefully unjam people. +- Add an animated icon when doing work + + # 2024-9-12 The first post compendium release... and it's small. This is a good thing.