Hacky movement issue fix
Maybe Kistaro can do better? This design has the problem that like most designs that don't move the player to a contact point, walking into a wall causes vibration.
This commit is contained in:
		| @@ -196,34 +196,11 @@ export class HuntMode { | ||||
|       this.faceLeft = false; | ||||
|     } | ||||
|  | ||||
|     let szX = 0.5; | ||||
|     let szY = 0.5; | ||||
|     let szX = 0.1; | ||||
|     let szY = 0.1; | ||||
|  | ||||
|     this.velocity = new Point(dx, dy); | ||||
|  | ||||
|     // try to push us away from walls if we're close | ||||
|     for (let offset of CARDINAL_DIRECTIONS.values()) { | ||||
|       let bigBbox = new Rect( | ||||
|         this.floatingPlayer | ||||
|           .offset(offset.scale(new Size(0.12, 0.12))) | ||||
|           .offset(new Point(-szX / 2, -szY / 2)), | ||||
|         new Size(szX, szY), | ||||
|       ); | ||||
|  | ||||
|       let hitsWall = false; | ||||
|       for (let cell of bigBbox.overlappedCells(new Size(1, 1)).values()) { | ||||
|         if (this.#blocksMovement(cell.top)) { | ||||
|           hitsWall = true; | ||||
|           break; | ||||
|         } | ||||
|       } | ||||
|       if (hitsWall) { | ||||
|         this.velocity = this.velocity.offset( | ||||
|           offset.scale(new Point(0.005, 0.005)).negate(), | ||||
|         ); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     let origin = new Point(szX / 2, szY / 2); | ||||
|     let bbox = new Rect( | ||||
|       this.floatingPlayer.offset(origin.negate()), | ||||
| @@ -233,8 +210,44 @@ export class HuntMode { | ||||
|       this.isBlocked(b), | ||||
|     ); | ||||
|     this.floatingPlayer = this.floatingPlayer.offset(displacement); | ||||
|     this.velocity = dxy; | ||||
|     // this.velocity = dxy; | ||||
|     getPlayerProgress().spendBlood(displacement.distance(new Point(0, 0)) * 10); | ||||
|  | ||||
|     // try to push us away from walls if we're close | ||||
|     for (let { dist, strength } of [ | ||||
|       { dist: 0.12, strength: 0.02 }, | ||||
|       { dist: 0.22, strength: 0.015 }, | ||||
|       { dist: 0.32, strength: 0.01 }, | ||||
|     ].values()) { | ||||
|       for (let offset of CARDINAL_DIRECTIONS.values()) { | ||||
|         let bigBbox = new Rect( | ||||
|           this.floatingPlayer | ||||
|             .offset(offset.scale(new Size(dist, dist))) | ||||
|             .offset(new Point(-szX / 2, -szY / 2)), | ||||
|           new Size(szX, szY), | ||||
|         ); | ||||
|  | ||||
|         let hitsWall = false; | ||||
|         for (let cell of bigBbox.overlappedCells(new Size(1, 1)).values()) { | ||||
|           if (this.#blocksMovement(cell.top)) { | ||||
|             hitsWall = true; | ||||
|             break; | ||||
|           } | ||||
|         } | ||||
|         if (hitsWall) { | ||||
|           bbox = new Rect( | ||||
|             this.floatingPlayer.offset(origin.negate()), | ||||
|             new Size(szX, szY), | ||||
|           ); | ||||
|           let { displacement } = displace( | ||||
|             bbox, | ||||
|             offset.scale(new Point(strength, strength)).negate(), | ||||
|             (b: Rect) => this.isBlocked(b), | ||||
|           ); | ||||
|           this.floatingPlayer = this.floatingPlayer.offset(displacement); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   #updateFov() { | ||||
|   | ||||
| @@ -665,12 +665,10 @@ export class ThrallCollectionPlatePickup { | ||||
|     } else { | ||||
|       callbacks = new StatPickupCallbacks(what); | ||||
|     } | ||||
|     if (callbacks == null) { return; } | ||||
|     let floater = new Floater( | ||||
|       xy.offset(new Point(0.5, 0.5)), | ||||
|       50, | ||||
|       callbacks, | ||||
|     ); | ||||
|     if (callbacks == null) { | ||||
|       return; | ||||
|     } | ||||
|     let floater = new Floater(xy.offset(new Point(0.5, 0.5)), 50, callbacks); | ||||
|     let speed = 0.015; | ||||
|     let direction = Math.random() * Math.PI * 2; | ||||
|     floater.velocity = new Point( | ||||
|   | ||||
| @@ -22,7 +22,7 @@ import { | ||||
|   sprThrallStealth, | ||||
| } from "./sprites.ts"; | ||||
| import { Sprite } from "./engine/internal/sprite.ts"; | ||||
| import {Stat} from "./datatypes.ts"; | ||||
| import { Stat } from "./datatypes.ts"; | ||||
|  | ||||
| export type Thrall = { | ||||
|   id: number; | ||||
| @@ -133,7 +133,9 @@ export let thrallParty = table.add({ | ||||
|     '"Oh, that? Yeah, I won it." And then lost it, apparently.\n\nHe\'s elated. He will never leave.', | ||||
|   rewardMessage: "Garrett showers you with INT!", | ||||
|   rewardCallback: (spawn) => { | ||||
|     for (let i = 0; i < 30; i++) { spawn("INT"); } | ||||
|     for (let i = 0; i < 30; i++) { | ||||
|       spawn("INT"); | ||||
|     } | ||||
|   }, | ||||
|   lifeStageText: { | ||||
|     fresh: { | ||||
| @@ -205,7 +207,9 @@ export let thrallLore = table.add({ | ||||
|     "Lupin looks at his own reflection -- with interest, confusion, dismissal, and then deep satisfaction. He loves it. He will never leave.", | ||||
|   rewardMessage: "Lupin showers you with AGI!", | ||||
|   rewardCallback: (spawn) => { | ||||
|     for (let i = 0; i < 30; i++) { spawn("AGI"); } | ||||
|     for (let i = 0; i < 30; i++) { | ||||
|       spawn("AGI"); | ||||
|     } | ||||
|   }, | ||||
|   lifeStageText: { | ||||
|     fresh: { | ||||
| @@ -274,8 +278,12 @@ export let thrallBat = table.add({ | ||||
|     'Monica salivates. "This is... this is... simply exquisite!"\n\nShe is happy. She will never leave.', | ||||
|   rewardMessage: "Monica showers you with CHA and INT!", | ||||
|   rewardCallback: (spawn) => { | ||||
|     for (let i = 0; i < 15; i++) { spawn("CHA"); } | ||||
|     for (let i = 0; i < 15; i++) { spawn("INT"); } | ||||
|     for (let i = 0; i < 15; i++) { | ||||
|       spawn("CHA"); | ||||
|     } | ||||
|     for (let i = 0; i < 15; i++) { | ||||
|       spawn("INT"); | ||||
|     } | ||||
|   }, | ||||
|   lifeStageText: { | ||||
|     fresh: { | ||||
| @@ -344,7 +352,9 @@ export let thrallCharm = table.add({ | ||||
|     "Renfield inhales sharply and widens his stance, trying to hide his physical reaction to your face. He is elated and will never leave.", | ||||
|   rewardMessage: "Renfield showers you with PSI!", | ||||
|   rewardCallback: (spawn) => { | ||||
|     for (let i = 0; i < 24; i++) { spawn("PSI"); } | ||||
|     for (let i = 0; i < 24; i++) { | ||||
|       spawn("PSI"); | ||||
|     } | ||||
|   }, | ||||
|   lifeStageText: { | ||||
|     fresh: { | ||||
| @@ -411,8 +421,12 @@ export let thrallStealth = table.add({ | ||||
|     "\"That? That's not mine.\" But she wants it. Now it's hers. She will never leave.", | ||||
|   rewardMessage: "Narthyss showers you with CHA and AGI!", | ||||
|   rewardCallback: (spawn) => { | ||||
|     for (let i = 0; i < 15; i++) { spawn("CHA"); } | ||||
|     for (let i = 0; i < 15; i++) { spawn("AGI"); } | ||||
|     for (let i = 0; i < 15; i++) { | ||||
|       spawn("CHA"); | ||||
|     } | ||||
|     for (let i = 0; i < 15; i++) { | ||||
|       spawn("AGI"); | ||||
|     } | ||||
|   }, | ||||
|   lifeStageText: { | ||||
|     fresh: { | ||||
| @@ -480,7 +494,9 @@ export let thrallStare = table.add({ | ||||
|     "Ridley admires the gear but -- to your surprise -- refuses to jam it into its brain.\n\nThe pup is elated and will never leave.", | ||||
|   rewardMessage: "Ridley showers you with EXP!", | ||||
|   rewardCallback: (spawn) => { | ||||
|     for (let i = 0; i < 6; i++) { spawn("EXP"); } | ||||
|     for (let i = 0; i < 6; i++) { | ||||
|       spawn("EXP"); | ||||
|     } | ||||
|   }, | ||||
|   lifeStageText: { | ||||
|     fresh: { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user