Merge pull request #6280 from imgntn/colorbuster

Color Busters Game
This commit is contained in:
Brad Hefta-Gaub 2015-11-11 15:52:18 -08:00
commit 2363ca044e
3 changed files with 494 additions and 0 deletions

View file

@ -0,0 +1,265 @@
//
// colorBusterWand.js
//
// Created by James B. Pollack @imgntn on 11/2/2015
// Copyright 2015 High Fidelity, Inc.
//
// This is the entity script that attaches to a wand for the Color Busters game
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
(function() {
Script.include("../../../libraries/utils.js");
var COMBINED_COLOR_DURATION = 5;
var INDICATOR_OFFSET_UP = 0.40;
var REMOVE_CUBE_SOUND_URL = 'http://hifi-public.s3.amazonaws.com/sounds/color_busters/boop.wav';
var COMBINE_COLORS_SOUND_URL = 'http://hifi-public.s3.amazonaws.com/sounds/color_busters/powerup.wav';
var COLOR_INDICATOR_DIMENSIONS = {
x: 0.10,
y: 0.10,
z: 0.10
};
var _this;
function ColorBusterWand() {
_this = this;
}
ColorBusterWand.prototype = {
combinedColorsTimer: null,
soundIsPlaying: false,
preload: function(entityID) {
print("preload");
this.entityID = entityID;
this.REMOVE_CUBE_SOUND = SoundCache.getSound(REMOVE_CUBE_SOUND_URL);
this.COMBINE_COLORS_SOUND = SoundCache.getSound(COMBINE_COLORS_SOUND_URL);
},
collisionWithEntity: function(me, otherEntity, collision) {
var otherProperties = Entities.getEntityProperties(otherEntity, ["name", "userData"]);
var myProperties = Entities.getEntityProperties(me, ["userData"]);
var myUserData = JSON.parse(myProperties.userData);
var otherUserData = JSON.parse(otherProperties.userData);
if (otherProperties.name === 'Hifi-ColorBusterWand') {
print('HIT ANOTHER COLOR WAND!!');
if (otherUserData.hifiColorBusterWandKey.colorLocked !== true && myUserData.hifiColorBusterWandKey.colorLocked !== true) {
if (otherUserData.hifiColorBusterWandKey.originalColorName === myUserData.hifiColorBusterWandKey.originalColorName) {
print('BUT ITS THE SAME COLOR!')
return;
} else {
print('COMBINE COLORS!' + this.entityID);
this.combineColorsWithOtherWand(otherUserData.hifiColorBusterWandKey.originalColorName, myUserData.hifiColorBusterWandKey.originalColorName);
}
}
}
if (otherProperties.name === 'Hifi-ColorBusterCube') {
if (otherUserData.hifiColorBusterCubeKey.originalColorName === myUserData.hifiColorBusterWandKey.currentColor) {
print('HIT THE SAME COLOR CUBE');
this.removeCubeOfSameColor(otherEntity);
} else {
print('HIT A CUBE OF A DIFFERENT COLOR');
}
}
},
combineColorsWithOtherWand: function(otherColor, myColor) {
print('combining my :' + myColor + " with their: " + otherColor);
if ((myColor === 'violet') || (myColor === 'orange') || (myColor === 'green')) {
print('MY WAND ALREADY COMBINED');
return;
}
var newColor;
if ((otherColor === 'red' && myColor == 'yellow') || (myColor === 'red' && otherColor === 'yellow')) {
//orange
newColor = 'orange';
}
if ((otherColor === 'red' && myColor == 'blue') || (myColor === 'red' && otherColor === 'blue')) {
//violet
newColor = 'violet';
}
if ((otherColor === 'blue' && myColor == 'yellow') || (myColor === 'blue' && otherColor === 'yellow')) {
//green.
newColor = 'green';
}
_this.combinedColorsTimer = Script.setTimeout(function() {
_this.resetToOriginalColor(myColor);
_this.combinedColorsTimer = null;
}, COMBINED_COLOR_DURATION * 1000);
setEntityCustomData('hifiColorBusterWandKey', this.entityID, {
owner: MyAvatar.sessionUUID,
currentColor: newColor,
originalColorName: myColor,
colorLocked: false
});
this.playSoundAtCurrentPosition(false);
},
setCurrentColor: function(newColor) {
var color;
if (newColor === 'orange') {
color = {
red: 255,
green: 165,
blue: 0
};
}
if (newColor === 'violet') {
color = {
red: 128,
green: 0,
blue: 128
};
}
if (newColor === 'green') {
color = {
red: 0,
green: 255,
blue: 0
};
}
if (newColor === 'red') {
color = {
red: 255,
green: 0,
blue: 0
};
}
if (newColor === 'yellow') {
color = {
red: 255,
green: 255,
blue: 0
};
}
if (newColor === 'blue') {
color = {
red: 0,
green: 0,
blue: 255
};
}
Entities.editEntity(this.colorIndicator, {
color: color
});
// print('SET THIS COLOR INDICATOR TO:' + newColor);
},
resetToOriginalColor: function(myColor) {
setEntityCustomData('hifiColorBusterWandKey', this.entityID, {
owner: MyAvatar.sessionUUID,
currentColor: myColor,
originalColorName: myColor,
colorLocked: false
});
this.setCurrentColor(myColor);
},
removeCubeOfSameColor: function(cube) {
this.playSoundAtCurrentPosition(true);
Entities.callEntityMethod(cube, 'cubeEnding');
Entities.deleteEntity(cube);
},
startNearGrab: function() {
this.currentProperties = Entities.getEntityProperties(this.entityID);
this.createColorIndicator();
},
continueNearGrab: function() {
this.currentProperties = Entities.getEntityProperties(this.entityID);
var color = JSON.parse(this.currentProperties.userData).hifiColorBusterWandKey.currentColor;
this.setCurrentColor(color);
this.updateColorIndicatorLocation();
},
releaseGrab: function() {
Entities.deleteEntity(this.colorIndicator);
if (this.combinedColorsTimer !== null) {
Script.clearTimeout(this.combinedColorsTimer);
}
},
createColorIndicator: function(color) {
var properties = {
name: 'Hifi-ColorBusterIndicator',
type: 'Box',
dimensions: COLOR_INDICATOR_DIMENSIONS,
position: this.currentProperties.position,
collisionsWillMove: false,
ignoreForCollisions: true
}
this.colorIndicator = Entities.addEntity(properties);
},
updateColorIndicatorLocation: function() {
var position;
var upVector = Quat.getUp(this.currentProperties.rotation);
var indicatorVector = Vec3.multiply(upVector, INDICATOR_OFFSET_UP);
position = Vec3.sum(this.currentProperties.position, indicatorVector);
var properties = {
position: position,
rotation: this.currentProperties.rotation
}
Entities.editEntity(this.colorIndicator, properties);
},
playSoundAtCurrentPosition: function(isRemoveCubeSound) {
var position = Entities.getEntityProperties(this.entityID, "position").position;
var audioProperties = {
volume: 0.25,
position: position
};
if (isRemoveCubeSound === true) {
Audio.playSound(this.REMOVE_CUBE_SOUND, audioProperties);
} else {
Audio.playSound(this.COMBINE_COLORS_SOUND, audioProperties);
}
},
};
return new ColorBusterWand();
});

