566 lines
19 KiB
JavaScript
566 lines
19 KiB
JavaScript
|
import { colorDict, DOWN } from "./constants.js";
|
|||
|
import { OrientedSprite } from "./vgdl-sprite.js";
|
|||
|
import * as tools from "../tools.js";
|
|||
|
import { oncePerStep, unitVector, vectNorm } from "../tools.js";
|
|||
|
import { Resource } from "./resource.js";
|
|||
|
import { ContinuousPhysics } from "./physics.js";
|
|||
|
|
|||
|
export function getColor(sprite) {
|
|||
|
try {
|
|||
|
let color = sprite.color;
|
|||
|
try {
|
|||
|
return colorDict[color];
|
|||
|
} catch (e) {
|
|||
|
console.log(e);
|
|||
|
return color;
|
|||
|
}
|
|||
|
} catch (e) {
|
|||
|
console.log(e);
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export function scoreChange(sprite, partner, game, kwargs) {
|
|||
|
// console.log(`Before Score Change: ${kwargs.score}/${game.score}`)
|
|||
|
game.score += kwargs.score ?? kwargs.value;
|
|||
|
|
|||
|
// console.log(`Score Change: ${kwargs.score}/${game.score}`)
|
|||
|
|
|||
|
return ["scoreChange", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export let changeScore = scoreChange;
|
|||
|
|
|||
|
export function nothing(sprite, partner, game, kwargs) {
|
|||
|
return ["nothing", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function killSprite(sprite, partner, game, kwargs) {
|
|||
|
game.kill_list.push(sprite);
|
|||
|
// console.log("kill sprite", sprite.name, partner.name, game.collision_set)
|
|||
|
return [
|
|||
|
"killSprite",
|
|||
|
sprite.ID || sprite,
|
|||
|
partner ? partner.ID || partner : null,
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
//正好与killsprite效果相反,专门为大预言模型设计
|
|||
|
export function removeSprite(sprite, partner, game, kwargs) {
|
|||
|
game.kill_list.push(partner);
|
|||
|
return [
|
|||
|
"removeSprite",
|
|||
|
sprite.ID || sprite,
|
|||
|
partner ? partner.ID || partner : null,
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
export function cloneSprite(sprite, partner, game, kwargs) {
|
|||
|
game._createSprite([sprite.name], [sprite.location.x, sprite.location.y]);
|
|||
|
return ["cloneSprite", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function transformTo(sprite, partner, game, kwargs) {
|
|||
|
// let hasID = partner.ID in sprite.transformedBy;
|
|||
|
// let validTime;
|
|||
|
// if (hasID) {
|
|||
|
// if (game.time > sprite.transformedBy[partner.ID] + 3) {
|
|||
|
// validTime = true;
|
|||
|
// } else {
|
|||
|
// validTime = false;
|
|||
|
// }
|
|||
|
// }
|
|||
|
// if (!(hasID) || validTime) {
|
|||
|
//(sprite.transformedBy.has(partner.ID)) {
|
|||
|
//sprite.transformedBy.add(partner.ID);
|
|||
|
|
|||
|
sprite.transformedBy[partner.ID] = game.time;
|
|||
|
let stype = kwargs.stype;
|
|||
|
const forceOrientation = kwargs.forceOrientation;
|
|||
|
|
|||
|
let newones = game._createSprite(
|
|||
|
[stype],
|
|||
|
[sprite.location.x, sprite.location.y],
|
|||
|
);
|
|||
|
|
|||
|
if (newones.length > 0) {
|
|||
|
if (
|
|||
|
forceOrientation ||
|
|||
|
(sprite instanceof OrientedSprite &&
|
|||
|
newones[0] instanceof OrientedSprite &&
|
|||
|
vectNorm(newones[0].orientation) === 0)
|
|||
|
)
|
|||
|
newones[0].orientation = sprite.orientation;
|
|||
|
newones[0].transformedBy = sprite.transformedBy;
|
|||
|
newones[0].lastlocation = { ...sprite.lastlocation };
|
|||
|
killSprite(sprite, partner, game, kwargs);
|
|||
|
}
|
|||
|
|
|||
|
// if(kwargs['killSecond'] && kwargs['killSecond'] === true){
|
|||
|
// game.kill_list.push(partner)
|
|||
|
// }
|
|||
|
|
|||
|
return ["transformTo", sprite.ID || sprite, partner.ID || partner];
|
|||
|
// } else {
|
|||
|
// return;
|
|||
|
// }
|
|||
|
}
|
|||
|
|
|||
|
export function transformToAll(sprite, partner, game, kwargs) {
|
|||
|
//(sprite.transformedBy.has(partner.ID)) {
|
|||
|
//sprite.transformedBy.add(partner.ID);
|
|||
|
sprite.transformedBy[partner.ID] = game.time;
|
|||
|
let stype = kwargs.stype;
|
|||
|
const sprites = game.getSprites(stype);
|
|||
|
|
|||
|
sprites.forEach((s) => {
|
|||
|
transformTo(s, partner, game, { stype: kwargs.stypeTo });
|
|||
|
});
|
|||
|
|
|||
|
return ["transforrmToAll", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function stepBack(sprite, partner, game, kwargs) {
|
|||
|
// console.log(`[Step Back] ${sprite.name} last location: ${JSON.stringify(sprite.lastlocation)}`)
|
|||
|
sprite.location = { x: sprite.lastlocation.x, y: sprite.lastlocation.y };
|
|||
|
return ["stepBack", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function bounceForward(sprite, partner, game, kwargs) {
|
|||
|
// console.log("bounce forward", sprite.name, partner.name, JSON.stringify(partner.lastdirection()))
|
|||
|
// detect if the partner is moving toward the sprite
|
|||
|
if(game.use_frame){
|
|||
|
const partner2spriteVector = [sprite.location.x - partner.location.x, sprite.location.y - partner.location.y]
|
|||
|
const dotResult = tools.dot(partner2spriteVector, partner.orientation)
|
|||
|
if(dotResult <= 0.2) {return;}
|
|||
|
}
|
|||
|
sprite.physics.activeMovement(
|
|||
|
sprite,
|
|||
|
tools.unitVector(partner.lastdirection()),
|
|||
|
partner.speed,
|
|||
|
);
|
|||
|
game._updateCollisionDict(sprite);
|
|||
|
return ["bounceForward", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function conveySprite(sprite, partner, game, kwargs) {
|
|||
|
let sprite_lastlocation = { ...sprite.lastlocation };
|
|||
|
let vect = tools.unitVector(partner.orientation);
|
|||
|
sprite.physics.activeMovement(sprite, vect, partner.strength);
|
|||
|
sprite.lastlocation = sprite_lastlocation;
|
|||
|
game._updateCollisionDict(sprite);
|
|||
|
return ["conveySprite", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function windGust(sprite, partner, game, kwargs) {
|
|||
|
let s = partner.strength - [0, 1, -1].randomElement();
|
|||
|
if (s !== 0) {
|
|||
|
let sprite_lastlocation = { ...sprite.lastlocation };
|
|||
|
let vect = tools.unitVector(partner.orientation);
|
|||
|
sprite.physics.activeMovement(sprite, vect, s);
|
|||
|
sprite.lastlocation = sprite_lastlocation;
|
|||
|
game._updateCollisionDict(sprite);
|
|||
|
}
|
|||
|
|
|||
|
return ["windGust", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function slipForward(sprite, partner, game, kwargs) {
|
|||
|
if (kwargs.prob > Math.random()) {
|
|||
|
let sprite_lastlocation = { ...sprite.lastlocation };
|
|||
|
let vect = tools.unitVector(partner.orientation);
|
|||
|
sprite.physics.activeMovement(sprite, vect, 1);
|
|||
|
sprite.lastlocation = sprite_lastlocation;
|
|||
|
game._updateCollisionDict(sprite);
|
|||
|
}
|
|||
|
|
|||
|
return ["slipForward", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function undoAll(sprite, partner, game, kwargs) {
|
|||
|
const notStypeStr = kwargs["nontStype"] ?? "";
|
|||
|
const notStype = notStypeStr.split(",").map((s) => s.trim());
|
|||
|
game._iterAllExcept(notStype).forEach((s) => {
|
|||
|
s.location = { ...s.lastlocation };
|
|||
|
});
|
|||
|
return ["undoAll", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function attractGaze(sprite, partner, game, kwargs) {
|
|||
|
if (kwargs.prob > Math.random()) {
|
|||
|
sprite.orientation = partner.orientation;
|
|||
|
}
|
|||
|
|
|||
|
return ["attractGaze", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function turnAround(sprite, partner, game, kwargs) {
|
|||
|
sprite.location = sprite.lastlocation;
|
|||
|
sprite.lastmove = sprite.cooldown;
|
|||
|
sprite.physics.activeMovement(sprite, DOWN);
|
|||
|
sprite.lastmove = sprite.cooldown;
|
|||
|
sprite.physics.activeMovement(sprite, DOWN);
|
|||
|
reverseDirection(sprite, partner, game, kwargs);
|
|||
|
game._updateCollisionDict(sprite);
|
|||
|
return ["turnAround", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function reverseDirection(sprite, partner, game, kwargs) {
|
|||
|
sprite.orientation = [-sprite.orientation[0], -sprite.orientation[1]];
|
|||
|
return ["reverseDirection", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function bounceDirection(sprite, partner, game, kwargs) {
|
|||
|
let friction = kwargs.friction || 0;
|
|||
|
|
|||
|
stepBack(sprite, partner, game);
|
|||
|
let inc = sprite.orientation;
|
|||
|
let snorm = unitVector([
|
|||
|
-sprite.location.x + partner.location.y,
|
|||
|
-sprite.location.y + partner.location.x,
|
|||
|
]);
|
|||
|
|
|||
|
let dp = snorm[0] * inc[0] + snorm[1] * inc[1];
|
|||
|
sprite.orientation = [
|
|||
|
-2 * dp * snorm[0] + inc[0],
|
|||
|
-2 * dp * snorm[1] + inc[1],
|
|||
|
];
|
|||
|
sprite.speed *= 1 - friction;
|
|||
|
return ["bounceDirection", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function wallBounce(sprite, partner, game, kwargs) {
|
|||
|
let friction = kwargs.friction || 0;
|
|||
|
if (!oncePerStep(sprite, game, "lastbounce")) return;
|
|||
|
sprite.speed *= 1 - friction;
|
|||
|
stepBack(sprite, partner, game);
|
|||
|
if (
|
|||
|
Math.abs(sprite.location.x - partner.location.x) >
|
|||
|
Math.abs(sprite.location.y - partner.location.y)
|
|||
|
)
|
|||
|
sprite.orientation = (-sprite.orientation[0], sprite.orientation[1]);
|
|||
|
else sprite.orientation = (sprite.orientation[0], -sprite.orientation[1]);
|
|||
|
// return ('wallBounce', colorDict[str(partner.color)], colorDict[str(sprite.color)])
|
|||
|
// TODO: Not printing for now
|
|||
|
// return ('wallBounce', sprite, partner)
|
|||
|
return ["wallBounce", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function wallStop(sprite, partner, game, kwargs) {
|
|||
|
if (!tools.oncePerStep(sprite, game, "laststop")) return;
|
|||
|
|
|||
|
stepBack(sprite, partner, game, kwargs);
|
|||
|
let x_dist = Math.abs(sprite.location.x - partner.location.x);
|
|||
|
let y_dist = Math.abs(sprite.location.y - partner.location.y);
|
|||
|
let y_orient = sprite.orientation[1] * (1 - kwargs.friction);
|
|||
|
let x_orient = sprite.orientation[0] * (1 - kwargs.friction);
|
|||
|
if (x_dist > y_dist) sprite.orientation = [0, y_orient];
|
|||
|
else sprite.orientation = [x_orient, 0];
|
|||
|
sprite.speed = tools.vectNorm(sprite.orientation) * sprite.speed;
|
|||
|
sprite.orientation = tools.unitVector(sprite.orientation);
|
|||
|
return ["wallStop", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function killIfSlow(sprite, partner, game, kwargs) {
|
|||
|
let limitspeed = kwargs.limitspeed ?? 1000;
|
|||
|
let relspeed = 0;
|
|||
|
if (sprite.is_static) relspeed = partner.speed;
|
|||
|
else if (partner.is_static) relspeed = sprite.speed;
|
|||
|
else
|
|||
|
relspeed = tools.vectNorm([
|
|||
|
sprite._velocity()[0] - partner._velocity()[0],
|
|||
|
sprite._velocity()[1] - partner._velocity()[1],
|
|||
|
]);
|
|||
|
if (relspeed < limitspeed) {
|
|||
|
killSprite(sprite, partner, game);
|
|||
|
return ["killIfSlow", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export function killIfFromAbove(sprite, partner, game, kwargs) {
|
|||
|
if (
|
|||
|
sprite.lastlocation.y > partner.lastlocation.y &&
|
|||
|
partner.location.y > partner.lastlocation.y
|
|||
|
) {
|
|||
|
killSprite(sprite, partner, game);
|
|||
|
return ["killIfFromAbove", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export function killIfAlive(sprite, partner, game, kwargs) {
|
|||
|
if (!game.kill_list.contains(partner)) {
|
|||
|
killSprite(sprite, partner, game);
|
|||
|
return ["killIfAlive", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export function killBoth(sprite, partner, game, kwargs) {
|
|||
|
if (!game.kill_list.contains(partner)) {
|
|||
|
killSprite(sprite, partner, game);
|
|||
|
killSprite(partner, sprite, game);
|
|||
|
return ["killBoth", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export function killAll(sprite, partner, game, kwargs) {
|
|||
|
const stype = kwargs.stype;
|
|||
|
const sprites = game.getSprites(stype);
|
|||
|
sprites.forEach((s) => {
|
|||
|
killSprite(s, partner, game, kwargs);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
export function collectResource(sprite, partner, game, kwargs) {
|
|||
|
// console.assert(sprite instanceof Resource);
|
|||
|
let resource_type = sprite.name;
|
|||
|
partner.resources[resource_type] = Math.max(
|
|||
|
-1,
|
|||
|
Math.min(
|
|||
|
partner.resources.get(resource_type) + sprite.value,
|
|||
|
game.resources_limits.get(resource_type),
|
|||
|
),
|
|||
|
);
|
|||
|
killSprite(sprite, partner, game, kwargs);
|
|||
|
return ["collectResource", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function changeResource(sprite, partner, game, kwargs) {
|
|||
|
let resource = kwargs.resource;
|
|||
|
let value = kwargs.value || 1;
|
|||
|
let sprite_resource = sprite.resources[resource] || 0;
|
|||
|
let resource_limit = game.resources_limits[resource] || Infinity;
|
|||
|
sprite.resources[resource] = Math.max(
|
|||
|
-1,
|
|||
|
Math.min(sprite_resource + value, resource_limit),
|
|||
|
);
|
|||
|
|
|||
|
if (kwargs.killResource) {
|
|||
|
killSprite(partner, undefined, game, {});
|
|||
|
}
|
|||
|
return ["changeResource", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function spawnIfHasMore(sprite, partner, game, kwargs) {
|
|||
|
const resource = kwargs.resource;
|
|||
|
const stype = kwargs.stype;
|
|||
|
let limit = kwargs.limit || 1;
|
|||
|
if (sprite.resources[resource] >= limit) {
|
|||
|
game._createSprite([stype], [sprite.location.x, sprite.location.y]);
|
|||
|
return ["spawnIfHasMore", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export function spawnIfHasLess(sprite, partner, game, kwargs) {
|
|||
|
const resource = kwargs.resource;
|
|||
|
const stype = kwargs.stype;
|
|||
|
let limit = kwargs.limit || 1;
|
|||
|
if (sprite.resources[resource] < limit) {
|
|||
|
game._createSprite([stype], [sprite.location.x, sprite.location.y]);
|
|||
|
return ["spawnIfHasLess", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export function killIfHasMore(sprite, partner, game, kwargs) {
|
|||
|
let limit = kwargs.limit;
|
|||
|
let resource = kwargs.resource;
|
|||
|
if (sprite.resources[resource] === undefined) sprite.resources[resource] = 0;
|
|||
|
if (sprite.resources[resource] >= limit) {
|
|||
|
killSprite(sprite, partner, game, kwargs);
|
|||
|
return ["killIfHasMore", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export function killIfHasLess(sprite, partner, game, kwargs) {
|
|||
|
let resource = kwargs.resource;
|
|||
|
let limit = kwargs.limit;
|
|||
|
if (sprite.resources[resource] === undefined) sprite.resources[resource] = 0;
|
|||
|
if (sprite.resources[resource] <= limit) {
|
|||
|
killSprite(sprite, partner, game, kwargs);
|
|||
|
return ["killIfHasLess", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export function killIfOtherHasMore(sprite, partner, game, kwargs) {
|
|||
|
let resource = kwargs.resource;
|
|||
|
let limit = kwargs.limit;
|
|||
|
if (sprite.resources[resource] === undefined) {
|
|||
|
sprite.resources[resource] = 0;
|
|||
|
}
|
|||
|
if (partner.resources[resource] >= limit) {
|
|||
|
killSprite(sprite, partner, game, kwargs);
|
|||
|
return ["killIfOtherHasMore", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export function wrapAround(sprite, partner, game, kwargs) {
|
|||
|
let offset = kwargs.offset || 0;
|
|||
|
|
|||
|
if (sprite.orientation[0] > 0) sprite.location.x = offset * 1;
|
|||
|
else if (sprite.orientation[0] < 0)
|
|||
|
sprite.location.x = game.screensize[0] - 1 * (1 + offset);
|
|||
|
if (sprite.orientation[1] > 0) sprite.location.y = offset * 1;
|
|||
|
else if (sprite.orientation[1] < 0)
|
|||
|
sprite.location.y = game.screensize[1] - 1 * (1 + offset);
|
|||
|
sprite.lastmove = 0;
|
|||
|
return ["wrapAround", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function pullWithIt(sprite, partner, game, kwargs) {
|
|||
|
if (!tools.oncePerStep(sprite, game, "lastpull")){
|
|||
|
// console.log("once per step o!", sprite.name, sprite["_lastpull"], game.time)
|
|||
|
return;
|
|||
|
}
|
|||
|
let tmp = { ...sprite.lastlocation };
|
|||
|
let v = tools.unitVector(partner.lastdirection());
|
|||
|
// console.log("Pull with it!", sprite.name, sprite["_lastpull"], game.time, sprite.physics.gridsize[0], partner.speed);
|
|||
|
sprite._updatePos(v, partner.speed * sprite.physics.gridsize[0]);
|
|||
|
if (sprite.physics instanceof ContinuousPhysics) {
|
|||
|
sprite.speed = partner.speed;
|
|||
|
sprite.orientation = partner.lastdirection;
|
|||
|
}
|
|||
|
sprite.lastlocation = { ...tmp };
|
|||
|
}
|
|||
|
|
|||
|
export function teleportToExit(sprite, partner, game, kwargs) {
|
|||
|
let rand_sprite;
|
|||
|
try {
|
|||
|
rand_sprite = game.sprite_groups[partner.stype].randomElement();
|
|||
|
} catch (error) {
|
|||
|
rand_sprite = game.sprite_groups["goal"].randomElement();
|
|||
|
}
|
|||
|
|
|||
|
sprite.location = { ...rand_sprite.location };
|
|||
|
sprite.lastmove = 0;
|
|||
|
return ["teleportToExit", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export const stochastic_effects = [
|
|||
|
teleportToExit,
|
|||
|
windGust,
|
|||
|
slipForward,
|
|||
|
attractGaze,
|
|||
|
];
|
|||
|
export const kill_effects = [
|
|||
|
killSprite,
|
|||
|
killIfSlow,
|
|||
|
transformTo,
|
|||
|
transformToAll,
|
|||
|
killIfOtherHasMore,
|
|||
|
killIfHasMore,
|
|||
|
killIfHasLess,
|
|||
|
killIfFromAbove,
|
|||
|
killIfAlive,
|
|||
|
];
|
|||
|
|
|||
|
export function spawn(sprite, partner, game, kwargs) {
|
|||
|
const stype = kwargs["stype"];
|
|||
|
game._createSprite([stype], [sprite.location.x, sprite.location.y]);
|
|||
|
}
|
|||
|
|
|||
|
export function setSpeedForAll(sprite, partner, game, kwargs) {
|
|||
|
const value = kwargs["value"] ?? 1.0;
|
|||
|
const stype = kwargs["stype"];
|
|||
|
const sprites = game.getSprites(stype);
|
|||
|
sprites.forEach((s) => (s.speed = value));
|
|||
|
return ["setSpeedForAll", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function align(sprite, partner, game, kwargs) {
|
|||
|
const orient = kwargs["orient"];
|
|||
|
if (orient) sprite.orient = Object.copy(orient);
|
|||
|
sprite.location = Object.copy(partner.location);
|
|||
|
return ["align", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function addHealthPoints(sprite, partner, game, kwargs) {
|
|||
|
const value = kwargs.value;
|
|||
|
if (sprite.healthPoints + value < sprite.limitHealthPoints) {
|
|||
|
sprite.healthPoints += value;
|
|||
|
sprite.healthPoints = Math.min(sprite.healthPoints, sprite.maxHealthPoints);
|
|||
|
}
|
|||
|
return ["addHealthPoints", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function addHealthPointsToMax(sprite, partner, game, kwargs) {
|
|||
|
const value = kwargs.value;
|
|||
|
if (sprite.healthPoints + value < sprite.limitHealthPoints) {
|
|||
|
sprite.healthPoints += value;
|
|||
|
} else {
|
|||
|
sprite.healthPoints = sprite.limitHealthPoints;
|
|||
|
}
|
|||
|
|
|||
|
if (sprite.healthPoints > sprite.maxHealthPoints)
|
|||
|
sprite.maxHealthPoints = sprite.healthPoints;
|
|||
|
|
|||
|
return ["addHealthPointsToMax", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function subtractHealthPoints(sprite, partner, game, kwargs) {
|
|||
|
const value = kwargs.value || 0;
|
|||
|
const stype = kwargs.stype;
|
|||
|
const limit = kwargs.limit || 0;
|
|||
|
if (stype) {
|
|||
|
const sprites = game.getSprites(stype);
|
|||
|
sprites.forEach((s) => {
|
|||
|
s.healthPoints -= value;
|
|||
|
if (s.healthPoints <= limit) {
|
|||
|
killSprite(s, partner, game, kwargs);
|
|||
|
}
|
|||
|
});
|
|||
|
} else {
|
|||
|
sprite.healthPoints -= value;
|
|||
|
if (sprite.healthPoints <= limit) {
|
|||
|
killSprite(sprite, partner, game, kwargs);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return ["subtractHealthPoints", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function transformToRandomChild(sprite, partner, game, kwargs) {
|
|||
|
const stype = kwargs.stype;
|
|||
|
if (stype) {
|
|||
|
console.log();
|
|||
|
const types = Object.keys(game.getSubTypes(stype));
|
|||
|
transformTo(sprite, partner, game, { stype: types.randomElement() });
|
|||
|
}
|
|||
|
return ["transformToRandomChild", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function shieldFrom(sprite, partner, game, kwargs) {
|
|||
|
const stype = kwargs.stype;
|
|||
|
const ftype = kwargs.ftype;
|
|||
|
game.addShield(sprite.stypes, stype, ftype);
|
|||
|
return ["shieldFrom", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|
|||
|
|
|||
|
export function killIfFrontal(sprite, partner, game, kwargs) {
|
|||
|
const direction1 = unitVector(sprite.lastdirection());
|
|||
|
const direction2 = unitVector(partner.lastdirection());
|
|||
|
// console.log("kill if frontal")
|
|||
|
const dirsum = [direction1[0] + direction2[0], direction1[1] + direction2[1]];
|
|||
|
|
|||
|
if (vectNorm(dirsum) === 0 || vectNorm(direction1) === 0) {
|
|||
|
killSprite(sprite, partner, game, kwargs);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export function killIfNotFrontal(sprite, partner, game, kwargs) {
|
|||
|
const direction1 = unitVector(sprite.lastdirection());
|
|||
|
const direction2 = unitVector(partner.lastdirection());
|
|||
|
|
|||
|
const dirsum = [direction1[0] + direction2[0], direction1[1] + direction2[1]];
|
|||
|
// console.log("kill not frontal", dirsum, direction1)
|
|||
|
if (vectNorm(dirsum) !== 0 || vectNorm(direction1) === 0) {
|
|||
|
killSprite(sprite, partner, game, kwargs);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export function increaseSpeedToAll(sprite, partner, game, kwargs) {
|
|||
|
const value = kwargs.value || 0.1;
|
|||
|
const stype = kwargs.stype;
|
|||
|
if(!stype) return;
|
|||
|
const sprites = game.getSprites(stype);
|
|||
|
sprites.forEach((s) => (s.speed += value));
|
|||
|
return ["increaseSpeedToAll", sprite.ID || sprite, partner.ID || partner];
|
|||
|
}
|