From 8f42a668e8bc79952a4605566fa4c1c47fee3661 Mon Sep 17 00:00:00 2001 From: xangelo Date: Mon, 21 Aug 2023 13:24:23 -0400 Subject: [PATCH 1/4] fix: migrate recruiter to htmx --- src/server/api.ts | 4 +- src/server/locations/healer/index.ts | 8 +- src/server/locations/recruiter.ts | 117 +++++++++++++++++++++++++++ 3 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 src/server/locations/recruiter.ts diff --git a/src/server/api.ts b/src/server/api.ts index 8a7eec8..baed723 100644 --- a/src/server/api.ts +++ b/src/server/api.ts @@ -27,6 +27,7 @@ import { getPlayerSkills, getPlayerSkillsAsObject, updatePlayerSkills } from './ import {SkillID, Skills} from '../shared/skills'; import { router as healerRouter } from './locations/healer'; +import { router as professionRouter } from './locations/recruiter'; import * as Alert from './views/alert'; import { renderPlayerBar } from './views/player-bar' @@ -374,6 +375,7 @@ async function fightRound(player: Player, monster: MonsterWithFaction, data: {a }; app.use(healerRouter); +app.use(professionRouter); app.get('/chat/history', authEndpoint, async (req: AuthRequest, res: Response) => { @@ -671,7 +673,7 @@ app.get('/location/:location_id/equipment/:item_id/overview', authEndpoint, asyn
- +
diff --git a/src/server/locations/healer/index.ts b/src/server/locations/healer/index.ts index 3504d2a..3e658fe 100644 --- a/src/server/locations/healer/index.ts +++ b/src/server/locations/healer/index.ts @@ -92,7 +92,7 @@ function getText(type: TextSegment, location: Location, city: City): string { } -router.get('/city/services/city:services:healer/:location_id', authEndpoint, async (req: AuthRequest, res: Response) => { +router.get('/city/services/healer/:location_id', authEndpoint, async (req: AuthRequest, res: Response) => { const service = await getService(parseInt(req.params.location_id)); const city = await getCityDetails(service.city_id); @@ -111,10 +111,10 @@ router.get('/city/services/city:services:healer/:location_id', authEndpoint, asy else { if(req.player.gold <= (healCost * 2)) { text.push(`

You don't seem to have too much money... I guess I can do it for free this time...

`); - text.push(`

`); + text.push(`

`); } else { - text.push(`

`); + text.push(`

`); } } @@ -134,7 +134,7 @@ ${text.join("\n")} -router.post('/city/services/city:services:healer:heal/:location_id', authEndpoint, async (req: AuthRequest, res: Response) => { +router.post('/city/services/healer/heal/:location_id', authEndpoint, async (req: AuthRequest, res: Response) => { const service = await getService(parseInt(req.params.location_id)); const city = await getCityDetails(service.city_id); diff --git a/src/server/locations/recruiter.ts b/src/server/locations/recruiter.ts new file mode 100644 index 0000000..10623d8 --- /dev/null +++ b/src/server/locations/recruiter.ts @@ -0,0 +1,117 @@ +import { Response, Router } from "express"; +import { getService } from "../map"; +import { authEndpoint, AuthRequest } from '../auth'; +import { logger } from "../lib/logger"; +import * as Alert from "../views/alert"; +import { changeProfession } from "../player"; +import { renderPlayerBar } from "../views/player-bar"; +import { getEquippedItems } from "../inventory"; + +function p(str: string) { + return `

${str}

`; +} + +export const router = Router(); + +const MIN_LEVEL = 25; + +router.get('/city/services/profession_recruitor/:location_id', authEndpoint, async(req: AuthRequest, res: Response) => { + const service = await getService(parseInt(req.params.location_id)); + + if(!service || service.city_id !== req.player.city_id) { + logger.log(`Invalid location: [${req.params.location_id}]`); + res.sendStatus(400); + } + + let html: string[] = []; + if(req.player.profession === 'Wanderer') { + html.push(`

Our duty is to help Wanderers such as yourself become more than they are. By helping you achieve new levels in service of the King, we can ensure that the Kingdom of Khatis continues to grow!

`); + html.push(`

You have 3 choices laid before you.

`); + html.push(`

You could become a great and mighty Warrior! Wielding powerful swords and maces.

`); + html.push(`

You could become a powerful Mage! Casting spells to rain fire upon our enemies.

`); + html.push(`

You could become a lithe Rogue! Attacking our enemies swiftly when they least expect!

`); + + if(req.player.level < MIN_LEVEL) { + html.push(p(`Unfortunately you have to be at least level ${MIN_LEVEL} to take part in our training...`)); + } + else { + html.push(p(`Be Careful! Once you change your profession, you'll never be a Wanderer again...`)); + html.push(` +
+
+ + + +
+
+ `); + } + } + else { + let town = 'UNSET'; + let place = 'UNSETPLACE'; + switch(req.player.profession) { + case 'Warrior': + town = 'Stether'; + place = 'Highbreaker Inn' + break; + case 'Mage': + town = 'Davelfell'; + place = 'Mages Tower'; + break; + case 'Rogue': + town = 'Ferbalt Gap'; + place = 'Keepers Tavern'; + break; + } + + html.push(p(`Welcome ${req.player.profession}!`)); + html.push(`

Unfortunately I won't be of much help to you now that you are no longer a wanderer...

`); + html.push(`

However, you should visit the ${place} in ${town} that can probably provide some guidance!

`); + } + + res.send(` +
${service.city_name}
+
+

${service.name}

+
${html.join("\n")}
+
+ `); +}); + +router.post('/city/services/profession_change/:location_id', authEndpoint, async(req: AuthRequest, res: Response) => { + const service = await getService(parseInt(req.params.location_id)); + + if(!service || service.city_id !== req.player.city_id) { + logger.log(`Invalid location: [${req.params.location_id}]`); + res.sendStatus(400); + } + + let update: {level: number, exp: number}; + + switch(req.body.profession.toLowerCase()) { + case 'warrior': + update = await changeProfession(req.player.id, 'Warrior'); + req.player.profession = 'Warrior'; + break; + case 'mage': + update = await changeProfession(req.player.id, 'Mage'); + req.player.profession = 'Mage'; + break; + case 'rogue': + update = await changeProfession(req.player.id, 'Rogue'); + req.player.profession = 'Rogue'; + break; + default: + res.send(Alert.ErrorAlert(`Invalid profession`)); + break; + } + + if(update) { + const equipped = await getEquippedItems(req.player.id); + req.player.level = update.level; + req.player.exp = update.exp; + res.send(renderPlayerBar(req.player, equipped) + `
Congrats! You are now a ${req.player.profession}
`); + } + +}); -- 2.25.1 From b8755db8e3f7dfc8d9323e1abf9ed157c9299b7a Mon Sep 17 00:00:00 2001 From: xangelo Date: Mon, 21 Aug 2023 13:24:46 -0400 Subject: [PATCH 2/4] fix: green button colors --- public/assets/css/game.css | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/public/assets/css/game.css b/public/assets/css/game.css index 55a52fc..69187e7 100644 --- a/public/assets/css/game.css +++ b/public/assets/css/game.css @@ -80,10 +80,10 @@ button.red:hover { background: #b20b00; } button.green { - background: #0a0; + background: url(data:image/png;base64,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), linear-gradient(to bottom, #41d437 0%, #0a9404 100%); } button.green:hover { - background: #0b0; + background: url(data:image/png;base64,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), linear-gradient(to bottom, #32e027 0%, #10a209 100%); } button:active { position: relative; @@ -458,6 +458,9 @@ nav.filter-result.active { .city-details.flex > div { margin: 1rem; } +.service-in-town { + padding: 0 1rem; +} h1 { font-size: 1.5rem; font-weight: bold; -- 2.25.1 From 8a7161cad8a7b1f504bf3da24cb165451f6ff2a1 Mon Sep 17 00:00:00 2001 From: xangelo Date: Mon, 21 Aug 2023 13:27:14 -0400 Subject: [PATCH 3/4] fix: chat history clearning existing chat on load Since we delay chat history loading for 1s, when it does load there is the possibility that the history messages wipe out any existing messages. This ensures that they get prepended to the chat and appear before any new messages. --- public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index 746e2c3..777ee8d 100644 --- a/public/index.html +++ b/public/index.html @@ -66,7 +66,7 @@
-
+
-- 2.25.1 From d7950b8ede85c05353da018d5627733d064a3b4f Mon Sep 17 00:00:00 2001 From: xangelo Date: Mon, 21 Aug 2023 13:28:30 -0400 Subject: [PATCH 4/4] chore(release): 0.2.11 --- CHANGELOG.md | 9 +++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cdb4ac..dc33716 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.2.11](https://git.xangelo.ca/?p=risinglegends.git;a=commitdiff;h=v0.2.11;hp=v0.2.10;ds=sidebyside) (2023-08-21) + + +### Bug Fixes + +* chat history clearning existing chat on load 8a7161c +* green button colors b8755db +* migrate recruiter to htmx 8f42a66 + ### [0.2.10](https://git.xangelo.ca/?p=risinglegends.git;a=commitdiff;h=v0.2.10;hp=v0.2.9;ds=sidebyside) (2023-08-18) diff --git a/package-lock.json b/package-lock.json index 5a38573..3a59fa9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "rising-legends", - "version": "0.2.10", + "version": "0.2.11", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "rising-legends", - "version": "0.2.10", + "version": "0.2.11", "dependencies": { "@honeycombio/opentelemetry-node": "^0.4.0", "@opentelemetry/auto-instrumentations-node": "^0.37.0", diff --git a/package.json b/package.json index 2a9e74b..b651e63 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "rising-legends", "private": true, - "version": "0.2.10", + "version": "0.2.11", "scripts": { "up": "npx prisma migrate dev --name \"init\"", "start": "pm2 start dist/server/api.js", -- 2.25.1