diff --git a/packages/junon-common/protocol/enum.proto b/packages/junon-common/protocol/enum.proto index 90df3900..3332b025 100644 --- a/packages/junon-common/protocol/enum.proto +++ b/packages/junon-common/protocol/enum.proto @@ -266,6 +266,7 @@ enum BuildingType { MiasmaGate = 272; CabbageSeed = 273; Cabbage = 274; + SprayGun = 275; } enum TerrainType { @@ -316,6 +317,7 @@ enum ProjectileType { BlueLaser = 26; Dynamite = 27; MiningExplosion = 28; + WaterCloud = 29; } enum MobStatus { diff --git a/packages/junon-io/client/assets/images/spray_gun.png b/packages/junon-io/client/assets/images/spray_gun.png new file mode 100644 index 00000000..e0756a53 Binary files /dev/null and b/packages/junon-io/client/assets/images/spray_gun.png differ diff --git a/packages/junon-io/client/src/entities/equipments/hand/spray_gun.js b/packages/junon-io/client/src/entities/equipments/hand/spray_gun.js new file mode 100644 index 00000000..d96ee660 --- /dev/null +++ b/packages/junon-io/client/src/entities/equipments/hand/spray_gun.js @@ -0,0 +1,22 @@ +const RangeEquipment = require("./range_equipment") +const Constants = require("./../../../../../common/constants.json") +const Protocol = require("./../../../../../common/util/protocol") +const ClientHelper = require("./../../../util/client_helper") + +class SprayGun extends RangeEquipment { + + getSpritePath() { + return 'spray_gun.png' + } + + getType() { + return Protocol.definition().BuildingType.SprayGun + } + + getConstantsTable() { + return "Equipments.SprayGun" + } + +} + +module.exports = SprayGun \ No newline at end of file diff --git a/packages/junon-io/client/src/entities/equipments/index.js b/packages/junon-io/client/src/entities/equipments/index.js index 7eceb89a..c5cfb1cf 100644 --- a/packages/junon-io/client/src/entities/equipments/index.js +++ b/packages/junon-io/client/src/entities/equipments/index.js @@ -12,6 +12,7 @@ Equipments.Shotgun = require("./hand/shotgun") Equipments.AssaultRifle = require("./hand/assault_rifle") Equipments.Scar17 = require("./hand/scar_17") Equipments.FlameThrower = require("./hand/flame_thrower") +Equipments.SprayGun = require("./hand/spray_gun") Equipments.PlasmaGun = require("./hand/plasma_gun") Equipments.RocketLauncher = require("./hand/rocket_launcher") Equipments.SquidStaff = require("./hand/squid_staff") diff --git a/packages/junon-io/client/src/entities/game.js b/packages/junon-io/client/src/entities/game.js index ed0d4c01..b9699dae 100644 --- a/packages/junon-io/client/src/entities/game.js +++ b/packages/junon-io/client/src/entities/game.js @@ -1412,7 +1412,7 @@ class Game { // PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST - let tempAssets = ['displacement_map.png', 'squid_lord_heart.png', 'squid_staff.png', 'fries.png', 'energy_drink.png', 'alien_juice.png', 'rocket_launcher.png', 'scar_17_by_px.png', 'bowl_by_px.png', 'potato_soup_by_px.png', 'miso_soup_by_px.png', 'slime_broth_by_px.png', 'bomber_turret_by_px.png', 'firebat.png', 'plasma_blade.png', 'raven.png', 'starberries.png', 'car.png', 'bricks_texture.png', 'checker_texture.png', 'noise_texture.png', 'x_texture.png', 'xchecker_texture.png', 'nihonshu.png', 'pumpkin.png', 'pumpkin_plant.png', 'pumpkin_seed.png', 'rice.png', 'rice_plant.png', 'rice_seed.png', 'fish.png', 'nigiri.png', 'katana_reskin.png', 'pumpkin_pie.png', 'imperial_special_forces_armor.png', 'deconstructor.png', 'blue_laser.png', 'keypad_door.png', 'keypad_door_lower.png', 'keypad_door_upper.png', 'unbreakable_wall.png', 'sapper.png', 'sapper_corpse.png', 'dynamite.png', 'miasma_gate.png', "solid_texture2.png", "simplex_texture.png", "cabbage_seed.png", "cabbage_plant.png", "cabbage.png", "3dwall-0.png", "3dwall-1.png", "3dwall-2.png", "3dwall-3.png", "3dwall-4.png", "3dwall-5.png", "3dwall-6.png", "3dwall-7.png", "3dwall-8.png", "3dwall-9.png", "3dwall-10.png", "3dwall-11.png", "3dwall-12.png", "3dwall-13.png"] + let tempAssets = ['displacement_map.png', 'squid_lord_heart.png', 'squid_staff.png', 'fries.png', 'energy_drink.png', 'alien_juice.png', 'rocket_launcher.png', 'scar_17_by_px.png', 'bowl_by_px.png', 'potato_soup_by_px.png', 'miso_soup_by_px.png', 'slime_broth_by_px.png', 'bomber_turret_by_px.png', 'firebat.png', 'plasma_blade.png', 'raven.png', 'starberries.png', 'car.png', 'bricks_texture.png', 'checker_texture.png', 'noise_texture.png', 'x_texture.png', 'xchecker_texture.png', 'nihonshu.png', 'pumpkin.png', 'pumpkin_plant.png', 'pumpkin_seed.png', 'rice.png', 'rice_plant.png', 'rice_seed.png', 'fish.png', 'nigiri.png', 'katana_reskin.png', 'pumpkin_pie.png', 'imperial_special_forces_armor.png', 'deconstructor.png', 'blue_laser.png', 'keypad_door.png', 'keypad_door_lower.png', 'keypad_door_upper.png', 'unbreakable_wall.png', 'sapper.png', 'sapper_corpse.png', 'dynamite.png', 'miasma_gate.png', "solid_texture2.png", "simplex_texture.png", "cabbage_seed.png", "cabbage_plant.png", "cabbage.png", "3dwall-0.png", "3dwall-1.png", "3dwall-2.png", "3dwall-3.png", "3dwall-4.png", "3dwall-5.png", "3dwall-6.png", "3dwall-7.png", "3dwall-8.png", "3dwall-9.png", "3dwall-10.png", "3dwall-11.png", "3dwall-12.png", "3dwall-13.png","spray_gun.png"] tempAssets.forEach((asset) => { PIXI.Texture.addToCache(PIXI.Texture.fromImage('/assets/images/' + asset), asset) }) diff --git a/packages/junon-io/client/src/entities/projectiles/index.js b/packages/junon-io/client/src/entities/projectiles/index.js index 5a4990fd..44afb1d1 100644 --- a/packages/junon-io/client/src/entities/projectiles/index.js +++ b/packages/junon-io/client/src/entities/projectiles/index.js @@ -10,6 +10,7 @@ Projectiles.ShotgunBullet = require("./shotgun_bullet") Projectiles.RifleBullet = require("./rifle_bullet") Projectiles.CarbonGas = require("./carbon_gas") Projectiles.DisinfectingGas = require("./disinfecting_gas") +Projectiles.WaterCloud = require("./water_cloud") Projectiles.Flame = require("./flame") Projectiles.AcidSpit = require("./acid_spit") Projectiles.Spike = require("./spike") diff --git a/packages/junon-io/client/src/entities/projectiles/water_cloud.js b/packages/junon-io/client/src/entities/projectiles/water_cloud.js new file mode 100644 index 00000000..dcab0d79 --- /dev/null +++ b/packages/junon-io/client/src/entities/projectiles/water_cloud.js @@ -0,0 +1,81 @@ +const BaseProjectile = require("./base_projectile") +const Constants = require("../../../../common/constants.json") +const Protocol = require("../../../../common/util/protocol") +const ClientHelper = require("../../util/client_helper") + +class WaterCloud extends BaseProjectile { + + constructor(game, data) { + super(game, data) + + this.MAX_WIDTH_EXPANSION = this.getConstants().maxRadialExpansion * 2 + } + + onProjectileConstructed() { + this.game.playSound("gas_release", { skipIfPlaying: true }) + } + + reset() { + super.reset() + this.sprite.width = 0 + } + + setAttributes(data) { + super.setAttributes(data) + + data.w = data.width + data.h = data.width + + this.origWidth = data.width + + this.minAlpha = 0.5 + this.sprite.alpha = this.minAlpha + this.sprite.tint = ClientHelper.getRandomColorInRange("#04bace", "#41d9ff", Math.random(), { shouldReturnInteger: true }) + } + + syncWithServer(data) { + super.syncWithServer(data) + + this.instructToExpand(data.width) + } + + interpolate(lastFrameTime) { + this.interpolateExpansion(lastFrameTime) + } + + interpolateExpansion(lastFrameTime) { + this.sprite.interpolateExpansion(lastFrameTime) + } + + getSpritePath() { + return 'white_gas.png' + } + +// remove() { +// // let animation finish before removing.. +// +// let alpha = { alpha: this.sprite.alpha } +// let vanish = new TWEEN.Tween(alpha) +// .to({ alpha: 0 }, 3000) +// .easing(TWEEN.Easing.Quadratic.Out) // Use an easing function to make the animation smooth. +// .onUpdate(() => { +// this.sprite.alpha = alpha.alpha +// }) +// .onComplete(() => { +// this.removeSelfAndChildrens(this.sprite) +// }) +// .start() +// +// } +// + getType() { + return Protocol.definition().ProjectileType.WaterCloud + } + + getConstantsTable() { + return "Projectiles.WaterCloud" + } + +} + +module.exports = WaterCloud diff --git a/packages/junon-io/common/constants.json b/packages/junon-io/common/constants.json index 1d5dba2f..63ee0592 100644 --- a/packages/junon-io/common/constants.json +++ b/packages/junon-io/common/constants.json @@ -1809,7 +1809,7 @@ "CabbageSeed": { "parent": "Crops.BaseSeed", "cost": { - "gold": 30 + "gold": 150 }, "yield": "Cabbage", "description": "Plant on soil to grow cabbage" @@ -2066,6 +2066,15 @@ "speed": 0, "categories": {"elemental":true,"fire":true} }, + "WaterCloud": { + "width": 32, + "height": 32, + "minWidth": 32, + "maxWidth": 64, + "maxRadialExpansion": 16, + "damage": 2, + "speed": 0 + }, "IonBeam": { "width": 512, "height": 32, @@ -3681,6 +3690,28 @@ }, "description": "Shoots flames" }, + "SprayGun": { + "parent": "Equipments.BaseEquipment", + "isWeapon": true, + "isFireArm": true, + "shouldNotRemoveOnBreak": true, + "cost": { + "gold": 450 + }, + "stats": { + "range": 200, + "damage": 2, + "usageCapacity": 30, + "fuelConsumption": 80, + "reload": 200 + }, + "requirements": { + "CopperBar": 30, + "IronBar": 30, + "WaterBottle": 1 + }, + "description": "Uses combustion to water crops efficiently. Can also put out crops on fires." + }, "SquidStaff": { "parent": "Equipments.BaseEquipment", "isWeapon": true, diff --git a/packages/junon-io/server/entities/buildings/fuel_tank.js b/packages/junon-io/server/entities/buildings/fuel_tank.js index 9d9e2bda..ad65ef3c 100644 --- a/packages/junon-io/server/entities/buildings/fuel_tank.js +++ b/packages/junon-io/server/entities/buildings/fuel_tank.js @@ -7,7 +7,7 @@ class FuelTank extends BaseBuilding { interact(user) { let handEquipment = user.getHandEquipment() - let refueableEquipments = [Protocol.definition().BuildingType.Lighter, Protocol.definition().BuildingType.FlameThrower] + let refueableEquipments = [Protocol.definition().BuildingType.Lighter, Protocol.definition().BuildingType.FlameThrower, Protocol.definition().BuildingType.SprayGun] if (handEquipment && refueableEquipments.indexOf(handEquipment.getType()) !== -1) { let amountDrained = this.consumeResource("fuel", handEquipment.getResourceConsumption("fuel")) diff --git a/packages/junon-io/server/entities/equipments/hand/spray_gun.js b/packages/junon-io/server/entities/equipments/hand/spray_gun.js new file mode 100644 index 00000000..563f1af8 --- /dev/null +++ b/packages/junon-io/server/entities/equipments/hand/spray_gun.js @@ -0,0 +1,65 @@ +const HandEquipment = require("./hand_equipment") + +const Protocol = require('../../../../common/util/protocol') +const Constants = require("./../../../../common/constants.json") +const Projectiles = require("./../../projectiles/index") + + +class SprayGun extends HandEquipment { + use(player, targetEntity) { + if (this.isDepleted() && !player.hasInfiniteAmmo()) { + let owner = this.getOwner() + if (owner.isPlayer()) { + owner.showError("Needs Fuel") + } + + return + } + + super.use(player, targetEntity) + + let distance = Constants.tileSize + + let longestPoint = Math.floor(this.getRange() / Constants.tileSize) - 1 + longestPoint = Math.max(1, longestPoint) + let distanceMultipliers = Array(longestPoint).fill().map((element, index) => index + 1) + + // let distanceMultipliers = [2, 3, 4, 5] + let points = distanceMultipliers.map((multiplier) => { + return player.game.pointFromDistance(player.getX(), player.getY(), distance * multiplier, player.getRadAngle()) + }) + + let minWidth = Constants.Projectiles.WaterCloud.minWidth + let maxWidth = Constants.Projectiles.WaterCloud.maxWidth + + for (var i = 0; i < points.length; i++) { + let point = points[i] + let width = Math.min(maxWidth, minWidth + (i * 6)) + + if (!this.isObstructed(player, point)) { + Projectiles.WaterCloud.build({ + weapon: this, + source: { x: point[0], y: point[1] }, + destination: { x: point[0], y: point[1] }, + w: width, + h: width + }) + } + } + + } + + onEquipmentConstructed() { + this.setUsage(0) + } + + getType() { + return Protocol.definition().BuildingType.SprayGun + } + + getConstantsTable() { + return "Equipments.SprayGun" + } +} + +module.exports = SprayGun diff --git a/packages/junon-io/server/entities/equipments/index.js b/packages/junon-io/server/entities/equipments/index.js index 1e4c55f6..716e6f57 100644 --- a/packages/junon-io/server/entities/equipments/index.js +++ b/packages/junon-io/server/entities/equipments/index.js @@ -12,6 +12,7 @@ Equipments.PlasmaBlade = require("./hand/plasma_blade") Equipments.FireExtinguisher = require("./hand/fire_extinguisher") Equipments.Syringe = require("./hand/syringe") Equipments.FlameThrower = require("./hand/flame_thrower") +Equipments.SprayGun = require("./hand/spray_gun") Equipments.Mop = require("./hand/mop") Equipments.Bottle = require("./hand/bottle") Equipments.BloodBottle = require("./hand/blood_bottle") diff --git a/packages/junon-io/server/entities/projectiles/index.js b/packages/junon-io/server/entities/projectiles/index.js index 9062e29f..fd9c0011 100644 --- a/packages/junon-io/server/entities/projectiles/index.js +++ b/packages/junon-io/server/entities/projectiles/index.js @@ -16,6 +16,7 @@ Projectiles.ShotgunBullet = require("./shotgun_bullet") Projectiles.RifleBullet = require("./rifle_bullet") Projectiles.CarbonGas = require("./carbon_gas") Projectiles.DisinfectingGas = require("./disinfecting_gas") +Projectiles.WaterCloud = require("./water_cloud") Projectiles.Flame = require("./flame") Projectiles.AcidSpit = require("./acid_spit") Projectiles.Spike = require("./spike") diff --git a/packages/junon-io/server/entities/projectiles/water_cloud.js b/packages/junon-io/server/entities/projectiles/water_cloud.js new file mode 100644 index 00000000..00dc7e47 --- /dev/null +++ b/packages/junon-io/server/entities/projectiles/water_cloud.js @@ -0,0 +1,124 @@ +const BaseProjectile = require("./base_projectile") +const Protocol = require('../../../common/util/protocol') +const Constants = require("./../../../common/constants.json") +const p2 = require("p2") + +class WaterCloud extends BaseProjectile { + + constructor(data) { + super(data) + + this.radialExpansion = 0 + this.MAX_RADIAL_EXPANSION = this.getConstants().maxRadialExpansion + } + + getType() { + return Protocol.definition().ProjectileType.WaterCloud + } + + getConstantsTable() { + return "Projectiles.WaterCloud" + } + + move() { + if (this.shouldRemove) { + return this.cleanupAfterDelay() + } + + this.expandRadius() + this.consumeFire() + } + +getFlamables() { + return this.sector.getPlayerAttackables().concat(this.sector.unitTree) + .concat(this.sector.groundMap) + .concat(this.sector.platformMap) + } + + consumeFire() { + const isOneSecondInterval = this.game.timestamp % Constants.physicsTimeStep === 0 + if (!isOneSecondInterval) return + + let boundingBox = this.getBoundingBox() + + let entitiesOnFire = this.getFlamables().map((tree) => { + let targets = tree.search(boundingBox) + return targets.filter((entity) => { + return entity.isCrop() + }) + }).flat() + + entitiesOnFire.forEach((entity) => { + entity.reduceFire() + entity.setIsWatered(true) + entity.fillResource("liquid", 100) + }) + } + +//ts was ragebait and took days to get to work. DO NOT TOUCH IT OR IT WILL BOMB ITSELF- Y_E_E_T + + expandRadius() { + if (this.stopExpanding) return + + this.radialExpansion += this.getExpansionSpeed() + this.setWidthFromExpansion() + this.updateRbushCoords() + this.onStateChanged() + } + + getExpansionSpeed() { + return 1 + } + + setWidthFromExpansion() { + if (this.radialExpansion) { + this.width = this.w + this.radialExpansion * 2 + } else { + this.width = this.w + } + } + + // bounding box calculation should be based on expanded width variable + getExpandedBox(x = this.getX(), y = this.getY()) { + let w = this.width || this.w + let h = this.width || this.w + + return { + pos: { + x: x - w/2, + y: y - h/2, + }, + w: w, + h: h + } + } + + updateRbushCoords() { + var box = this.getExpandedBox(this.getX(), this.getY()) + + this.minX = box.pos.x, + this.minY = box.pos.y, + this.maxX = box.pos.x + box.w, + this.maxY = box.pos.y + box.h + } + + + determineMovementComplete() { + if (this.radialExpansion >= this.MAX_RADIAL_EXPANSION) { + this.stopExpanding = true + this.onMoveComplete() + } + } + + + // shouldRemoveImmediately() { + // return false + // } + + onCollide(entity) { + // dont do anything + } + +} + +module.exports = WaterCloud \ No newline at end of file diff --git a/packages/junon-io/server/entities/sector.js b/packages/junon-io/server/entities/sector.js index 9b0ae66b..b244ef1c 100644 --- a/packages/junon-io/server/entities/sector.js +++ b/packages/junon-io/server/entities/sector.js @@ -523,7 +523,7 @@ class Sector { } initDefaultSellables() { - let itemKlasses = [Ores.Sand, Ores.Wood, Buildings.CoffeeSeed, Buildings.WheatSeed, Buildings.PotatoSeed, Buildings.SunflowerSeed, Buildings.BlueSeed, Buildings.PoppySeed,Buildings.PumpkinSeed,Buildings.RiceSeed, Foods.Starberries, Foods.Fish, Mobs.Chicken, Mobs.Monkey, Mobs.Cat, Mobs.CleanBot, Mobs.Car, Equipments.CombatArmor, Equipments.SantaHat, Equipments.NameTag] + let itemKlasses = [Ores.Sand, Ores.Wood, Buildings.CoffeeSeed, Buildings.WheatSeed, Buildings.PotatoSeed, Buildings.SunflowerSeed, Buildings.BlueSeed, Buildings.PoppySeed,Buildings.PumpkinSeed,Buildings.RiceSeed,Buildings.CabbageSeed ,Foods.Starberries, Foods.Fish, Mobs.Chicken, Mobs.Monkey, Mobs.Cat, Mobs.CleanBot, Mobs.Car, Equipments.CombatArmor, Equipments.SantaHat, Equipments.NameTag] itemKlasses.forEach((klass) => { let group = klass.prototype.isMob() ? "mob" : "item" this.sellables[klass.prototype.getTypeName()] = { group: group, type: klass.prototype.getType(), cost: klass.getCost() }