Skip to content

Commit

Permalink
Merge pull request #56 from SilenceFactor/feature/category
Browse files Browse the repository at this point in the history
Sorting and favorite system
  • Loading branch information
Brent-Call authored Apr 17, 2024
2 parents 63379f3 + 28807ae commit bcc5e18
Show file tree
Hide file tree
Showing 3 changed files with 239 additions and 10 deletions.
2 changes: 2 additions & 0 deletions game.js
Original file line number Diff line number Diff line change
Expand Up @@ -4867,10 +4867,12 @@ dojo.declare("com.nuclearunicorn.game.ui.GamePage", null, {

if (cryochambers > 0) {
this.village.sim.sortKittensByExp();
this.village.sim.sortKittensByFavorite();
newKittens = this.village.sim.kittens.slice(-cryochambers);
for (var i in newKittens) {
delete newKittens[i].job;
delete newKittens[i].engineerSpeciality;
newKittens[i].favorite = true;
}
var usedCryochambers_reset = this.time.filterMetadata([this.time.getVSU("usedCryochambers")], ["name", "val", "on"]);
usedCryochambers_reset[0]["val"] = cryochambers;
Expand Down
237 changes: 228 additions & 9 deletions js/village.js
Original file line number Diff line number Diff line change
Expand Up @@ -1085,6 +1085,7 @@ dojo.declare("com.nuclearunicorn.game.village.Kitten", null, {
//obsolete
isSenator: false,

favorite: false,

constructor: function(){
this.name = this.names[this.rand(this.names.length)];
Expand Down Expand Up @@ -1147,6 +1148,7 @@ dojo.declare("com.nuclearunicorn.game.village.Kitten", null, {
this.color = data.color || 0;
this.variety = data.variety || 0;
this.rarity = data.rarity || 0;
this.favorite = data.favorite || false;

for (var job in this.skills) {
if (this.skills[job] > 20001) {
Expand Down Expand Up @@ -1183,6 +1185,7 @@ dojo.declare("com.nuclearunicorn.game.village.Kitten", null, {
this.isLeader = data.isLeader || false;
this.isSenator = false;
this.isAdopted = data.isAdopted || false;
this.favorite = data.favorite || false;
},

/**
Expand Down Expand Up @@ -1226,7 +1229,8 @@ dojo.declare("com.nuclearunicorn.game.village.Kitten", null, {
engineerSpeciality: this.engineerSpeciality || undefined,
rank: this.rank || undefined,
isLeader: this.isLeader || undefined,
isAdopted: this.isAdopted || undefined
isAdopted: this.isAdopted || undefined,
favorite: this.favorite || undefined
};
},

Expand Down Expand Up @@ -1262,7 +1266,8 @@ dojo.declare("com.nuclearunicorn.game.village.Kitten", null, {
engineerSpeciality: this.engineerSpeciality || undefined,
rank: this.rank || undefined,
isLeader: this.isLeader || undefined,
isAdopted: this.isAdopted || undefined
isAdopted: this.isAdopted || undefined,
favorite: this.favorite || undefined
};
// Custom sur/names
if (nameIndex <= 0 || surnameIndex <= 0) {
Expand Down Expand Up @@ -2259,6 +2264,41 @@ dojo.declare("classes.village.KittenSim", null, {
});
},

sortKittensByFavorite: function(){
this.sortKittensByExp();
this.kittens.sort(function(a,b) {
if(a.favorite == b.favorite){
return 0;
} else {
return a.favorite? 1 : -1;
}
});
},

sortKittensByColor: function(){
this.sortKittensByExp();
this.kittens.sort(function(a,b) {
if(a.color || b.color){
if(a.color && b.color){
return 0;
}
return a.color? 1 : -1;
}
});
},

sortKittensByVariety: function(){
this.sortKittensByExp();
this.kittens.sort(function(a,b) {
if(a.variety || b.variety) {
if(a.variety && b.variety){
return 0;
}
return a.variety? 1 : -1;
}
});
},

getKittens: function(){
return this.kittens.length;
},
Expand Down Expand Up @@ -3438,6 +3478,21 @@ dojo.declare("classes.ui.village.Census", null, {

filterJob: null,
filterTrait: null,
startKitten: 0,
sortKittens: null,
sortOptions: [{
name: "exp",
title: $I("village.census.sort.exp")
},{
name: "favorite",
title: $I("village.census.sort.favorite")
},{
name: "color",
title: $I("village.census.sort.color")
},{
name: "variety",
title: $I("village.census.sort.variety")
}],

constructor: function(game){
this.game = game;
Expand Down Expand Up @@ -3476,6 +3531,7 @@ dojo.declare("classes.ui.village.Census", null, {

dojo.connect(traitSelect, "onchange", this, function (event) {
this.filterTrait = event.target.value;
this.startKitten = 0;
this.render(this.container);
});

Expand All @@ -3497,22 +3553,80 @@ dojo.declare("classes.ui.village.Census", null, {

dojo.connect(jobSelect, "onchange", this, function(event){
var job = event.target.value;
this.startKitten = 0;
this.filterJob = job;
this.render(this.container);
});

var kittensLimit = 0;
//--------------- sorting -----------------

var selectSorting = dojo.create("select", { style: {float: "right" }}, navbar);

for (var i = 0; i < this.sortOptions.length; i++){
var option = this.sortOptions[i];
dojo.create("option", { value: option.name, innerHTML: option.title, selected: (option.name == this.sortKittens)}, selectSorting);
}

dojo.connect(selectSorting, "onchange", this, function(event){
var sorting = event.target.value;
this.sortKittens = sorting;
this.startKitten = 0;
this.render(this.container);
});

var sim = this.game.village.sim;
sim.sortKittensByExp();
if(!this.sortKittens){
sim.sortKittensByExp(); //When switching to this tab, the default sorting is used.
}

switch (this.sortKittens) {
case "exp":
sim.sortKittensByExp();
break;
case "favorite":
sim.sortKittensByFavorite();
break;
case "color":
sim.sortKittensByColor();
break;
case "variety":
sim.sortKittensByVariety();
}

var filterKittens = 0;
var start = this.startKitten;
// Filters work differently from sorting as they skip kittens, because of this a workaround is used
if(this.filterJob || this.filterTrait){
filterKittens = sim.kittens.length;
for(var i in sim.kittens){
var kitten = sim.kittens[i];
if ((this.filterJob && kitten.job !== this.filterJob) || (this.filterTrait && kitten.trait.name !== this.filterTrait)) {
filterKittens--;
}
}

var maxStart = Math.floor(filterKittens / 10) * 10;
filterKittens = Math.floor(Math.min(this.startKitten, filterKittens) / 10) * 10;
if (filterKittens == maxStart && filterKittens > 0){ //Used to prevent empty pages
filterKittens -= 10;
}
this.startKitten = filterKittens;
start = 0;
}

for (var i = sim.kittens.length - 1; i >= 0 && kittensLimit < 10; i--) {
var kittensLimit = 0;

for (var i = sim.kittens.length - (1 + start); i >= 0 && kittensLimit < 10; i--) {

var kitten = sim.kittens[i];

if ((this.filterJob && kitten.job !== this.filterJob) || (this.filterTrait && kitten.trait.name !== this.filterTrait)) {
continue;
}
if(filterKittens > 0){
filterKittens--;
continue;
}

kittensLimit++;

Expand Down Expand Up @@ -3550,6 +3664,15 @@ dojo.declare("classes.ui.village.Census", null, {
}, linksDiv);
}

var favoriteHref = dojo.create("a", {
href: "#", innerHTML: "",
className: "favoriteHref",
style: {
float: "right"
},
title: "Favorite kitten"
}, linksDiv);

var unassignHref = dojo.create("a", {
href: "#", innerHTML: $I("village.btn.unassign.job"),
className: "unassignHref",
Expand All @@ -3567,6 +3690,12 @@ dojo.declare("classes.ui.village.Census", null, {

}, this.game, i));

dojo.connect(favoriteHref, "onclick", this, dojo.partial(function(game, i){
var kitten = game.village.sim.kittens[i];
kitten.favorite = !kitten.favorite;
this.render(this.container);
}, this.game, i));

if (!this.game.challenges.isActive("anarchy")) {
dojo.connect(leaderHref, "onclick", this, dojo.partial(function(census, i, event){
event.preventDefault();
Expand All @@ -3591,9 +3720,86 @@ dojo.declare("classes.ui.village.Census", null, {
kitten: kitten,
unassignHref: unassignHref,
/*senatorHref: senatorHref,*/
leaderHref: leaderHref
leaderHref: leaderHref,
favoriteHref: favoriteHref
});
}

//--------------- Page Switching -----------------

var pageNumber = Math.floor(this.startKitten / 10) + 1;

var pageSwitchDiv = dojo.create("div", {
innerHTML: pageNumber,
style: {
display: "inline-block",
width: "100%",
textAlign: "center",
margin: "0 auto"
}
}, container);
//--------------- Last page -----------------
var lastHref = dojo.create("a", {
href: "#", innerHTML: ">>",
className: "lastHref",
style: {
float: "right"
}
}, pageSwitchDiv);

dojo.connect(lastHref, "onclick", this, dojo.partial(function(){
this.startKitten = sim.kittens.length / 10;
if (Math.floor(this.startKitten) == this.startKitten){
this.startKitten -= 1;
}
this.startKitten = Math.floor(this.startKitten) * 10;
this.render(this.container);
}));
//--------------- Next page -----------------
var nextHref = dojo.create("a", {
href: "#", innerHTML: $I("village.btn.next"),
className: "nextHref",
style: {
float: "right"
}
}, pageSwitchDiv);

dojo.connect(nextHref, "onclick", this, dojo.partial(function(){
if(sim.kittens.length - 10 > this.startKitten){
this.startKitten += 10;
}
this.render(this.container);
}));
//--------------- First Page -----------------
var firstHref = dojo.create("a", {
href: "#", innerHTML: "<<",
className: "firstHref",
style: {
float: "left"
}
}, pageSwitchDiv);

dojo.connect(firstHref, "onclick", this, dojo.partial(function(){
this.startKitten = 0;
this.render(this.container);
}));
//--------------- Previous page -----------------
var previousHref = dojo.create("a", {
href: "#", innerHTML: $I("village.btn.previous"),
className: "previousHref",
style: {
float: "left"
}
}, pageSwitchDiv);

dojo.connect(previousHref, "onclick", this, dojo.partial(function(){
this.startKitten -= 10;
if(this.startKitten < 0){
this.startKitten = 0;
}
this.render(this.container);
}));

},

makeLeader: function(kitten){
Expand Down Expand Up @@ -3646,6 +3852,7 @@ dojo.declare("classes.ui.village.Census", null, {
: this.game.village.sim.getSkillsSorted(kitten.skills);

var info = "";
var craftInfo = "";

for (var j = 0; j < Math.min(skillsArr.length,3) ; j++) {

Expand Down Expand Up @@ -3680,11 +3887,22 @@ dojo.declare("classes.ui.village.Census", null, {
bonus = bonus * 100;
bonus = bonus > 0 ? " +" + bonus.toFixed(0) + "%" : "";
}
if(kitten.job == "engineer" && j == 0){
craftInfo = $I("village.census.crafting") + " ";
if (kitten.engineerSpeciality){
craftInfo += this.game.workshop.getCraft(kitten.engineerSpeciality).label;
} else{
craftInfo += $I("village.census.crafting.nothing");
}
} else{
craftInfo = "";
}


info += "<span class='skill' title='" + exp.toFixed(2) + "'" + style + ">"
+ this.game.village.getJob(skillsArr[j].name).title + bonus
+ " (" + this.game.villageTab.skillToText(exp) + " " + expPercent.toFixed() + "%)"
+ "</span><br>";
+ " (" + this.game.villageTab.skillToText(exp) + " " + expPercent.toFixed() + "%) "
+ craftInfo + "</span><br>";
}

return info;
Expand Down Expand Up @@ -3823,8 +4041,9 @@ dojo.declare("classes.ui.village.Census", null, {
record.content.innerHTML += skillInfo;

if (!this.game.challenges.isActive("anarchy")) {
record.leaderHref.innerHTML = kitten.isLeader ? "&#9733;" : "&#9734;"; //star-shaped link to reduce visual noise
record.leaderHref.innerHTML = kitten.isLeader ? "&#9873;" : "&#9872;"; //flag-shaped link to reduce visual noise
}
record.favoriteHref.innerHTML = kitten.favorite ? "&#9733;" : "&#9734;"; //star-shaped link to reduce visual noise

}
}
Expand Down
10 changes: 9 additions & 1 deletion res/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1870,15 +1870,23 @@
"village.btn.loadout.delete": "X",
"village.btn.loadout.delete.confirm": "Are you sure you want to delete the {0} loadout?",
"village.btn.loadout.empty": "Empty",

"village.btn.next": "Next Page",
"village.btn.previous": "Previous Page",

"village.census.age": "years old",
"village.census.crafting": "Crafting: ",
"village.census.crafting.nothing": "Nothing",
"village.census.filter.all": "All jobs",
"village.census.lbl.festival.duration": "Festival duration",
"village.census.lbl.happiness": "Happiness",
"village.census.lbl.leader": "Leader",
"village.census.leader.propmote": "Promote ({0} exp, {1} gold)",
"village.census.page": "Page {0} of {1}",
"village.census.rank": "rank",
"village.census.sort.exp": "Sort by Exp",
"village.census.sort.favorite": "Favorites",
"village.census.sort.color": "Color",
"village.census.sort.variety": "Variety",
"village.census.trait.none": "No trait :< ",
"village.festival.msg.start": "The cultural festival has started",
"village.festival.msg.ext": "The cultural festival has been extended",
Expand Down

0 comments on commit bcc5e18

Please sign in to comment.