1 import { FightRound } from "shared/fight";
2 import { LocationWithCity } from "shared/map";
3 import { MonsterForFight } from "../../shared/monsters";
4 import { Button, ButtonWithBlock } from "./components/button";
6 export function renderRoundDetails(roundData: FightRound): string {
7 let html: string[] = roundData.roundDetails.map(d => `<div>${d}</div>`);
9 switch(roundData.winner) {
11 html.push(`<div>You defeated the ${roundData.monster.name}!</div>`);
12 if(roundData.rewards.gold) {
13 html.push(`<div>You gained ${roundData.rewards.gold} gold</div>`);
15 if(roundData.rewards.exp) {
16 html.push(`<div>You gained ${roundData.rewards.exp} exp</div>`);
18 if(roundData.rewards.levelIncrease) {
19 html.push(`<div>You gained a level! ${roundData.player.level}</div>`);
23 if(roundData.player.hp === 0) {
24 html.push(`<p>You were killed...</p>`);
26 html.push('<p><button hx-get="/player/explore" hx-target="#explore">Back to Town</button></p>');
29 // fight still in progress, so we don't send any final actions back
34 return html.join("\n");
37 function CastButton(blockTime?: number): string {
41 class: ['fight-action', 'red'],
47 return ButtonWithBlock(attrs, 'Cast', blockTime);
50 return Button(attrs, 'Cast');
55 function AttackButton(blockTime?: number): string {
59 class: ['fight-action', 'red'],
65 return ButtonWithBlock(attrs, 'Attack', blockTime);
68 return Button(attrs, 'Attack');
72 export function renderFight(monster: MonsterForFight, results: string = '', displayFightActions: boolean = true, blockTime: number = 0) {
73 const hpPercent = Math.floor((monster.hp / monster.maxHp) * 100);
76 <div id="fight-container">
77 <div id="defender-info">
78 <div class="avatar-container">
79 <img id="avatar" src="https://via.placeholder.com/64x64">
81 <div id="defender-stat-bars">
82 <div id="defender-name">${monster.name}</div>
83 <div class="progress-bar" id="defender-hp-bar" style="background: linear-gradient(to right, red, red ${hpPercent}%, transparent ${hpPercent}%, transparent)" title="${hpPercent}% - ${monster.hp}/${monster.maxHp}">${hpPercent}% - ${monster.hp} / ${monster.maxHp}</div>
86 <div id="fight-actions">
87 ${displayFightActions ? `
88 <form hx-post="/fight/turn" hx-target="#fight-container">
89 <select id="fight-target" name="fightTarget">
90 <option value="head">Head</option>
91 <option value="body">Body</option>
92 <option value="arms">Arms</option>
93 <option value="legs">Legs</option>
95 ${AttackButton(blockTime)}
96 ${CastButton(blockTime)}
97 <button type="submit" class="fight-action" name="action" value="flee">Flee</button>
101 <div id="fight-results">${results}</div>
108 export function renderFightPreRound(monster: MonsterForFight, displayFightActions: boolean = true, location: LocationWithCity, closestTown: number) {
109 const hpPercent = Math.floor((monster.hp / monster.maxHp) * 100);
112 <section id="explore" class="tab active" style="background-image: url('/assets/img/map/${closestTown}.jpeg')" hx-swap-oob="true">
113 <div class="city-title-wrapper">
114 <div class="city-title">${location.city_name}</div>
116 <div class="city-details">
117 <h3 class="location-name"><span>${location.name}</span></h3>
119 <div id="fight-container">
120 <div id="defender-info">
121 <div class="avatar-container">
122 <img id="avatar" src="https://via.placeholder.com/64x64">
124 <div id="defender-stat-bars">
125 <div id="defender-name">${monster.name}</div>
126 <div class="progress-bar" id="defender-hp-bar" style="background: linear-gradient(to right, red, red ${hpPercent}%, transparent ${hpPercent}%, transparent)" title="${hpPercent}% - ${monster.hp}/${monster.maxHp}">${hpPercent}% - ${monster.hp} / ${monster.maxHp}</div>
129 <div id="fight-actions">
130 ${displayFightActions ? `
131 <form hx-post="/fight/turn" hx-target="#fight-container">
132 <select id="fight-target" name="fightTarget">
133 <option value="head">Head</option>
134 <option value="body">Body</option>
135 <option value="arms">Arms</option>
136 <option value="legs">Legs</option>
140 <button type="submit" class="fight-action" name="action" value="flee">Flee</button>
144 <div id="fight-results"></div>