Skip to content

Commit c6bef18

Browse files
author
web3blind
committed
Add temple prayers and minor blessings
1 parent a8fc80e commit c6bef18

10 files changed

Lines changed: 169 additions & 41 deletions

File tree

app/css/main.css

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,3 +1777,22 @@ body,
17771777
height: 96px;
17781778
}
17791779
}
1780+
1781+
1782+
.temple-prayer-label {
1783+
display: block;
1784+
margin-top: var(--space-sm);
1785+
color: var(--color-text-muted);
1786+
font-size: 0.9rem;
1787+
}
1788+
1789+
.temple-prayer-select {
1790+
width: 100%;
1791+
min-height: var(--touch-target);
1792+
margin: var(--space-xs) 0;
1793+
padding: 8px;
1794+
border: 1px solid var(--color-border);
1795+
border-radius: var(--radius-sm);
1796+
background: var(--color-surface-2);
1797+
color: var(--color-text);
1798+
}

app/index.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<link rel="icon" type="image/png" sizes="192x192" href="assets/icons/viz-magic-192.png?v=20260712c">
1414
<link rel="icon" type="image/png" sizes="512x512" href="assets/icons/viz-magic-512.png?v=20260712c">
1515
<link rel="apple-touch-icon" href="assets/icons/viz-magic-192.png?v=20260712c">
16-
<link rel="stylesheet" href="css/main.css?v=20260712g">
16+
<link rel="stylesheet" href="css/main.css?v=20260712h">
1717
<link rel="stylesheet" href="css/themes.css">
1818
<link rel="stylesheet" href="css/accessibility.css">
1919
</head>
@@ -120,8 +120,8 @@
120120
<script src="js/config.js?v=20260712a"></script>
121121

122122
<!-- I18n -->
123-
<script src="js/i18n/ru.js?v=20260712g"></script>
124-
<script src="js/i18n/en.js?v=20260712g"></script>
123+
<script src="js/i18n/ru.js?v=20260712h"></script>
124+
<script src="js/i18n/en.js?v=20260712h"></script>
125125

126126
<!-- Utilities -->
127127
<script src="js/utils/helpers.js?v=20260621l"></script>
@@ -132,7 +132,7 @@
132132
<script src="js/blockchain/connection.js"></script>
133133
<script src="js/blockchain/account.js"></script>
134134
<script src="js/blockchain/history-source.js?v=20260621d"></script>
135-
<script src="js/blockchain/broadcast.js?v=20260712a"></script>
135+
<script src="js/blockchain/broadcast.js?v=20260712b"></script>
136136
<script src="js/blockchain/invite.js"></script>
137137

138138
<!-- Protocols -->
@@ -154,7 +154,7 @@
154154
<script src="js/engine/formulas.js"></script>
155155
<script src="js/engine/character.js"></script>
156156
<script src="js/engine/items.js?v=20260712a"></script>
157-
<script src="js/engine/combat.js?v=20260712c"></script>
157+
<script src="js/engine/combat.js?v=20260712d"></script>
158158
<script src="js/engine/duel.js"></script>
159159
<script src="js/engine/duel-state.js"></script>
160160
<script src="js/engine/validator.js"></script>
@@ -170,7 +170,7 @@
170170
<script src="js/engine/quest-system.js?v=20260621e"></script>
171171
<script src="js/engine/loci.js"></script>
172172
<script src="js/engine/npc-framework.js"></script>
173-
<script src="js/engine/state-engine.js?v=20260712a"></script>
173+
<script src="js/engine/state-engine.js?v=20260712b"></script>
174174
<script src="js/engine/daily-leaderboard-storage.js"></script>
175175
<script src="js/engine/daily-leaderboard.js"></script>
176176

@@ -202,7 +202,7 @@
202202
<script src="js/ui/screens/settings.js?v=20260712b"></script>
203203
<script src="js/ui/screens/help.js?v=20260712a"></script>
204204
<script src="js/ui/screens/leaderboard.js"></script>
205-
<script src="js/ui/screens/temple.js?v=20260712a"></script>
205+
<script src="js/ui/screens/temple.js?v=20260712b"></script>
206206