View file

@ -0,0 +1,130 @@
//
// createColorBusterCubes.js
//
// Created by James B. Pollack @imgntn on 11/2/2015
// Copyright 2015 High Fidelity, Inc.
//
// This script creates cubes that can be removed with a Color Buster wand.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
var DELETE_AT_ENDING = false;
var CUBE_DIMENSIONS = {
x: 1,
y: 1,
z: 1
};
var NUMBER_OF_CUBES_PER_SIDE = 8;
var STARTING_CORNER_POSITION = {
x: 100,
y: 100,
z: 100
};
var STARTING_COLORS = [
['red', {
red: 255,
green: 0,
blue: 0
}],
['yellow', {
red: 255,
green: 255,
blue: 0
}],
['blue', {
red: 0,
green: 0,
blue: 255
}],
['orange', {
red: 255,
green: 165,
blue: 0
}],
['violet', {
red: 128,
green: 0,
blue: 128
}],
['green', {
red: 0,
green: 255,
blue: 0
}]
];
function chooseStartingColor() {
var startingColor = STARTING_COLORS[Math.floor(Math.random() * STARTING_COLORS.length)];
return startingColor;
}
var cubes = [];
function createColorBusterCube(row, column, vertical) {
print('make cube at ' + row + ':' + column + ":" + vertical);
var position = {
x: STARTING_CORNER_POSITION.x + row,
y: STARTING_CORNER_POSITION.y + vertical,
z: STARTING_CORNER_POSITION.z + column
};
var startingColor = chooseStartingColor();
var colorBusterCubeProperties = {
name: 'Hifi-ColorBusterCube',
type: 'Box',
dimensions: CUBE_DIMENSIONS,
collisionsWillMove: false,
ignoreForCollisions: false,
color: startingColor[1],
position: position,
userData: JSON.stringify({
hifiColorBusterCubeKey: {
originalColorName: startingColor[0]
},
grabbableKey: {
grabbable: false
}
})
};
var cube = Entities.addEntity(colorBusterCubeProperties);
cubes.push(cube);
return cube
}
function createBoard() {
var vertical;
var row;
var column;
for (vertical = 0; vertical < NUMBER_OF_CUBES_PER_SIDE; vertical++) {
print('vertical:' + vertical)
//create a single layer
for (row = 0; row < NUMBER_OF_CUBES_PER_SIDE; row++) {
print('row:' + row)
for (column = 0; column < NUMBER_OF_CUBES_PER_SIDE; column++) {
print('column:' + column)
createColorBusterCube(row, column, vertical)
}
}
}
}
function deleteCubes() {
while (cubes.length > 0) {
Entities.deleteEntity(cubes.pop());
}
}
if (DELETE_AT_ENDING === true) {
Script.scriptEnding.connect(deleteCubes);
}
createBoard();

