Add gibbing
This commit is contained in:
parent
15370173ad
commit
ca4fc063e9
|
@ -3,6 +3,7 @@ import { AnimalDefinition, CreatureDefinition } from '../data/animals'
|
||||||
import { playSong, playSound } from '../shared/audio'
|
import { playSong, playSound } from '../shared/audio'
|
||||||
import { Action, adjustAction } from "./Action"
|
import { Action, adjustAction } from "./Action"
|
||||||
import { Entity, Sensor } from "./Entity"
|
import { Entity, Sensor } from "./Entity"
|
||||||
|
import { GibletEntity } from './GibletEntity'
|
||||||
import { PuddleEntity } from './PuddleEntity'
|
import { PuddleEntity } from './PuddleEntity'
|
||||||
import { WorldContext } from './World'
|
import { WorldContext } from './World'
|
||||||
|
|
||||||
|
@ -22,6 +23,8 @@ export class AnimalEntity extends Entity {
|
||||||
stepSoundElapsed: number = 0
|
stepSoundElapsed: number = 0
|
||||||
lastYellElapsed: number = 0
|
lastYellElapsed: number = 0
|
||||||
nextYell: number = 1000
|
nextYell: number = 1000
|
||||||
|
dead: boolean = false
|
||||||
|
shouldGib: boolean = false
|
||||||
|
|
||||||
constructor(def: AnimalDefinition) {
|
constructor(def: AnimalDefinition) {
|
||||||
super(`${def.name}.animal.stand.west.0`)
|
super(`${def.name}.animal.stand.west.0`)
|
||||||
|
@ -44,6 +47,16 @@ export class AnimalEntity extends Entity {
|
||||||
}
|
}
|
||||||
update(delta: number, ctx: WorldContext) {
|
update(delta: number, ctx: WorldContext) {
|
||||||
super.update(delta)
|
super.update(delta)
|
||||||
|
|
||||||
|
if (this.dead) {
|
||||||
|
if (this.shouldGib) {
|
||||||
|
this.gib(ctx)
|
||||||
|
this.shouldGib = false
|
||||||
|
}
|
||||||
|
this.shouldRemove = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
this.lastYellElapsed += delta
|
this.lastYellElapsed += delta
|
||||||
|
|
||||||
let waterZones = this.zones.filter(v=>v.type==='fluid')
|
let waterZones = this.zones.filter(v=>v.type==='fluid')
|
||||||
|
@ -262,6 +275,31 @@ export class AnimalEntity extends Entity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
gib(ctx: WorldContext) {
|
||||||
|
let p = this.position
|
||||||
|
p[0] += this.sprite.container.width/2
|
||||||
|
p[1] += this.sprite.container.height/2
|
||||||
|
this.dead = true
|
||||||
|
let force = -1 + Math.random() * 2
|
||||||
|
let dir = Math.random() * 320
|
||||||
|
// 50% head gib
|
||||||
|
if (Math.random() > 0.5) {
|
||||||
|
ctx.addEntity(new GibletEntity(`giblets.${this.sprite.spriteKey}.head.default.0`, dir+Math.random()*40, force+Math.random()*10), 'objects', p[0], p[1])
|
||||||
|
}
|
||||||
|
// 44% leg gib per leg
|
||||||
|
for (let i = 0; i < 4; i++) {
|
||||||
|
if (Math.random() > 0.66) {
|
||||||
|
ctx.addEntity(new GibletEntity(`giblets.${this.sprite.spriteKey}.leg.default.0`, dir+Math.random()*40, force+Math.random()*10), 'objects', p[0], p[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 35% extra gibs per 8
|
||||||
|
for (let i = 0; i < 8; i++) {
|
||||||
|
if (Math.random() > 0.65) {
|
||||||
|
ctx.addEntity(new GibletEntity(`giblets.any.chunk${Math.floor(1+Math.random()*4)}.default.0`, dir+Math.random()*40, force+Math.random()*10), 'objects', p[0], p[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
playSound(`action/splat-v${1+Math.floor(Math.random()*7)}`, 0.5)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isAnimalEntity(o: any): o is AnimalEntity {
|
export function isAnimalEntity(o: any): o is AnimalEntity {
|
||||||
|
|
|
@ -24,6 +24,7 @@ export class Entity {
|
||||||
turnRate: number = 10
|
turnRate: number = 10
|
||||||
zones: Zone[] = []
|
zones: Zone[] = []
|
||||||
contacts: Entity[] = []
|
contacts: Entity[] = []
|
||||||
|
shouldRemove: boolean = false
|
||||||
|
|
||||||
constructor(ctor: string) {
|
constructor(ctor: string) {
|
||||||
this.sprite = new SpriteInstance(ctor)
|
this.sprite = new SpriteInstance(ctor)
|
||||||
|
|
32
Engine/src/live/GibletEntity.ts
Normal file
32
Engine/src/live/GibletEntity.ts
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
import * as planck from 'planck'
|
||||||
|
import { Entity } from "./Entity"
|
||||||
|
import { WorldContext } from "./World"
|
||||||
|
|
||||||
|
export class GibletEntity extends Entity {
|
||||||
|
lifetime: number = 10000
|
||||||
|
elapsed: number = 0
|
||||||
|
constructor(ctor: string, dir: number, force: number) {
|
||||||
|
super(ctor)
|
||||||
|
console.log('dir', dir, 'force', force)
|
||||||
|
let r = dir * (Math.PI/180)
|
||||||
|
this.velocity[0] = Math.cos(r) * force
|
||||||
|
this.velocity[1] = Math.sin(r) * force
|
||||||
|
console.log('velocity', this.velocity)
|
||||||
|
}
|
||||||
|
update(delta: number, ctx?: WorldContext) {
|
||||||
|
super.update(delta)
|
||||||
|
this.elapsed += delta
|
||||||
|
|
||||||
|
this.velocity[0] *= 0.85
|
||||||
|
this.velocity[1] *= 0.85
|
||||||
|
|
||||||
|
// Eh... let's manually handle velocity
|
||||||
|
this.x += this.velocity[0]
|
||||||
|
this.y += this.velocity[1]
|
||||||
|
|
||||||
|
if (this.elapsed >= this.lifetime) {
|
||||||
|
ctx?.removeEntity(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -14,6 +14,7 @@ import { AnimalEntity, isAnimalEntity } from "../live/AnimalEntity"
|
||||||
import { Action, adjustAction } 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"
|
||||||
|
import { GibletEntity } from "../live/GibletEntity"
|
||||||
|
|
||||||
export interface PIXIMissingColorMatrix extends PIXI.Filter {
|
export interface PIXIMissingColorMatrix extends PIXI.Filter {
|
||||||
night(intensity: number, multiply: boolean): void
|
night(intensity: number, multiply: boolean): void
|
||||||
|
@ -46,7 +47,15 @@ export function GameState(ctx: ContextI, selectedAnimal: string, selectedSegment
|
||||||
})
|
})
|
||||||
let worldBody: planck.Body = world.createBody({
|
let worldBody: planck.Body = world.createBody({
|
||||||
type: 'static',
|
type: 'static',
|
||||||
|
linearDamping: 1,
|
||||||
})
|
})
|
||||||
|
worldBody.setPosition(planck.Vec2(0, 0))
|
||||||
|
let worldFixture = worldBody.createFixture({
|
||||||
|
shape: planck.Box(1, 1),
|
||||||
|
friction: 10,
|
||||||
|
density: 100,
|
||||||
|
})
|
||||||
|
|
||||||
world.on('begin-contact', (contact: planck.Contact) => {
|
world.on('begin-contact', (contact: planck.Contact) => {
|
||||||
let a = contact.getFixtureA().getUserData()
|
let a = contact.getFixtureA().getUserData()
|
||||||
let b = contact.getFixtureB().getUserData()
|
let b = contact.getFixtureB().getUserData()
|
||||||
|
@ -199,7 +208,14 @@ export function GameState(ctx: ContextI, selectedAnimal: string, selectedSegment
|
||||||
let x = bounds[0] + Math.floor(Math.random() * bounds[2])
|
let x = bounds[0] + Math.floor(Math.random() * bounds[2])
|
||||||
let y = bounds[1] + Math.floor(Math.random() * bounds[3])
|
let y = bounds[1] + Math.floor(Math.random() * bounds[3])
|
||||||
|
|
||||||
addEntity(new AnimalEntity(animals[animal]), 'objects', x, y)
|
let entity = new AnimalEntity(animals[animal])
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
entity.dead = true
|
||||||
|
entity.shouldGib = true
|
||||||
|
}, 1000+Math.random()*3000)
|
||||||
|
|
||||||
|
addEntity(entity, 'objects', x, y)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.app.stage.addChild(rootContainer)
|
ctx.app.stage.addChild(rootContainer)
|
||||||
|
@ -231,9 +247,9 @@ export function GameState(ctx: ContextI, selectedAnimal: string, selectedSegment
|
||||||
nightfall(true)
|
nightfall(true)
|
||||||
}
|
}
|
||||||
// Run world sim.
|
// Run world sim.
|
||||||
while (elapsed >= 1/2) {
|
while (elapsed >= 1/6) {
|
||||||
world.step(1/2)
|
world.step(1/6)
|
||||||
elapsed -= 1/2
|
elapsed -= 1/6
|
||||||
}
|
}
|
||||||
// Update/render.
|
// Update/render.
|
||||||
/*for (let layer of layers) {
|
/*for (let layer of layers) {
|
||||||
|
@ -260,6 +276,15 @@ export function GameState(ctx: ContextI, selectedAnimal: string, selectedSegment
|
||||||
entity.sprite.container.y = entity.y
|
entity.sprite.container.y = entity.y
|
||||||
entity.sprite.container.zIndex = entity.y + (entity.sprite.frame?entity.sprite.frame.originY??0:0)
|
entity.sprite.container.zIndex = entity.y + (entity.sprite.frame?entity.sprite.frame.originY??0:0)
|
||||||
}
|
}
|
||||||
|
// I guess this is okay.
|
||||||
|
for (let entity of entities) {
|
||||||
|
if (entity.shouldRemove) {
|
||||||
|
if (entity instanceof AnimalEntity) {
|
||||||
|
removeEntity(entity)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//entities = entities.filter(v=>v.shouldRemove)
|
||||||
}
|
}
|
||||||
|
|
||||||
let addEntity = (entity: Entity, layerTitle: string, x: number, y: number) => {
|
let addEntity = (entity: Entity, layerTitle: string, x: number, y: number) => {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user