mirror of
https://github.com/Melledy/Nebula.git
synced 2025-12-12 20:34:36 +01:00
Implement monolith shop discounts
This commit is contained in:
@@ -25,6 +25,10 @@ public class StarTowerModifiers {
|
|||||||
private int shopRerollCount;
|
private int shopRerollCount;
|
||||||
private int shopRerollPrice;
|
private int shopRerollPrice;
|
||||||
|
|
||||||
|
private boolean shopDiscountTier1;
|
||||||
|
private boolean shopDiscountTier2;
|
||||||
|
private boolean shopDiscountTier3;
|
||||||
|
|
||||||
public StarTowerModifiers(StarTowerGame game) {
|
public StarTowerModifiers(StarTowerGame game) {
|
||||||
this.game = game;
|
this.game = game;
|
||||||
|
|
||||||
@@ -69,6 +73,10 @@ public class StarTowerModifiers {
|
|||||||
if (this.shopRerollCount > 0) {
|
if (this.shopRerollCount > 0) {
|
||||||
this.shopRerollPrice = 100;
|
this.shopRerollPrice = 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.shopDiscountTier1 = this.hasGrowthNode(20202) && game.getDifficulty() >= 3;
|
||||||
|
this.shopDiscountTier2 = this.hasGrowthNode(20502) && game.getDifficulty() >= 4;
|
||||||
|
this.shopDiscountTier3 = this.hasGrowthNode(20802) && game.getDifficulty() >= 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasGrowthNode(int nodeId) {
|
public boolean hasGrowthNode(int nodeId) {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ public class StarTowerShopGoods {
|
|||||||
private int type;
|
private int type;
|
||||||
private int goodsId;
|
private int goodsId;
|
||||||
private int price;
|
private int price;
|
||||||
|
private int discount;
|
||||||
private boolean sold;
|
private boolean sold;
|
||||||
|
|
||||||
public StarTowerShopGoods(int type, int goodsId, int price) {
|
public StarTowerShopGoods(int type, int goodsId, int price) {
|
||||||
@@ -21,4 +22,19 @@ public class StarTowerShopGoods {
|
|||||||
this.sold = true;
|
this.sold = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasDiscount() {
|
||||||
|
return this.getDiscount() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void applyDiscount(double percentage) {
|
||||||
|
this.discount = (int) Math.ceil(this.price * (1.0 - percentage));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPrice() {
|
||||||
|
return this.price - this.discount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDisplayPrice() {
|
||||||
|
return this.price;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package emu.nebula.game.tower.cases;
|
|||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import emu.nebula.GameConstants;
|
import emu.nebula.GameConstants;
|
||||||
import emu.nebula.game.tower.StarTowerShopGoods;
|
import emu.nebula.game.tower.StarTowerShopGoods;
|
||||||
@@ -10,6 +11,8 @@ import emu.nebula.proto.PublicStarTower.HawkerGoods;
|
|||||||
import emu.nebula.proto.PublicStarTower.StarTowerRoomCase;
|
import emu.nebula.proto.PublicStarTower.StarTowerRoomCase;
|
||||||
import emu.nebula.proto.StarTowerInteract.StarTowerInteractReq;
|
import emu.nebula.proto.StarTowerInteract.StarTowerInteractReq;
|
||||||
import emu.nebula.proto.StarTowerInteract.StarTowerInteractResp;
|
import emu.nebula.proto.StarTowerInteract.StarTowerInteractResp;
|
||||||
|
import emu.nebula.util.Utils;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@@ -39,7 +42,42 @@ public class StarTowerHawkerCase extends StarTowerBaseCase {
|
|||||||
this.addGoods(new StarTowerShopGoods(1, 1, 200));
|
this.addGoods(new StarTowerShopGoods(1, 1, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO apply discounts based on star tower talents
|
// Apply discounts based on star tower talents
|
||||||
|
if (getModifiers().isShopDiscountTier1()) {
|
||||||
|
this.applyDiscount(1.0, 2, 0.8);
|
||||||
|
}
|
||||||
|
if (getModifiers().isShopDiscountTier2()) {
|
||||||
|
this.applyDiscount(0.3, 1, 0.5);
|
||||||
|
}
|
||||||
|
if (getModifiers().isShopDiscountTier3()) {
|
||||||
|
this.applyDiscount(1.0, 1, 0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyDiscount(double chance, int times, double percentage) {
|
||||||
|
// Check chance
|
||||||
|
double random = Utils.generateRandomDouble();
|
||||||
|
|
||||||
|
if (random > chance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create goods list
|
||||||
|
var list = this.getGoods().values().stream()
|
||||||
|
.filter(g -> !g.hasDiscount())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
// Apply discounts
|
||||||
|
for (int i = 0; i < times; i++) {
|
||||||
|
// Sanity check
|
||||||
|
if (list.isEmpty()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get goods and apply discount
|
||||||
|
var goods = Utils.randomElement(list, true);
|
||||||
|
goods.applyDiscount(percentage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addGoods(StarTowerShopGoods goods) {
|
public void addGoods(StarTowerShopGoods goods) {
|
||||||
@@ -145,9 +183,13 @@ public class StarTowerHawkerCase extends StarTowerBaseCase {
|
|||||||
.setSid(sid)
|
.setSid(sid)
|
||||||
.setType(goods.getType())
|
.setType(goods.getType())
|
||||||
.setGoodsId(102) // ?
|
.setGoodsId(102) // ?
|
||||||
.setPrice(goods.getPrice())
|
.setPrice(goods.getDisplayPrice())
|
||||||
.setTag(1);
|
.setTag(1);
|
||||||
|
|
||||||
|
if (goods.hasDiscount()) {
|
||||||
|
info.setDiscount(goods.getPrice());
|
||||||
|
}
|
||||||
|
|
||||||
hawker.addList(info);
|
hawker.addList(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -179,12 +179,34 @@ public class Utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static <T> T randomElement(List<T> list) {
|
public static <T> T randomElement(List<T> list) {
|
||||||
return list.get(ThreadLocalRandom.current().nextInt(0, list.size()));
|
return randomElement(list, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T randomElement(List<T> list, boolean remove) {
|
||||||
|
int index = ThreadLocalRandom.current().nextInt(0, list.size());
|
||||||
|
var object = list.get(index);
|
||||||
|
|
||||||
|
if (remove) {
|
||||||
|
list.remove(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int randomElement(IntList list) {
|
public static int randomElement(IntList list) {
|
||||||
return list.getInt(ThreadLocalRandom.current().nextInt(0, list.size()));
|
return list.getInt(ThreadLocalRandom.current().nextInt(0, list.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int randomElement(IntList list, boolean remove) {
|
||||||
|
int index = ThreadLocalRandom.current().nextInt(0, list.size());
|
||||||
|
int object = list.getInt(index);
|
||||||
|
|
||||||
|
if (remove) {
|
||||||
|
list.removeInt(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if an integer array contains a value
|
* Checks if an integer array contains a value
|
||||||
|
|||||||
Reference in New Issue
Block a user