207207
<!-- Main App Controller (must be last) -->
208208
<script src="js/ui/app.js?v=20260712a"></script>

app/js/blockchain/broadcast.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,11 +215,13 @@ var VizBroadcast = (function() {
215215
* @param {number} energy - mana basis points
216216
* @param {Function} callback
217217
*/
218-
function templeOffering(deityId, targetAccount, energy, callback) {
219-
var memo = 'viz://vm/temple/' + deityId;
218+
function templeOffering(deityId, targetAccount, energy, prayerText, callback) {
219+
if (typeof prayerText === 'function') { callback = prayerText; prayerText = ''; }
220+
prayerText = prayerText || '';
221+
var memo = 'viz://vm/temple/' + deityId + (prayerText ? ' — ' + prayerText : '');
220222
var actionData = {
221223
t: cfg.ACTION_TYPES.TEMPLE_OFFERING,
222-
d: { deity: deityId, target: targetAccount, energy: energy }
224+
d: { deity: deityId, target: targetAccount, energy: energy, prayer: prayerText.substring(0, 240) }
223225
};
224226

225227
gameAction(actionData, function(err, result) {

app/js/engine/combat.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ var CombatSystem = (function() {
3333
var seasonBonuses = WorldEvents.getSeasonalBonuses(blockNum || 0);
3434
elemMod += seasonBonuses[spell.school] || 0;
3535
}
36+
var templeBlessing = (typeof StateEngine !== 'undefined' && StateEngine.getTempleBlessing) ?
37+
StateEngine.getTempleBlessing(player.account, blockNum || 0) : null;
38+
if (templeBlessing && templeBlessing.schoolBonuses) {
39+
elemMod += templeBlessing.schoolBonuses[spell.school] || 0;
40+
}
3641

3742
// Calculate class modifier
3843
var classMod = _classModifier(player.className, spell);
@@ -125,7 +130,7 @@ var CombatSystem = (function() {
125130
// Determine loot (only on victory)
126131
var loot = [];
127132
if (victory && creature.lootTable) {
128-
loot = _rollLoot(creature.lootTable, blockHash, CharacterSystem.getTotalStat(player, 'for_'));
133+
loot = _rollLoot(creature.lootTable, blockHash, CharacterSystem.getTotalStat(player, 'for_') + (templeBlessing ? (templeBlessing.fortuneBonus || 0) : 0));
129134
}
130135

131136
return {

app/js/engine/state-engine.js

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -563,8 +563,8 @@ var StateEngine = (function() {
563563
var target = data.target || '';
564564
var energy = Number(data.energy || 0);
565565
var cfgByDeity = {
566-
fire_goddess: { target: 'null', minEnergy: 50, item: 'flame_votive_mark' },
567-
labor_god: { target: 'committee', minEnergy: 50, item: 'labor_votive_mark' }
566+
fire_goddess: { target: 'null', minEnergy: 50, item: 'flame_votive_mark', blessing: { type: 'fire', school: 'ignis', schoolBonus: 20 } },
567+
labor_god: { target: 'committee', minEnergy: 50, item: 'labor_votive_mark', blessing: { type: 'labor', fortuneBonus: 2 } }
568568
};
569569
var def = cfgByDeity[deity];
570570
if (!def || target !== def.target || energy < def.minEnergy) return [];
@@ -578,6 +578,15 @@ var StateEngine = (function() {
578578
}
579579

580580
worldState.temple[sender][deity] = blockNum || 0;
581+
if (!worldState.temple[sender].blessings) worldState.temple[sender].blessings = {};
582+
var blessing = {};
583+
for (var bk in def.blessing) {
584+
if (def.blessing.hasOwnProperty(bk)) blessing[bk] = def.blessing[bk];
585+
}
586+
blessing.deity = deity;
587+
blessing.expiresBlock = (blockNum || 0) + cooldown;
588+
blessing.prayer = data.prayer || '';
589+
worldState.temple[sender].blessings[deity] = blessing;
581590
if (!worldState.inventories[sender]) worldState.inventories[sender] = [];
582591
var item = ItemSystem.createItem(def.item, sender, 1, blockNum || 0, sender, false);
583592
item.templeDeity = deity;
@@ -590,7 +599,8 @@ var StateEngine = (function() {
590599
target: target,
591600
energy: energy,
592601
itemType: def.item,
593-
itemId: item.id
602+
itemId: item.id,
603+
blessing: blessing
594604
}];
595605
}
596606

@@ -1266,6 +1276,27 @@ var StateEngine = (function() {
12661276
}];
12671277
}
12681278

1279+
1280+
/**
1281+
* Return active Temple blessings for combat/UI. Expired blessings are ignored.
1282+
*/
1283+
function getTempleBlessing(account, blockNum) {
1284+
var result = { schoolBonuses: {}, fortuneBonus: 0, active: [] };
1285+
if (!worldState.temple || !worldState.temple[account] || !worldState.temple[account].blessings) return result;
1286+
var blessings = worldState.temple[account].blessings;
1287+
for (var deity in blessings) {
1288+
if (!blessings.hasOwnProperty(deity)) continue;
1289+
var b = blessings[deity];
1290+
if (!b || (b.expiresBlock && blockNum && b.expiresBlock < blockNum)) continue;
1291+
result.active.push(b);
1292+
if (b.school && b.schoolBonus) {
1293+
result.schoolBonuses[b.school] = (result.schoolBonuses[b.school] || 0) + b.schoolBonus;
1294+
}
1295+
if (b.fortuneBonus) result.fortuneBonus += b.fortuneBonus;
1296+
}
1297+
return result;
1298+
}
1299+
12691300
/**
12701301
* Process a hunt action directly (for live UI — bypasses block replay).
12711302
* Adds XP, loot, quest progress identically to _handleHunt.
@@ -1324,10 +1355,12 @@ var StateEngine = (function() {
13241355
* Process Temple offering for live UI — same logic as replay.
13251356
*/
13261357
function processTempleOfferingResult(account, deityId, targetAccount, energy, blockNum) {
1358+
var prayerText = arguments.length > 5 ? arguments[5] : '';
13271359
var events = _handleTempleOffering(account, {
13281360
deity: deityId,
13291361
target: targetAccount,
1330-
energy: energy
1362+
energy: energy,
1363+
prayer: prayerText || ''
13311364
}, blockNum || 0);
13321365
if (!events.length) return null;
13331366
return events[0];
@@ -1444,6 +1477,7 @@ var StateEngine = (function() {
14441477
getState: getState,
14451478
getCharacter: getCharacter,
14461479
getInventory: getInventory,
1480+
getTempleBlessing: getTempleBlessing,
14471481
processHuntResult: processHuntResult,
14481482
processMoveResult: processMoveResult,
14491483
processCraftResult: processCraftResult,

app/js/i18n/en.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1012,7 +1012,7 @@ var LangEN = {
10121012
nav_temple: 'Temple',
10131013
temple_title: 'Temple',
10141014
temple_intro: 'Mages make small offerings to the gods of the world here. An offering spends mana through a VIZ award and leaves a modest sign of faith in the game.',
1015-
temple_balance_note: 'Balance: this is not buying power. For now the Temple grants lore relics without combat stats, with a daily limit per deity.',
1015+
temple_balance_note: 'Balance: this is not buying power. The Temple grants a lore sign and a small temporary blessing without sharp damage or loot spikes.',
10161016
temple_rules_title: 'Offering rules',
10171017
temple_rule_cost: 'One offering costs 0.50% mana.',
10181018
temple_rule_cooldown: 'A deity cannot be spammed: roughly one offering per in-world day.',
@@ -1036,6 +1036,16 @@ var LangEN = {
10361036
item_labor_votive_mark: 'Labor Seal',
10371037
help_section_temple: 'Temple',
10381038
help_temple_text: 'At the Temple, you can make small offerings: to the Goddess of Fire through null and to the God of Labor through committee. Rewards are cosmetic/lore-first for balance.',
1039+
temple_prayer_label: 'Prayer in memo',
1040+
temple_prayer_fire_power: 'Goddess of Fire, grant me one hundred thousand percent more fire for at least one second in your world. I will blink quickly, promise.',
1041+
temple_prayer_fire_second: 'Lady of flame, grant me a spark not for pride, but so darkness understands the hint.',
1042+
temple_prayer_fire_mercy: 'Flame, be merciful: burn away excess fear and leave the eyebrows in place.',
1043+
temple_prayer_labor_hands: 'God of Labor, strengthen my hands so the hammer does not argue with my fingers and work goes well.',
1044+
temple_prayer_labor_craft: 'Lord of craft, may iron be reasonable today, wood patient, and I not too confident.',
1045+
temple_prayer_labor_patience: 'God of Labor, give me patience for one good step more than laziness has.',
1046+
temple_energy_check_failed: 'Could not check mana before the offering.',
1047+
temple_not_enough_mana: 'Not enough mana for the offering.',
1048+
temple_rule_blessing: 'After an offering, a small temporary blessing applies: Fire slightly boosts fire spells, Labor slightly helps loot fortune.',
10391049
nav_help: 'Guide',
10401050
help_title: 'Game Guide',
10411051
help_intro: 'Viz Magic is a browser RPG on the VIZ blockchain. Every action — hunt, craft, trade — is permanently recorded on-chain.',

app/js/i18n/ru.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1012,7 +1012,7 @@ var LangRU = {
10121012
nav_temple: 'Храм',
10131013
temple_title: 'Храм',
10141014
temple_intro: 'Здесь маги делают малые подношения богам мира. Подношение тратит ману через VIZ award и оставляет в игре скромный знак веры.',
1015-
temple_balance_note: 'Баланс: это не покупка силы. Сейчас Храм даёт лоровые артефакты без боевых статов, с дневным ограничением для каждого божества.',
1015+
temple_balance_note: 'Баланс: это не покупка силы. Храм даёт лоровый знак и малое временное благословение без резких скачков урона или добычи.',
10161016
temple_rules_title: 'Правила подношений',
10171017
temple_rule_cost: 'Стоимость одного подношения — 0.50% маны.',
10181018
temple_rule_cooldown: 'Одному божеству нельзя спамить подношениями: примерно один раз в игровой день.',
@@ -1036,6 +1036,16 @@ var LangRU = {
10361036
item_labor_votive_mark: 'Печать Труда',
10371037
help_section_temple: 'Храм',
10381038
help_temple_text: 'В Храме можно делать малые подношения: Богине Огня через null и Богу Труда через committee. Награды пока косметические и лоровые, чтобы не ломать баланс.',
1039+
temple_prayer_label: 'Молитва в memo',
1040+
temple_prayer_fire_power: 'Богиня Огня, даруй мне увеличение огня на сто тысяч процентов хотя бы на секунду в мире твоём. Я моргну быстро, обещаю.',
1041+
temple_prayer_fire_second: 'Огненная госпожа, дай искру не для гордыни, а чтобы тьма поняла намёк.',
1042+
temple_prayer_fire_mercy: 'Пламя, будь милостиво: сожги лишний страх, а брови оставь на месте.',
1043+
temple_prayer_labor_hands: 'Бог Труда, укрепи руки мои, чтобы молот не спорил с пальцами, а дело спорилось.',
1044+
temple_prayer_labor_craft: 'Владыка ремесла, пусть железо сегодня будет понятливым, дерево — терпеливым, а я — не слишком самоуверенным.',
1045+
temple_prayer_labor_patience: 'Бог Труда, дай терпения на один хороший шаг больше, чем у лени.',
1046+
temple_energy_check_failed: 'Не удалось проверить ману перед подношением.',
1047+
temple_not_enough_mana: 'Недостаточно маны для подношения.',
1048+
temple_rule_blessing: 'После подношения действует малое временное благословение: Огонь чуть усиливает огненные заклинания, Труд — удачу в добыче.',
10391049
nav_help: 'Справка',
10401050
help_title: 'Справка по игре',
10411051
help_intro: 'Viz Magic — браузерная RPG на блокчейне VIZ. Каждое действие — охота, крафт, торговля — записывается в блокчейн навсегда.',

0 commit comments

Comments
 (0)