Adjust action management
This commit is contained in:
parent
8f02009062
commit
9ab05fe40b
|
@ -2,3 +2,20 @@ export interface Action {
|
||||||
type: string
|
type: string
|
||||||
priority: number
|
priority: number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function adjustAction(actions: Action[], type: string, v: number, inc?: boolean): Action[] {
|
||||||
|
let action = actions.find(v=>v.type===type)
|
||||||
|
if (!action) {
|
||||||
|
if (v === 0) return actions
|
||||||
|
actions.push({
|
||||||
|
type: type,
|
||||||
|
priority: v,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
action.priority = inc?action.priority+v:v
|
||||||
|
if (action.priority <= 0) {
|
||||||
|
actions = actions.filter(v=>v!==action)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return actions
|
||||||
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ import { SegmentZone } from "../data/segment"
|
||||||
import { Zone } from "../live/Zone"
|
import { Zone } from "../live/Zone"
|
||||||
import { Entity, Sensor } from "../live/Entity"
|
import { Entity, Sensor } from "../live/Entity"
|
||||||
import { AnimalEntity, isAnimalEntity } from "../live/AnimalEntity"
|
import { AnimalEntity, isAnimalEntity } from "../live/AnimalEntity"
|
||||||
import { Action } from "../live/Action"
|
import { Action, adjustAction } from "../live/Action"
|
||||||
import { WorldContext } from "../live/World"
|
import { WorldContext } from "../live/World"
|
||||||
import { animals } from "../data/animals"
|
import { animals } from "../data/animals"
|
||||||
|
|
||||||
|
@ -218,13 +218,7 @@ export function GameState(ctx: ContextI): StateI {
|
||||||
rootContainer.position.set(Math.round(ctx.app.renderer.width/2), Math.round(ctx.app.renderer.height/2))
|
rootContainer.position.set(Math.round(ctx.app.renderer.width/2), Math.round(ctx.app.renderer.height/2))
|
||||||
rootContainer.pivot.set(Math.max(rootContainer.width/6, Math.min(entity.x, rootContainer.width/3)), Math.max(rootContainer.height/6, Math.min(entity.y, rootContainer.height/3)))
|
rootContainer.pivot.set(Math.max(rootContainer.width/6, Math.min(entity.x, rootContainer.width/3)), Math.max(rootContainer.height/6, Math.min(entity.y, rootContainer.height/3)))
|
||||||
} else {
|
} else {
|
||||||
//if (entity.body?.)
|
entity.think(realDelta)
|
||||||
// Some sort of simple AI.
|
|
||||||
if (!entity.isMonster) {
|
|
||||||
// Slowly wander and run from player if close.
|
|
||||||
} else {
|
|
||||||
// Heavily wander and run towards player if close.
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//console.log('hmm, we do be tickin', entity, entity.x, entity.y)
|
//console.log('hmm, we do be tickin', entity, entity.x, entity.y)
|
||||||
|
@ -327,42 +321,27 @@ export function GameState(ctx: ContextI): StateI {
|
||||||
}
|
}
|
||||||
|
|
||||||
let desiredActions: Action[] = []
|
let desiredActions: Action[] = []
|
||||||
let adjustAction = (type: string, v: number, inc?: boolean) => {
|
|
||||||
let action = desiredActions.find(v=>v.type===type)
|
|
||||||
if (!action) {
|
|
||||||
if (v === 0) return
|
|
||||||
desiredActions.push({
|
|
||||||
type: type,
|
|
||||||
priority: v,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
action.priority = inc?action.priority+v:v
|
|
||||||
if (action.priority <= 0) {
|
|
||||||
desiredActions = desiredActions.filter(v=>v!==action)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let keyup = (e: KeyboardEvent) => {
|
let keyup = (e: KeyboardEvent) => {
|
||||||
if (e.key === 'ArrowLeft') {
|
if (e.key === 'ArrowLeft') {
|
||||||
adjustAction('west', 0)
|
desiredActions = adjustAction(desiredActions, 'west', 0)
|
||||||
} else if (e.key === 'ArrowRight') {
|
} else if (e.key === 'ArrowRight') {
|
||||||
adjustAction('east', 0)
|
desiredActions = adjustAction(desiredActions, 'east', 0)
|
||||||
} else if (e.key === 'ArrowUp') {
|
} else if (e.key === 'ArrowUp') {
|
||||||
adjustAction('north', 0)
|
desiredActions = adjustAction(desiredActions, 'north', 0)
|
||||||
} else if (e.key === 'ArrowDown') {
|
} else if (e.key === 'ArrowDown') {
|
||||||
adjustAction('south', 0)
|
desiredActions = adjustAction(desiredActions, 'south', 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let keydown = (e: KeyboardEvent) => {
|
let keydown = (e: KeyboardEvent) => {
|
||||||
if (e.repeat) return
|
if (e.repeat) return
|
||||||
if (e.key === 'ArrowLeft') {
|
if (e.key === 'ArrowLeft') {
|
||||||
adjustAction('west', 1)
|
desiredActions = adjustAction(desiredActions, 'west', 1)
|
||||||
} else if (e.key === 'ArrowRight') {
|
} else if (e.key === 'ArrowRight') {
|
||||||
adjustAction('east', 1)
|
desiredActions = adjustAction(desiredActions, 'east', 1)
|
||||||
} else if (e.key === 'ArrowUp') {
|
} else if (e.key === 'ArrowUp') {
|
||||||
adjustAction('north', 1)
|
desiredActions = adjustAction(desiredActions, 'north', 1)
|
||||||
} else if (e.key === 'ArrowDown') {
|
} else if (e.key === 'ArrowDown') {
|
||||||
adjustAction('south', 1)
|
desiredActions = adjustAction(desiredActions, 'south', 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let hookKeyboard = () => {
|
let hookKeyboard = () => {
|
||||||
|
@ -386,22 +365,21 @@ export function GameState(ctx: ContextI): StateI {
|
||||||
for (let gp of navigator.getGamepads()) {
|
for (let gp of navigator.getGamepads()) {
|
||||||
if (!gp || !gp.connected) break
|
if (!gp || !gp.connected) break
|
||||||
if (gp.axes[0] < 0) {
|
if (gp.axes[0] < 0) {
|
||||||
adjustAction('west', Math.abs(gp.axes[0]))
|
desiredActions = adjustAction(desiredActions, 'west', Math.abs(gp.axes[0]))
|
||||||
} else if (gp.axes[0] > 0) {
|
} else if (gp.axes[0] > 0) {
|
||||||
adjustAction('east', gp.axes[0])
|
desiredActions = adjustAction(desiredActions, 'east', gp.axes[0])
|
||||||
} else {
|
} else {
|
||||||
adjustAction('east', 0)
|
desiredActions = adjustAction(desiredActions, 'east', 0)
|
||||||
adjustAction('west', 0)
|
desiredActions = adjustAction(desiredActions, 'west', 0)
|
||||||
}
|
}
|
||||||
if (gp.axes[1] < 0) {
|
if (gp.axes[1] < 0) {
|
||||||
adjustAction('north', Math.abs(gp.axes[1]))
|
desiredActions = adjustAction(desiredActions, 'north', Math.abs(gp.axes[1]))
|
||||||
} else if (gp.axes[1] > 0) {
|
} else if (gp.axes[1] > 0) {
|
||||||
adjustAction('south', gp.axes[1])
|
desiredActions = adjustAction(desiredActions, 'south', gp.axes[1])
|
||||||
} else {
|
} else {
|
||||||
adjustAction('north', 0)
|
desiredActions = adjustAction(desiredActions, 'north', 0)
|
||||||
adjustAction('south', 0)
|
desiredActions = adjustAction(desiredActions, 'south', 0)
|
||||||
}
|
}
|
||||||
//console.log(gp.axes, gp.buttons)
|
|
||||||
let attackHeld = false
|
let attackHeld = false
|
||||||
for (let i = 0; i < 4; i++) {
|
for (let i = 0; i < 4; i++) {
|
||||||
let btn = gp.buttons[i]
|
let btn = gp.buttons[i]
|
||||||
|
@ -410,9 +388,9 @@ export function GameState(ctx: ContextI): StateI {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (attackHeld) {
|
if (attackHeld) {
|
||||||
adjustAction('attack', 2)
|
desiredActions = adjustAction(desiredActions, 'attack', 2)
|
||||||
} else if (desiredActions.find(v=>v.type==='attack')) {
|
} else if (desiredActions.find(v=>v.type==='attack')) {
|
||||||
adjustAction('attack', 0)
|
desiredActions = adjustAction(desiredActions, 'attack', 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user