View file

@ -0,0 +1,99 @@
//
// createColorBusterWand.js
//
// Created by James B. Pollack @imgntn on 11/2/2015
// Copyright 2015 High Fidelity, Inc.
//
// This script creates a wand that can be used to remove color buster blocks. Touch your wand to someone else's to combine colors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
var DELETE_AT_ENDING = false;
var COLOR_WAND_MODEL_URL = 'http://hifi-public.s3.amazonaws.com/models/color_busters/wand.fbx';
var COLOR_WAND_COLLISION_HULL_URL = 'http://hifi-public.s3.amazonaws.com/models/color_busters/wand_collision_hull.obj';
var COLOR_WAND_SCRIPT_URL = Script.resolvePath('colorBusterWand.js');
var COLOR_WAND_DIMENSIONS = {
x: 0.04,
y: 0.87,
z: 0.04
};
var COLOR_WAND_START_POSITION = {
x: 0,
y: 0,
z: 0
};
var STARTING_COLORS = [
['red', {
red: 255,
green: 0,
blue: 0
}],
['yellow', {
red: 255,
green: 255,
blue: 0
}],
['blue', {
red: 0,
green: 0,
blue: 255
}]
];
var center = Vec3.sum(Vec3.sum(MyAvatar.position, {
x: 0,
y: 0.5,
z: 0
}), Vec3.multiply(0.5, Quat.getFront(Camera.getOrientation())));
function chooseStartingColor() {
var startingColor = STARTING_COLORS[Math.floor(Math.random() * STARTING_COLORS.length)];
return startingColor
}
var wand;
function createColorBusterWand() {
var startingColor = chooseStartingColor();
var colorBusterWandProperties = {
name: 'Hifi-ColorBusterWand',
type: 'Model',
modelURL: COLOR_WAND_MODEL_URL,
shapeType: 'compound',
compoundShapeURL: COLOR_WAND_COLLISION_HULL_URL,
dimensions: COLOR_WAND_DIMENSIONS,
position: center,
script: COLOR_WAND_SCRIPT_URL,
collisionsWillMove: true,
userData: JSON.stringify({
hifiColorBusterWandKey: {
owner: MyAvatar.sessionUUID,
currentColor: startingColor[0],
originalColorName: startingColor[0],
colorLocked: false
},
grabbableKey: {
invertSolidWhileHeld: false
}
})
};
wand = Entities.addEntity(colorBusterWandProperties);
}
function deleteWand() {
Entities.deleteEntity(wand);
}
if (DELETE_AT_ENDING === true) {
Script.scriptEnding.connect(deleteWand);
}
createColorBusterWand();