Skip to content

Commit 94b9fe0

Browse files
RaihanRasheedApurboRaihan Rasheedfaucomte97
authored
fix: allow cows to be placed on a non-road square (#1746)
* allow cows to be placed on a non road square * fix bug during playing a custom game * Merge branch 'master' into Allow-for-cows-to-be-placed-on-a-non-road-square Co-Authored-By: Raihan Rasheed <[email protected]> Co-Authored-By: Florian Aucomte <[email protected]>
1 parent 9f8718a commit 94b9fe0

File tree

4 files changed

+73
-72
lines changed

4 files changed

+73
-72
lines changed

game/static/game/js/animation.js

+7-7
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ ocargo.Animation.prototype.isFinished = function() {
3838

3939
ocargo.Animation.prototype.addCows = function() {
4040
let cows = this.model.cows;
41-
41+
4242
for (let i = 0 ; i < cows.length ; i++){
4343
let cow = cows[i];
44-
for (let j = 0; j < cow.potentialNodes.length; j++) {
45-
const cowImage = this.drawing.renderCow(cow.id, cow.potentialNodes[j].coordinate, cow.potentialNodes[j], 0, cow.type);
44+
for (let j = 0; j < cow.coordinates.length; j++) {
45+
const cowImage = this.drawing.renderCow(cow.id, cow.coordinates[j], cow.potentialNodes[j], 0, cow.type);
4646
this.numberOfCowsOnMap++;
4747
this.activeCows.push(cowImage);
4848
}
@@ -385,9 +385,9 @@ ocargo.Animation.prototype.performAnimation = function(animation) {
385385
this.drawing.transitionTrafficLight(animation.id, animation.colour, duration/2);
386386
break;
387387
case 'cow_leave':
388-
this.numberOfCowsOnMap--;
389-
var cow = this._extractCowAt(animation.coordinate);
390-
this.drawing.removeCow(cow, duration); // remove it from drawing
388+
this.numberOfCowsOnMap--;
389+
var cow = this._extractCowAt(animation.coordinate);
390+
this.drawing.removeCow(cow, duration); // remove it from drawing
391391
break;
392392
case 'console':
393393
ocargo.pythonControl.appendToConsole(animation.text);
@@ -399,7 +399,7 @@ ocargo.Animation.prototype.performAnimation = function(animation) {
399399
ocargo.Animation.prototype._extractCowAt = function(coordinate) {
400400
for (var i = 0; i < this.activeCows.length; i++) {
401401
var cow = this.activeCows[i];
402-
if (cow.coordinate == coordinate) {
402+
if (coordinate.equals(cow.coordinate)) {
403403
this.activeCows.splice(i, 1); // remove cow from array
404404
return cow;
405405
}

game/static/game/js/cow.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@ ocargo.Cow = function(id, data, nodes) {
88
this.type = data.type;
99
this.potentialNodes = []; // Potential nodes at which a cow could appear
1010
this.activeNodes = {}; // Actual nodes at which cows will appear during a run.
11+
this.coordinates = []; // coordinates of the cows, some cows may have null nodes that denotes they are outside of road
12+
1113
for(var i = 0; i < data.potentialCoordinates.length; i++) {
1214
var coordinate = new ocargo.Coordinate(data.potentialCoordinates[i].x, data.potentialCoordinates[i].y);
13-
var node = ocargo.Node.findNodeByCoordinate(coordinate, nodes)
14-
this.potentialNodes.push(ocargo.Node.findNodeByCoordinate(coordinate, nodes));
15-
var coordinate_str = JSON.stringify(node.coordinate)
16-
this.activeNodes[coordinate_str] = ocargo.Cow.ACTIVE
15+
var node = ocargo.Node.findNodeByCoordinate(coordinate, nodes);
16+
this.potentialNodes.push(node);
17+
var coordinate_str = JSON.stringify(coordinate);
18+
this.activeNodes[coordinate_str] = ocargo.Cow.ACTIVE;
19+
this.coordinates.push(coordinate);
1720
}
1821
};
1922
ocargo.Cow.prototype.reset = function() {

game/static/game/js/drawing.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -753,8 +753,11 @@ ocargo.Drawing = function (startingPosition) {
753753
let xOffset = 0
754754
let yOffset = 0
755755
let rotation = 0
756-
757-
if (node.connectedNodes.length === 1) {
756+
if (node == null) {
757+
// the cow is outside of road
758+
rotation = 0
759+
}
760+
else if (node.connectedNodes.length === 1) {
758761
// Deadends
759762
let previousNode = node.connectedNodes[0]
760763
let nextNode = {}

game/static/game/js/level_editor.js

+54-59
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,7 @@ ocargo.LevelEditor = function(levelId) {
10611061
} else {
10621062
closeTrashcan();
10631063
}
1064-
}
1064+
}
10651065

10661066
function openTrashcan() {
10671067
$('#trashcanLidOpen').css('display', 'block');
@@ -1226,8 +1226,8 @@ ocargo.LevelEditor = function(levelId) {
12261226
if (cows) {
12271227
for (var i = 0; i < cows.length; i++) {
12281228
var internalCow = cows[i];
1229-
if (internalCow.controlledNode) {
1230-
mark(internalCow.controlledNode.coordinate, internalCow.data.group.color, 0.3, true);
1229+
if (internalCow.coordinate) {
1230+
mark(internalCow.coordinate, internalCow.data.group.color, 0.3, true);
12311231
}
12321232
}
12331233
}
@@ -1683,7 +1683,7 @@ ocargo.LevelEditor = function(levelId) {
16831683
var bBox = image.getBBox();
16841684
imageWidth = bBox.width;
16851685
imageHeight = bBox.height;
1686-
1686+
16871687
var paperPosition = paper.position();
16881688
originX = x - paperPosition.left + paper.scrollLeft() - imageWidth/2;
16891689
originY = y - paperPosition.top + paper.scrollTop() - imageHeight/2;
@@ -1699,46 +1699,44 @@ ocargo.LevelEditor = function(levelId) {
16991699

17001700
if (trashcanOpen) {
17011701
cow.destroy();
1702-
} else if (isValidDraggedCowPlacement(controlledCoord, cow)) {
1703-
// Add back to the list of cows if on valid nodes
1704-
var controlledNode = ocargo.Node.findNodeByCoordinate(controlledCoord, nodes);
1705-
cow.controlledNode = controlledNode;
1706-
cow.valid = true;
1707-
drawing.setCowImagePosition(controlledCoord, image, controlledNode);
1702+
closeTrashcan();
17081703
} else {
1709-
cow.controlledNode = null;
1710-
cow.valid = false;
1711-
1712-
var cowX = paperX;
1713-
var cowY = paperY;
1714-
1715-
if (paperWidth < paperX + imageWidth) {
1716-
cowX = paperWidth - imageWidth
1704+
cow.coordinate = controlledCoord;
1705+
cow.valid = isValidDraggedCowPlacement(controlledCoord, cow);
1706+
if (cow.isOnRoad()) {
1707+
const controlledNode = ocargo.Node.findNodeByCoordinate(controlledCoord, nodes);
1708+
drawing.setCowImagePosition(controlledCoord, image, controlledNode);
17171709
}
1718-
1719-
if (paperHeight < paperY + imageHeight) {
1720-
cowY = paperHeight - imageHeight
1710+
else {
1711+
var cowX = paperX;
1712+
var cowY = paperY;
1713+
1714+
if (paperWidth < paperX + imageWidth) {
1715+
cowX = paperWidth - imageWidth
1716+
}
1717+
1718+
if (paperHeight < paperY + imageHeight) {
1719+
cowY = paperHeight - imageHeight
1720+
}
1721+
1722+
image.transform('t' + cowX + ',' + cowY);
17211723
}
1722-
1723-
image.transform('t' + cowX + ',' + cowY);
17241724
}
1725-
adjustCowGroupMinMaxFields(cow);
17261725

1726+
adjustCowGroupMinMaxFields(cow);
17271727
image.attr({'cursor':'pointer'});
1728-
closeTrashcan();
17291728
}
17301729

17311730
image.drag(onDragMove, onDragStart, onDragEnd);
17321731
addReleaseListeners(image.node);
17331732
}
17341733

17351734
function isValidDraggedCowPlacement(controlledCoord, cow){
1736-
var controlledNode = ocargo.Node.findNodeByCoordinate(controlledCoord, nodes);
1737-
if (!controlledNode || isOriginCoordinate(controlledCoord) || isHouseCoordinate(controlledCoord))
1735+
if (isOriginCoordinate(controlledCoord) || isHouseCoordinate(controlledCoord))
17381736
return false;
17391737
for (var i=0; i < cows.length; i++) {
17401738
var otherCow = cows[i];
1741-
if (otherCow.controlledNode == controlledNode && (cow === "undefined" || cow != otherCow))
1739+
if (cow != otherCow && otherCow.coordinate && otherCow.coordinate.equals(controlledCoord))
17421740
return false;
17431741
}
17441742
return true;
@@ -1764,14 +1762,6 @@ ocargo.LevelEditor = function(levelId) {
17641762
if (controlledCoord) {
17651763
markAsBackground(controlledCoord);
17661764
}
1767-
if (cows) {
1768-
for( let i = 0; i < cows.length; i++){
1769-
let internalCow = cows[i];
1770-
if(internalCow !== cow && internalCow.controlledNode) {
1771-
mark(internalCow.controlledNode.coordinate, internalCow.data.group.color, 0.3, true);
1772-
}
1773-
}
1774-
}
17751765
if (originNode) {
17761766
markAsOrigin(originNode.coordinate);
17771767
}
@@ -1783,8 +1773,8 @@ ocargo.LevelEditor = function(levelId) {
17831773
}
17841774

17851775
function setCowMarkingsOnMouseUp(controlledCoord, cow) {
1786-
if (cow.controlledNode) {
1787-
markAsBackground(cow.controlledNode.coordinate);
1776+
if (cow.isOnRoad()) {
1777+
markAsBackground(cow.coordinate);
17881778
}
17891779
if (controlledCoord) {
17901780
mark(controlledCoord, cow.data.group.color, 0.3, true);
@@ -1858,20 +1848,18 @@ ocargo.LevelEditor = function(levelId) {
18581848
function handleDraggableCowMouseUp(e){
18591849
let internalCow = new InternalCow({group: cowGroups["group1"]});
18601850
let image = internalCow.image;
1851+
internalCow.coordinate = controlledCoord;
1852+
internalCow.valid = isValidDraggedCowPlacement(controlledCoord, internalCow);
18611853

1862-
if (isValidDraggedCowPlacement(controlledCoord)) {
1863-
internalCow.controlledNode = ocargo.Node.findNodeByCoordinate(controlledCoord, nodes);
1864-
internalCow.valid = true;
1865-
drawing.setCowImagePosition(controlledCoord, image, internalCow.controlledNode);
1854+
if (internalCow.isOnRoad()) {
1855+
const controlledNode = ocargo.Node.findNodeByCoordinate(controlledCoord, nodes);
1856+
drawing.setCowImagePosition(controlledCoord, image, controlledNode);
18661857
} else {
1867-
internalCow.controlledNode = null;
1868-
internalCow.valid = false;
1869-
18701858
const cowX = e.pageX + paper.scrollLeft() - TAB_PANE_WIDTH - dragged_cow.width / 2;
18711859
const cowY = e.pageY + paper.scrollTop() - dragged_cow.height / 2;
18721860

18731861
if (draggedObjectOnGrid(e, dragged_cow)) {
1874-
image.transform('t' + cowX + ',' + cowY + 'r90');
1862+
image.transform('t' + cowX + ',' + cowY);
18751863
} else {
18761864
internalCow.destroy();
18771865
}
@@ -2488,7 +2476,7 @@ ocargo.LevelEditor = function(levelId) {
24882476
type: cowGroups[groupId].type}; //editor can only add white cow for now
24892477
}
24902478

2491-
var coordinates = cows[i].controlledNode.coordinate;
2479+
var coordinates = cows[i].coordinate;
24922480
var strCoordinates = {'x':coordinates.x, 'y':coordinates.y};
24932481
cowGroupData[groupId].potentialCoordinates.push(strCoordinates);
24942482
}
@@ -2920,9 +2908,8 @@ ocargo.LevelEditor = function(levelId) {
29202908
if (!this.valid) {
29212909
throw "Error: cannot create actual cow from invalid internal cow!";
29222910
}
2923-
29242911
// Where the cow is placed.
2925-
var coordinates = this.controlledNode.coordinate;
2912+
var coordinates = this.coordinate;
29262913
var strCoordinates= {'x':coordinates.x, 'y':coordinates.y};
29272914

29282915
return { "coordinates": [strCoordinates],
@@ -2944,6 +2931,10 @@ ocargo.LevelEditor = function(levelId) {
29442931

29452932
};
29462933

2934+
this.isOnRoad = function() {
2935+
return this.coordinate && ocargo.Node.findNodeByCoordinate(this.coordinate, nodes);
2936+
}
2937+
29472938
this.updateTheme = function() {
29482939
let newType = currentTheme == THEMES.city ? ocargo.Cow.PIGEON : ocargo.Cow.WHITE;
29492940
let transformDimensions = this["image"]["_"]["transform"][0]
@@ -2958,10 +2949,9 @@ ocargo.LevelEditor = function(levelId) {
29582949
this.image.remove();
29592950

29602951
this.image = drawing.createCowImage(newType);
2961-
if (this.controlledNode !== null) {
2962-
let controlledNode = this.controlledNode;
2963-
let coordinates = controlledNode.coordinate;
2964-
drawing.setCowImagePosition(coordinates, this.image, controlledNode);
2952+
if (this.isOnRoad()) {
2953+
let controlledNode = ocargo.Node.findNodeByCoordinate(coordinates, nodes);
2954+
drawing.setCowImagePosition(this.coordinate, this.image, controlledNode);
29652955
} else {
29662956
this.image.transform("t" + x + "," + y + " r" + r);
29672957
}
@@ -2972,14 +2962,19 @@ ocargo.LevelEditor = function(levelId) {
29722962
this.image = drawing.createCowImage(data.group.type);
29732963
this.valid = false;
29742964

2975-
29762965
if ( data.coordinates && data.coordinates.length > 0 ) {
2977-
var coordinates = new ocargo.Coordinate(data.coordinates[0].x, data.coordinates[0].y);
2978-
this.controlledNode = ocargo.Node.findNodeByCoordinate(coordinates, nodes);
2966+
this.coordinate = new ocargo.Coordinate(data.coordinates[0].x, data.coordinates[0].y);
2967+
this.valid = isValidDraggedCowPlacement(this.coordinate, this);
29792968

2980-
if (this.controlledNode) {
2981-
this.valid = true;
2982-
drawing.setCowImagePosition(coordinates, this.image, this.controlledNode);
2969+
if (this.isOnRoad()) {
2970+
const controlledNode = ocargo.Node.findNodeByCoordinate(this.coordinate, nodes);
2971+
drawing.setCowImagePosition(this.coordinate, this.image, controlledNode);
2972+
} else {
2973+
const box = this.image.getBBox();
2974+
// calculate position of the image
2975+
const paperX = (this.coordinate.x + 1) * GRID_SPACE_SIZE - box.width/2;
2976+
const paperY = (GRID_HEIGHT - this.coordinate.y) * GRID_SPACE_SIZE - box.height/2;
2977+
this.image.transform('t' + paperX + ',' + paperY );
29832978
}
29842979
} else {
29852980
this.image.transform('...t' + (-paper.scrollLeft()) + ',' + paper.scrollTop());

0 commit comments

Comments
 (0)