--- /dev/null
+import { Knex } from "knex";
+
+
+export async function up(knex: Knex): Promise<void> {
+ return knex.schema.alterTable('monsters', (table) => {
+ table.string('icon').nullable();
+ });
+}
+
+
+export async function down(knex: Knex): Promise<void> {
+ return knex.schema.alterTable('monsters', (table) => {
+ table.dropColumn('icon');
+ });
+}
+
#fight-results {
margin: 1rem 0;
+}
+
+#fight-container {
+ .icon-container {
+ .icon {
+ width: 64px;
+ height: 64px;
+ }
+ }
}
\ No newline at end of file
defence: Math.floor(parseInt(r.fields.Defence.toString() || '0')),
location_id: r.fields.location_id[0],
faction_id: factionId,
- time_period: r.fields.time_period ? r.fields.time_period : 'any'
+ time_period: r.fields.time_period ? r.fields.time_period : 'any',
+ icon: r.fields.icon ? r.fields.icon : null
}
})).onConflict('id').merge();
}
export async function loadMonsterFromFight(player_id: string): Promise<Fight> {
- return await db.first().select('*').from<Fight>('fight').where({
+ return await db.first().select(['fight.*', 'monsters.icon']).from<Fight>('fight').join('monsters', 'fight.ref_id', '=', 'monsters.id').where({
player_id,
});
}
const res = await db.raw(`
select
f.*, fa.id as faction_id, fa.name as faction_name,
- m."minLevel", m."maxLevel"
+ m."minLevel", m."maxLevel", m.icon,
from fight f
join monsters m on f.ref_id = m.id
left outer join factions fa on m.faction_id = fa.id
variant = sample(MonsterVariants);
}
- const monsterData: Omit<Fight, 'id'> = {
+ const monsterData: Omit<Fight, 'id' | 'icon'> = {
player_id: playerId,
variant: variant.name,
name: variant.display.replace("{{name}}", monster.name),
const res = await db('fight').insert(monsterData)
.returning<Fight[]>('*');
- return res.pop();
+ const fight = res.pop();
+
+ fight.icon = monster.icon;
+
+ return fight;
}
export async function getMonsterLocation(monsterId: number): Promise<LocationWithCity> {
}
}
+function placeholderMonsterIcon(icon?: string): string {
+ if(icon) {
+ return `<img class="icon" src="/assets/img/icons/monsters/${icon}">`;
+ }
+ else {
+ return `<img class="icon" src="https://via.placeholder.com/64x64">`;
+ }
+}
+
export function renderFight(monster: Fight, results: string = '', displayFightActions: boolean = true, blockTime: number = 0) {
const hpPercent = Math.floor((monster.hp / monster.maxHp) * 100);
let html = `
<div id="fight-container">
<div id="defender-info">
- <div class="avatar-container">
- <img id="avatar" src="https://via.placeholder.com/64x64">
+ <div class="icon-container">
+ ${placeholderMonsterIcon(monster.icon)}
</div>
<div id="defender-stat-bars">
<div class="monster-identifier ${monster.variant}"><span id="defender-name">${monster.name}</span>, level ${monster.level}</div>
location_id: number;
faction_id: number;
time_period: TimePeriod;
+ icon: string;
}
export type MonsterForList = {