From 744f6d643d0e756d660c47cb79e4d125afbfbf96 Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Sun, 6 Sep 2026 16:28:04 -0400 Subject: [PATCH 01/18] launch speed --- src/Const/TankDefinitions.ts | 4 +++- src/Entity/Tank/Projectile/Bullet.ts | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Const/TankDefinitions.ts b/src/Const/TankDefinitions.ts index 884536d7..1aa23905 100644 --- a/src/Const/TankDefinitions.ts +++ b/src/Const/TankDefinitions.ts @@ -28,7 +28,7 @@ export type preAddonId = "dombase" | "launcher" export type addonId = preAddonId | postAddonId; /** The types of projectiles in the game */ -export type projectileId = "bullet" | "drone" | "trap" | "necrodrone" | "minion" | "skimmer" | "rocket" | "swarm" | "flame" | "wall" | "croc"; +export type projectileId = "bullet" | "drone" | "trap" | "necrodrone" | "minion" | "skimmer" | "rocket" | "swarm" | "glider" | "firework" | "flame" | "wall" | "croc"; /** The types of barrel addons that exist in the game */ export type barrelAddonId = "trapLauncher" | "purplebarrel"; @@ -60,6 +60,8 @@ export interface BulletDefinition { color?: Color; /** Overrides number of sides for projectile. */ sides?: number; + /** Used to calculate the initial burst of speed of the bullet that the barrel shoots.*/ + launchSpeed?: number; } /** diff --git a/src/Entity/Tank/Projectile/Bullet.ts b/src/Entity/Tank/Projectile/Bullet.ts index 463ac306..8e3fcd93 100644 --- a/src/Entity/Tank/Projectile/Bullet.ts +++ b/src/Entity/Tank/Projectile/Bullet.ts @@ -87,6 +87,9 @@ export default class Bullet extends LivingEntity { this.baseAccel = barrel.bulletAccel; this.baseSpeed = barrel.bulletAccel + 30 - Math.random() * bulletDefinition.scatterRate; + if(bulletDefinition.launchSpeed) { + this.baseSpeed *= bulletDefinition.launchSpeed; + } this.healthData.values.health = this.healthData.values.maxHealth = (1.5 * bulletPenetration + 2) * bulletDefinition.health; this.damagePerTick = (7 + bulletDamage * 3) * bulletDefinition.damage; From ac5655307cfc27803fa762adf0be6ef8fef760b0 Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Sun, 6 Sep 2026 16:52:44 -0400 Subject: [PATCH 02/18] 3 new variables --- src/Const/TankDefinitions.ts | 4 ++++ src/Entity/Tank/Barrel.ts | 12 +++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Const/TankDefinitions.ts b/src/Const/TankDefinitions.ts index 1aa23905..246495b7 100644 --- a/src/Const/TankDefinitions.ts +++ b/src/Const/TankDefinitions.ts @@ -98,6 +98,10 @@ export interface BarrelDefinition { forceFire?: boolean; /** Barrel color - by default this is set to the 'Barrel' color id. */ color?: Color; + /** The amount of bullets that are shot from the barrel. */ + bulletsPerShot?: number; + /** Whether or not the barrel shoots with right click or with left click. */ + rightClickFire?: boolean; /** The definition of the bullet that is shot from the barrel. */ bullet: BulletDefinition; } diff --git a/src/Entity/Tank/Barrel.ts b/src/Entity/Tank/Barrel.ts index 62ee18fa..2d9c71f2 100644 --- a/src/Entity/Tank/Barrel.ts +++ b/src/Entity/Tank/Barrel.ts @@ -73,8 +73,14 @@ export class ShootCycle { } if (this.pos >= reloadTime * (1 + this.barrelEntity.definition.delay)) { + const bulletCount = this.barrelEntity.definition.bulletsPerShot ?? 1; this.barrelEntity.barrelData.reloadTime = reloadTime; this.barrelEntity.shoot(); + if(bulletCount > 1) { + for (let i = 0; i < bulletCount-1; ++i) { + this.barrelEntity.shoot(false); + } + } this.pos = reloadTime * this.barrelEntity.definition.delay; } @@ -143,8 +149,8 @@ export default class Barrel extends ObjectEntity { } /** Shoots a bullet from the barrel. */ - public shoot() { - this.barrelData.flags ^= BarrelFlags.hasShot; + public shoot(hasShot = true) { + if(hasShot) this.barrelData.flags ^= BarrelFlags.hasShot; // No this is not correct const scatterAngle = (Math.PI / 180) * this.definition.bullet.scatterRate * (Math.random() - .5) * 10; @@ -226,7 +232,7 @@ export default class Barrel extends ObjectEntity { this.relationsData.values.team = this.tank.relationsData.values.team; if (!this.tank.rootParent.deletionAnimation){ - this.attemptingShot = this.tank.inputs.attemptingShot(); + this.attemptingShot = this.definition.rightClickFire ? this.tank.inputs.attemptingRepel() : this.tank.inputs.attemptingShot(); this.shootCycle.tick(); } From 0c680db24cb06bbb8f3afc2b4ec6475a07853be8 Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Fri, 18 Sep 2026 15:56:29 -0400 Subject: [PATCH 03/18] stuff --- client/config.js | 91 +- src/Const/Enums.ts | 8 +- src/Const/TankDefinitions - Copy.json | 7367 +++++++++++++++++ src/Const/TankDefinitions.json | 847 +- src/Const/TankDefinitions.ts | 32 +- src/Entity/Boss/FallenBooster.ts | 2 +- src/Entity/Tank/Addons.ts | 164 +- src/Entity/Tank/Barrel.ts | 12 +- src/Entity/Tank/Projectile/Bullet.ts | 27 +- src/Entity/Tank/Projectile/Drone.ts | 9 +- src/Entity/Tank/Projectile/Flame.ts | 5 +- src/Entity/Tank/Projectile/Glider.ts | 105 + .../Tank/Projectile/NecromancerSquare.ts | 6 +- src/Entity/Tank/Projectile/Shell.ts | 243 + src/Entity/Tank/Projectile/Trap.ts | 5 +- src/util.ts | 7 + 16 files changed, 8828 insertions(+), 102 deletions(-) create mode 100644 src/Const/TankDefinitions - Copy.json create mode 100644 src/Entity/Tank/Projectile/Glider.ts create mode 100644 src/Entity/Tank/Projectile/Shell.ts diff --git a/client/config.js b/client/config.js index ec7bc023..90804526 100644 --- a/client/config.js +++ b/client/config.js @@ -373,7 +373,96 @@ const CUSTOM_ADDONS = { rect2.physicsData.width = entity.physicsData.width * 1.25; rect2.physicsData.size = entity.physicsData.size * (35 / 50); rect2.positionData.x = (-entity.physicsData.size + rect2.physicsData.size) / 2; - } + }, + "shotpronounced": entity => { + if(!(entity instanceof $Entity)) return; + const sizeRatio = 75; + const widthRatio = 42 * 1.19048; + const offsetRatio = 2.5; + + const pronounced = entity.createChild(false); + pronounced.defaults(); + pronounced.styleData.color = 1; + pronounced.physicsData.isTrapezoid = true; + pronounced.physicsData.sides = 2; + pronounced.physicsData.width = widthRatio + pronounced.physicsData.size = sizeRatio; + pronounced.positionData.x = offsetRatio + (pronounced.physicsData.size/2); + }, + "pelletpronounced": entity => { + if(!(entity instanceof $Entity)) return; + const sizeRatio = 65; + const widthRatio = 42 * 1.19048; + + const pronounced = entity.createChild(false); + pronounced.defaults(); + pronounced.styleData.color = 1; + pronounced.physicsData.isTrapezoid = true; + pronounced.physicsData.sides = 2; + pronounced.physicsData.width = widthRatio + pronounced.physicsData.size = sizeRatio; + pronounced.positionData.x = (pronounced.physicsData.size/2); + }, + "pelletlauncher": entity => { + if(!(entity instanceof $Entity)) return; + const sizeRatio = 95; + const widthRatio = 42 * 0.809524; + + const launcher = entity.createChild(false); + launcher.defaults(); + launcher.styleData.color = 1; + launcher.physicsData.isTrapezoid = true; + launcher.physicsData.sides = 2; + launcher.physicsData.width = widthRatio + launcher.physicsData.size = sizeRatio; + launcher.positionData.x = (launcher.physicsData.size/2); + }, + "gliderlauncher": entity => { + if(!(entity instanceof $Entity)) return; + const sizeRatio = 65.5 * Math.SQRT2; + const widthRatio = 33.6; + + const launcher = entity.createChild(false); + launcher.defaults(); + launcher.styleData.color = 1; + launcher.physicsData.isTrapezoid = true; + launcher.physicsData.sides = 2; + launcher.physicsData.width = widthRatio + launcher.physicsData.size = sizeRatio; + launcher.positionData.x = (launcher.physicsData.size/2); + launcher.positionData.angle = Math.PI; + }, + "fireworkpronounced": entity => { + if(!(entity instanceof $Entity)) return; + const sizeRatio = 45; + const widthRatio = 53.55; + const offsetRatio = 15; + + const pronounced = entity.createChild(false); + pronounced.defaults(); + pronounced.styleData.color = 1; + pronounced.physicsData.isTrapezoid = true; + pronounced.physicsData.sides = 2; + pronounced.physicsData.width = widthRatio + pronounced.physicsData.size = sizeRatio; + pronounced.positionData.x = offsetRatio + (pronounced.physicsData.size/2); + pronounced.positionData.angle = Math.PI; + }, + "fireworklauncher": entity => { + if(!(entity instanceof $Entity)) return; + const sizeRatio = 80; + const widthRatio = 29.4; + const offsetRatio = 15; + + const launcher = entity.createChild(false); + launcher.defaults(); + launcher.styleData.color = 1; + launcher.physicsData.isTrapezoid = true; + launcher.physicsData.sides = 2; + launcher.physicsData.width = widthRatio + launcher.physicsData.size = sizeRatio; + launcher.positionData.x = offsetRatio + (launcher.physicsData.size/2); + }, } const CUSTOM_COMMANDS = [ diff --git a/src/Const/Enums.ts b/src/Const/Enums.ts index d597c360..47600960 100644 --- a/src/Const/Enums.ts +++ b/src/Const/Enums.ts @@ -125,7 +125,13 @@ export const enum Tank { Spike = 51, Factory = 52, Skimmer = 54, - Rocketeer = 55 + Rocketeer = 55, + AutoTank = 58, + DualBarrel = 60, + PelletShot = 61, + Shotgun = 62, + Glider = 63, + Firework = 64, } /** diff --git a/src/Const/TankDefinitions - Copy.json b/src/Const/TankDefinitions - Copy.json new file mode 100644 index 00000000..3e28b8b6 --- /dev/null +++ b/src/Const/TankDefinitions - Copy.json @@ -0,0 +1,7367 @@ +[ + { + "id": 0, + "name": "Tank", + "upgradeMessage": "", + "levelRequirement": 0, + "upgrades": [ + 1, + 6, + 7, + 8, + 36, + 58 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 1, + "name": "Twin", + "upgradeMessage": "", + "levelRequirement": 15, + "upgrades": [ + 3, + 4, + 13 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": -26, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 0.75, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.9, + "damage": 0.65, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 26, + "size": 95, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 0.75, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.9, + "damage": 0.65, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 2, + "name": "Triplet", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": -26, + "size": 80, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 0.5, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.7, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 26, + "size": 80, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 0.5, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.7, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 0.5, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.7, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 3, + "name": "Triple Shot", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 2, + 14, + 42 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": -0.7853981633974483, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.7, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0.7853981633974483, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.7, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.7, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 4, + "name": "Quad Tank", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 5, + 40 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 3.141592653589793, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.75, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": -1.5707963267948966, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.75, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 1.5707963267948966, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.75, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.75, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 5, + "name": "Octo Tank", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": -0.7853981633974483, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.65, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0.7853981633974483, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.65, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": -2.356194490192345, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.65, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.356194490192345, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.65, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.141592653589793, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.65, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": -1.5707963267948966, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.65, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 1.5707963267948966, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.65, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.65, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 6, + "name": "Sniper", + "upgradeMessage": "", + "levelRequirement": 15, + "upgrades": [ + 15, + 11, + 19, + 31 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 110, + "width": 42, + "delay": 0, + "reload": 1.5, + "recoil": 3, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1.4, + "scatterRate": 0.3, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 7, + "name": "Machine Gun", + "upgradeMessage": "", + "levelRequirement": 15, + "upgrades": [ + 10, + 20, + 29, + 62 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 0.5, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.7, + "speed": 1, + "scatterRate": 3, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 8, + "name": "Flank Guard", + "upgradeMessage": "", + "levelRequirement": 15, + "upgrades": [ + 9, + 4, + 13, + 41 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.141592653589793, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 9, + "name": "Tri-Angle", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 23, + 24 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.665191429188092, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 2.4, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.15, + "speed": 1, + "scatterRate": 1, + "lifeLength": 0.25, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.6179938779914944, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0.4, + "reload": 1, + "recoil": 2.4, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.15, + "speed": 1, + "scatterRate": 1, + "lifeLength": 0.25, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 10, + "name": "Destroyer", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 25, + 49, + 54, + 55, + 63, + 64 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 71.39999999999999, + "delay": 0, + "reload": 4, + "recoil": 15, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 2, + "damage": 3, + "speed": 0.7, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 0.1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 11, + "name": "Overseer", + "upgradeMessage": "Use your left mouse button to control the drones", + "levelRequirement": 30, + "upgrades": [ + 12, + 17, + 26, + 33, + 48, + 52 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": -1.5707963267948966, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 6, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 4, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.8, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 1.5707963267948966, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 6, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 4, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.8, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Drone Damage", + "max": 7 + }, + { + "name": "Drone Health", + "max": 7 + }, + { + "name": "Drone Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 12, + "name": "Overlord", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": -1.5707963267948966, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 6, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.8, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 1.5707963267948966, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 6, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.8, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 6, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.8, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.141592653589793, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 6, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.8, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Drone Damage", + "max": 7 + }, + { + "name": "Drone Health", + "max": 7 + }, + { + "name": "Drone Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 13, + "name": "Twin Flank", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 18, + 48 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": -26, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.9, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 26, + "size": 95, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.9, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.141592653589793, + "offset": -26, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.9, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.141592653589793, + "offset": 26, + "size": 95, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.9, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 14, + "name": "Penta Shot", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": -0.7853981633974483, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 0.5, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.5, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0.7853981633974483, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 0.5, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.5, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": -0.39269908169872414, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 0.5, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.5, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0.39269908169872414, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 0.5, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.5, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 110, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 0.5, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.5, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 15, + "name": "Assassin", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 22, + 21 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.75, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 120, + "width": 42, + "delay": 0, + "reload": 2, + "recoil": 4, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1.5, + "scatterRate": 0.2, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 16, + "name": "Arena Closer", + "upgradeMessage": "", + "levelRequirement": 0, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 75, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 300, + "damage": 7, + "speed": 2, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 17, + "name": "Necromancer", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": true, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 4, + "borderWidth": 15, + "barrels": [ + { + "angle": -1.5707963267948966, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 6, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 0, + "canControlDrones": true, + "bullet": { + "type": "necrodrone", + "sizeRatio": 1, + "health": 2, + "damage": 0.42, + "speed": 0.76, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 1.5707963267948966, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 6, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 0, + "canControlDrones": true, + "bullet": { + "type": "necrodrone", + "sizeRatio": 1, + "health": 2, + "damage": 0.42, + "speed": 0.76, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Drone Count", + "max": 7 + }, + { + "name": "Drone Damage", + "max": 7 + }, + { + "name": "Drone Health", + "max": 7 + }, + { + "name": "Drone Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 18, + "name": "Triple Twin", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": -26, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.9, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 26, + "size": 95, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.9, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.0943951023931953, + "offset": -26, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.9, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.0943951023931953, + "offset": 26, + "size": 95, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.9, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": -2.0943951023931953, + "offset": -26, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.9, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": -2.0943951023931953, + "offset": 26, + "size": 95, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.9, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 19, + "name": "Hunter", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 28, + 43 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.85, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 110, + "width": 42, + "delay": 0, + "reload": 2.5, + "recoil": 0.3, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.75, + "speed": 1.4, + "scatterRate": 0.3, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 56.7, + "delay": 0.2, + "reload": 2.5, + "recoil": 0.3, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.75, + "speed": 1.4, + "scatterRate": 0.3, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 20, + "name": "Gunner", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 39, + 32, + 43 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": -32, + "size": 65, + "width": 25.2, + "delay": 0.5, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.5, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 32, + "size": 65, + "width": 25.2, + "delay": 0.75, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.5, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": -17, + "size": 85, + "width": 25.2, + "delay": 0, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.5, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 17, + "size": 85, + "width": 25.2, + "delay": 0.25, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.5, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 21, + "name": "Stalker", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": true, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.75, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 120, + "width": 42, + "delay": 0, + "reload": 2, + "recoil": 4, + "isTrapezoid": true, + "trapezoidDirection": 3.141592653589793, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1.5, + "scatterRate": 0.3, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 22, + "name": "Ranger", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.7, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "pronounced", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 120, + "width": 42, + "delay": 0, + "reload": 2, + "recoil": 3, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1.5, + "scatterRate": 0.3, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 23, + "name": "Booster", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.9269908169872414, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0.66, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.2, + "speed": 1, + "scatterRate": 1, + "lifeLength": 0.5, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.356194490192345, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0.66, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.2, + "speed": 1, + "scatterRate": 1, + "lifeLength": 0.5, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.665191429188092, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0.33, + "reload": 1, + "recoil": 2.5, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.2, + "speed": 1, + "scatterRate": 1, + "lifeLength": 0.5, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.6179938779914944, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0.33, + "reload": 1, + "recoil": 2.5, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.2, + "speed": 1, + "scatterRate": 1, + "lifeLength": 0.5, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 24, + "name": "Fighter", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 1.5707963267948966, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0, + "reload": 1.5, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.8, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": -1.5707963267948966, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0, + "reload": 1.5, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.8, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.665191429188092, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 2.5, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.2, + "speed": 1, + "scatterRate": 1, + "lifeLength": 0.5, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.6179938779914944, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 2.5, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.2, + "speed": 1, + "scatterRate": 1, + "lifeLength": 0.5, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 25, + "name": "Hybrid", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 71.39999999999999, + "delay": 0, + "reload": 4, + "recoil": 15, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 2, + "damage": 3, + "speed": 0.7, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 0.1 + } + }, + { + "angle": 3.141592653589793, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 6, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": false, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 1.4, + "damage": 0.7, + "speed": 1, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 26, + "name": "Manager", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": true, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 3, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 8, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.8, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Drone Damage", + "max": 7 + }, + { + "name": "Drone Health", + "max": 7 + }, + { + "name": "Drone Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 27, + "name": "Mothership", + "upgradeMessage": "", + "levelRequirement": 0, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 0.01, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 16, + "borderWidth": 140, + "barrels": [ + { + "angle": 0.19634954084936207, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0.5890486225480862, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": false, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0.9817477042468103, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 1.3744467859455345, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": false, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 1.7671458676442586, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.159844949342983, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": false, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.552544031041707, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.9452431127404313, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": false, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.3379421944391554, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.7306412761378795, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": false, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 4.12333992150429, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 4.516039439535327, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": false, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 4.908738521234052, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 5.301437166600463, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": false, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 5.6941366846315, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": true, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 6.086835766330224, + "offset": 0, + "size": 60, + "width": 10.5, + "delay": 0, + "reload": 6, + "recoil": 0, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 2, + "canControlDrones": false, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 2, + "damage": 0.7, + "speed": 0.48, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Drone Damage", + "max": 7 + }, + { + "name": "Drone Health", + "max": 7 + }, + { + "name": "Drone Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 28, + "name": "Predator", + "upgradeMessage": "Use your right mouse button to look further in the direction you're facing", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": true, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.85, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 110, + "width": 42, + "delay": 0, + "reload": 3, + "recoil": 0.3, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.75, + "speed": 1.4, + "scatterRate": 0.3, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 56.7, + "delay": 0.2, + "reload": 3, + "recoil": 0.3, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.75, + "speed": 1.4, + "scatterRate": 0.3, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 71.39999999999999, + "delay": 0.4, + "reload": 3, + "recoil": 0.3, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.75, + "speed": 1.4, + "scatterRate": 0.3, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 29, + "name": "Sprayer", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 110, + "width": 42, + "delay": 0.5, + "reload": 1, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.1, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 0.5, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.7, + "speed": 1, + "scatterRate": 3, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + null, + { + "id": 31, + "name": "Trapper", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 35, + 32, + 33, + 34, + 44 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 60, + "width": 42, + "delay": 0, + "reload": 1.5, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 2, + "damage": 1, + "speed": 2, + "scatterRate": 1, + "lifeLength": 8, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 32, + "name": "Gunner Trapper", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": -16, + "size": 75, + "width": 21, + "delay": 0.66, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.5, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 16, + "size": 75, + "width": 21, + "delay": 0.33, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.5, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.141592653589793, + "offset": 0, + "size": 60, + "width": 54.6, + "delay": 0, + "reload": 3, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 2, + "damage": 1, + "speed": 2, + "scatterRate": 1, + "lifeLength": 8, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 33, + "name": "Overtrapper", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 60, + "width": 42, + "delay": 0, + "reload": 1.5, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 2, + "damage": 1, + "speed": 2, + "scatterRate": 1, + "lifeLength": 8, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.0943951023931953, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 6, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 1, + "canControlDrones": false, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 1.4, + "damage": 0.7, + "speed": 1, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + }, + { + "angle": 4.1887902047863905, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 6, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 1, + "canControlDrones": false, + "bullet": { + "type": "drone", + "sizeRatio": 1, + "health": 1.4, + "damage": 0.7, + "speed": 1, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 34, + "name": "Mega Trapper", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 60, + "width": 54.6, + "delay": 0, + "reload": 3.3, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "bullet": { + "type": "trap", + "sizeRatio": 1.28, + "health": 3.2, + "damage": 1.6, + "speed": 2, + "scatterRate": 1, + "lifeLength": 8, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 35, + "name": "Tri-Trapper", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 60, + "width": 42, + "delay": 0, + "reload": 1.5, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 2, + "damage": 1, + "speed": 2, + "scatterRate": 1, + "lifeLength": 3.2, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.0943951023931953, + "offset": 0, + "size": 60, + "width": 42, + "delay": 0, + "reload": 1.5, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 2, + "damage": 1, + "speed": 2, + "scatterRate": 1, + "lifeLength": 3.2, + "absorbtionFactor": 1 + } + }, + { + "angle": 4.1887902047863905, + "offset": 0, + "size": 60, + "width": 42, + "delay": 0, + "reload": 1.5, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 2, + "damage": 1, + "speed": 2, + "scatterRate": 1, + "lifeLength": 3.2, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 36, + "name": "Smasher", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 38, + 50, + 51 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "smasher", + "sides": 1, + "borderWidth": 15, + "barrels": [], + "stats": [ + { + "name": "Movement Speed", + "max": 10 + }, + { + "name": "Reload", + "max": 0 + }, + { + "name": "Bullet Damage", + "max": 0 + }, + { + "name": "Bullet Penetration", + "max": 0 + }, + { + "name": "Bullet Speed", + "max": 0 + }, + { + "name": "Body Damage", + "max": 10 + }, + { + "name": "Max Health", + "max": 10 + }, + { + "name": "Health Regen", + "max": 10 + } + ] + }, + null, + { + "id": 38, + "name": "Landmine", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": true, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0, + "visibilityRateMoving": 0.16, + "invisibilityRate": 0.003, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "landmine", + "sides": 1, + "borderWidth": 15, + "barrels": [], + "stats": [ + { + "name": "Movement Speed", + "max": 10 + }, + { + "name": "Reload", + "max": 0 + }, + { + "name": "Bullet Damage", + "max": 0 + }, + { + "name": "Bullet Penetration", + "max": 0 + }, + { + "name": "Bullet Speed", + "max": 0 + }, + { + "name": "Body Damage", + "max": 10 + }, + { + "name": "Max Health", + "max": 10 + }, + { + "name": "Health Regen", + "max": 10 + } + ] + }, + { + "id": 39, + "name": "Auto Gunner", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "autoturret", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": -32, + "size": 65, + "width": 25.2, + "delay": 0.5, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.45, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 32, + "size": 65, + "width": 25.2, + "delay": 0.75, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.45, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": -17, + "size": 85, + "width": 25.2, + "delay": 0, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.45, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 17, + "size": 85, + "width": 25.2, + "delay": 0.25, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 0.45, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 40, + "name": "Auto 5", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "auto5", + "sides": 1, + "borderWidth": 15, + "barrels": [], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 41, + "name": "Auto 3", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 40, + 39 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "auto3", + "sides": 1, + "borderWidth": 15, + "barrels": [], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 42, + "name": "Spread Shot", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 1.3089969389957472, + "offset": 0, + "size": 65, + "width": 29.4, + "delay": 0.833325, + "reload": 2, + "recoil": 0.1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": -1.3089969389957472, + "offset": 0, + "size": 65, + "width": 29.4, + "delay": 0.833325, + "reload": 2, + "recoil": 0.1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 1.0471975511965976, + "offset": 0, + "size": 71, + "width": 29.4, + "delay": 0.666675, + "reload": 2, + "recoil": 0.1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": -1.0471975511965976, + "offset": 0, + "size": 71, + "width": 29.4, + "delay": 0.666675, + "reload": 2, + "recoil": 0.1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0.7853981633974483, + "offset": 0, + "size": 77, + "width": 29.4, + "delay": 0.5, + "reload": 2, + "recoil": 0.1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": -0.7853981633974483, + "offset": 0, + "size": 77, + "width": 29.4, + "delay": 0.5, + "reload": 2, + "recoil": 0.1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0.5235987755982988, + "offset": 0, + "size": 83, + "width": 29.4, + "delay": 0.333325, + "reload": 2, + "recoil": 0.1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": -0.5235987755982988, + "offset": 0, + "size": 83, + "width": 29.4, + "delay": 0.333325, + "reload": 2, + "recoil": 0.1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0.2617993877991494, + "offset": 0, + "size": 89, + "width": 29.4, + "delay": 0.166675, + "reload": 2, + "recoil": 0.1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": -0.2617993877991494, + "offset": 0, + "size": 89, + "width": 29.4, + "delay": 0.166675, + "reload": 2, + "recoil": 0.1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 0.6, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 2, + "recoil": 0.1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 43, + "name": "Streamliner", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.85, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 110, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.2, + "speed": 1.1, + "scatterRate": 0.3, + "lifeLength": 0.8, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 100, + "width": 42, + "delay": 0.2, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.2, + "speed": 1.1, + "scatterRate": 0.3, + "lifeLength": 0.8, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 90, + "width": 42, + "delay": 0.4, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.2, + "speed": 1.1, + "scatterRate": 0.3, + "lifeLength": 0.8, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0.6, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.2, + "speed": 1.1, + "scatterRate": 0.3, + "lifeLength": 0.8, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0.8, + "reload": 1, + "recoil": 0.2, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.2, + "speed": 1.1, + "scatterRate": 0.3, + "lifeLength": 0.8, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 44, + "name": "Auto Trapper", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "autoturret", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 60, + "width": 42, + "delay": 0, + "reload": 1.5, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 2, + "damage": 1, + "speed": 2, + "scatterRate": 1, + "lifeLength": 8, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 45, + "name": "Dominator", + "upgradeMessage": "", + "levelRequirement": 0, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 6000, + "preAddon": "dombase", + "postAddon": "dompronounced", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 34.99965, + "delay": 0.001, + "reload": 3, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 100, + "damage": 10, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 0.1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 0 + }, + { + "name": "Reload", + "max": 0 + }, + { + "name": "Bullet Damage", + "max": 0 + }, + { + "name": "Bullet Penetration", + "max": 0 + }, + { + "name": "Bullet Speed", + "max": 0 + }, + { + "name": "Body Damage", + "max": 0 + }, + { + "name": "Max Health", + "max": 0 + }, + { + "name": "Health Regen", + "max": 0 + } + ] + }, + { + "id": 46, + "name": "Dominator", + "upgradeMessage": "", + "levelRequirement": 0, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 6000, + "preAddon": "dombase", + "postAddon": "dompronounced", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": -6, + "size": 75, + "width": 17.50035, + "delay": 0.666, + "reload": 0.3, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.6, + "health": 5, + "damage": 1, + "speed": 1.2, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 6, + "size": 75, + "width": 17.50035, + "delay": 0.333, + "reload": 0.3, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.6, + "health": 5, + "damage": 1, + "speed": 1.2, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 17.50035, + "delay": 0.001, + "reload": 0.3, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 0.6, + "health": 5, + "damage": 1, + "speed": 1.2, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 0 + }, + { + "name": "Reload", + "max": 0 + }, + { + "name": "Bullet Damage", + "max": 0 + }, + { + "name": "Bullet Penetration", + "max": 0 + }, + { + "name": "Bullet Speed", + "max": 0 + }, + { + "name": "Body Damage", + "max": 0 + }, + { + "name": "Max Health", + "max": 0 + }, + { + "name": "Health Regen", + "max": 0 + } + ] + }, + { + "id": 47, + "name": "Dominator", + "upgradeMessage": "", + "levelRequirement": 0, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 6000, + "preAddon": "dombase", + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 60, + "width": 21, + "delay": 0, + "reload": 1.5, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "forceFire": true, + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 20, + "damage": 3, + "speed": 4, + "scatterRate": 1, + "lifeLength": 3.2, + "absorbtionFactor": 1 + } + }, + { + "angle": 0.7853981633974483, + "offset": 0, + "size": 60, + "width": 21, + "delay": 0, + "reload": 1.5, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "forceFire": true, + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 20, + "damage": 3, + "speed": 4, + "scatterRate": 1, + "lifeLength": 3.2, + "absorbtionFactor": 1 + } + }, + { + "angle": 1.5707963267948966, + "offset": 0, + "size": 60, + "width": 21, + "delay": 0, + "reload": 1.5, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "forceFire": true, + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 20, + "damage": 3, + "speed": 4, + "scatterRate": 1, + "lifeLength": 3.2, + "absorbtionFactor": 1 + } + }, + { + "angle": 2.356194490192345, + "offset": 0, + "size": 60, + "width": 21, + "delay": 0, + "reload": 1.5, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "forceFire": true, + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 20, + "damage": 3, + "speed": 4, + "scatterRate": 1, + "lifeLength": 3.2, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.141592653589793, + "offset": 0, + "size": 60, + "width": 21, + "delay": 0, + "reload": 1.5, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "forceFire": true, + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 20, + "damage": 3, + "speed": 4, + "scatterRate": 1, + "lifeLength": 3.2, + "absorbtionFactor": 1 + } + }, + { + "angle": 3.9269908169872414, + "offset": 0, + "size": 60, + "width": 21, + "delay": 0, + "reload": 1.5, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "forceFire": true, + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 20, + "damage": 3, + "speed": 4, + "scatterRate": 1, + "lifeLength": 3.2, + "absorbtionFactor": 1 + } + }, + { + "angle": 4.71238898038469, + "offset": 0, + "size": 60, + "width": 21, + "delay": 0, + "reload": 1.5, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "forceFire": true, + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 20, + "damage": 3, + "speed": 4, + "scatterRate": 1, + "lifeLength": 3.2, + "absorbtionFactor": 1 + } + }, + { + "angle": 5.497787143782138, + "offset": 0, + "size": 60, + "width": 21, + "delay": 0, + "reload": 1.5, + "recoil": 0, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": "trapLauncher", + "forceFire": true, + "bullet": { + "type": "trap", + "sizeRatio": 0.8, + "health": 20, + "damage": 3, + "speed": 4, + "scatterRate": 1, + "lifeLength": 3.2, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 0 + }, + { + "name": "Reload", + "max": 0 + }, + { + "name": "Bullet Damage", + "max": 0 + }, + { + "name": "Bullet Penetration", + "max": 0 + }, + { + "name": "Bullet Speed", + "max": 0 + }, + { + "name": "Body Damage", + "max": 0 + }, + { + "name": "Max Health", + "max": 0 + }, + { + "name": "Health Regen", + "max": 0 + } + ] + }, + { + "id": 48, + "name": "Battleship", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 1.5707963267948966, + "offset": -20, + "size": 75, + "width": 29.4, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 3.141592653589793, + "addon": null, + "droneCount": 4294967295, + "canControlDrones": false, + "bullet": { + "type": "swarm", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.15, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 4.71238898038469, + "offset": -20, + "size": 75, + "width": 29.4, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 3.141592653589793, + "addon": null, + "droneCount": 4294967295, + "canControlDrones": false, + "bullet": { + "type": "swarm", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.15, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 1.5707963267948966, + "offset": 20, + "size": 75, + "width": 29.4, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 3.141592653589793, + "addon": null, + "droneCount": 4294967295, + "canControlDrones": true, + "bullet": { + "type": "swarm", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.15, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + }, + { + "angle": 4.71238898038469, + "offset": 20, + "size": 75, + "width": 29.4, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 3.141592653589793, + "addon": null, + "droneCount": 4294967295, + "canControlDrones": true, + "bullet": { + "type": "swarm", + "sizeRatio": 0.7, + "health": 1, + "damage": 0.15, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 49, + "name": "Annihilator", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 96.6, + "delay": 0, + "reload": 4, + "recoil": 17, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 2, + "damage": 3, + "speed": 0.7, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 0.05 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 50, + "name": "Auto Smasher", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "autosmasher", + "sides": 1, + "borderWidth": 15, + "barrels": [], + "stats": [ + { + "name": "Movement Speed", + "max": 10 + }, + { + "name": "Reload", + "max": 10 + }, + { + "name": "Bullet Damage", + "max": 10 + }, + { + "name": "Bullet Penetration", + "max": 10 + }, + { + "name": "Bullet Speed", + "max": 10 + }, + { + "name": "Body Damage", + "max": 10 + }, + { + "name": "Max Health", + "max": 10 + }, + { + "name": "Health Regen", + "max": 10 + } + ] + }, + { + "id": 51, + "name": "Spike", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "bodyDamage": 2, + "preAddon": null, + "postAddon": "spike", + "sides": 1, + "borderWidth": 15, + "barrels": [], + "stats": [ + { + "name": "Movement Speed", + "max": 10 + }, + { + "name": "Reload", + "max": 0 + }, + { + "name": "Bullet Damage", + "max": 0 + }, + { + "name": "Bullet Penetration", + "max": 0 + }, + { + "name": "Bullet Speed", + "max": 0 + }, + { + "name": "Body Damage", + "max": 10 + }, + { + "name": "Max Health", + "max": 10 + }, + { + "name": "Health Regen", + "max": 10 + } + ] + }, + { + "id": 52, + "name": "Factory", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 4, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 70, + "width": 42, + "delay": 0, + "reload": 3, + "recoil": 1, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "droneCount": 6, + "canControlDrones": true, + "bullet": { + "type": "minion", + "sizeRatio": 1, + "health": 4, + "damage": 0.7, + "speed": 0.56, + "scatterRate": 1, + "lifeLength": -1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Drone Damage", + "max": 7 + }, + { + "name": "Drone Health", + "max": 7 + }, + { + "name": "Drone Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 53, + "name": "", + "upgradeMessage": "", + "levelRequirement": 0, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": true + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 54, + "name": "Skimmer", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": "launcher", + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 71.39999999999999, + "delay": 0, + "reload": 4, + "recoil": 3, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "skimmer", + "sizeRatio": 1, + "health": 3, + "damage": 1, + "speed": 0.5, + "scatterRate": 1, + "lifeLength": 1.3, + "absorbtionFactor": 0.1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 55, + "name": "Rocketeer", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": "launcher", + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 52.5, + "delay": 0, + "reload": 4, + "recoil": 3, + "isTrapezoid": true, + "trapezoidDirection": 3.141592653589793, + "addon": null, + "bullet": { + "type": "rocket", + "sizeRatio": 1, + "health": 5, + "damage": 1, + "speed": 0.3, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 0.1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + null, + null, + { + "id": 58, + "name": "Auto Tank", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "autoturret", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + null, + { + "id": 60, + "name": "Dual-Barrel", + "upgradeMessage": "Right click to shoot your other barrel", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "shotpronounced", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 17, + "size": 95, + "width": 16.8, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "bullet": { + "type": "bullet", + "sizeRatio": 1.89947, + "health": 0.6, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 2.75, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.3 + } + }, + { + "angle": 0, + "offset": 17, + "size": 95, + "width": 16.8, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "bullet": { + "type": "bullet", + "sizeRatio": 1.89947, + "health": 0.6, + "damage": 0.5, + "speed": 1, + "scatterRate": 1.2, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.3 + } + }, + { + "angle": 0, + "offset": 17, + "size": 95, + "width": 16.8, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "bullet": { + "type": "bullet", + "sizeRatio": 1.89947, + "health": 0.6, + "damage": 0.5, + "speed": 0.9, + "scatterRate": 0.9, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.3 + } + }, + { + "angle": 0, + "offset": -17, + "size": 95, + "width": 16.8, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "rightClickFire": true, + "bullet": { + "type": "bullet", + "sizeRatio": 1.89947, + "health": 0.6, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 2.75, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.3 + } + }, + { + "angle": 0, + "offset": -17, + "size": 95, + "width": 16.8, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "rightClickFire": true, + "bullet": { + "type": "bullet", + "sizeRatio": 1.89947, + "health": 0.6, + "damage": 0.5, + "speed": 1, + "scatterRate": 1.2, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.3 + } + }, + { + "angle": 0, + "offset": -17, + "size": 95, + "width": 16.8, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "rightClickFire": true, + "bullet": { + "type": "bullet", + "sizeRatio": 1.89947, + "health": 0.6, + "damage": 0.5, + "speed": 0.9, + "scatterRate": 0.9, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.3 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 61, + "name": "Pellet Shot", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": "pelletlauncher", + "postAddon": "pelletpronounced", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0, + "reload": 4, + "recoil": 0.4, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 10, + "bullet": { + "type": "bullet", + "sizeRatio": 0.56, + "health": 0.2, + "damage": 0.65, + "speed": [1.08, 1.32], + "scatterRate": 3, + "lifeLength": 0.4, + "absorbtionFactor": 0.2, + "launchSpeed": [0.75, 2.25] + } + }, + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0, + "reload": 4, + "recoil": 0.4, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 10, + "bullet": { + "type": "bullet", + "sizeRatio": 0.63, + "health": 0.2, + "damage": 0.65, + "speed": [0.99, 1.21], + "scatterRate": 1.8, + "lifeLength": 0.4, + "absorbtionFactor": 0.2, + "launchSpeed": [0.75, 2.25] + } + }, + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0, + "reload": 4, + "recoil": 0.4, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 10, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 0.2, + "damage": 0.65, + "speed": [0.9, 1.1], + "scatterRate": 0.75, + "lifeLength": 0.4, + "absorbtionFactor": 0.2, + "launchSpeed": [0.75, 2.25] + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 62, + "name": "Shotgun", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 61, + 60 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "shotpronounced", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 90, + "width": 42, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 0.6, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 2.75, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.5 + } + }, + { + "angle": 0, + "offset": 0, + "size": 90, + "width": 42, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 0.6, + "damage": 0.5, + "speed": 1, + "scatterRate": 1.2, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.5 + } + }, + { + "angle": 0, + "offset": 0, + "size": 90, + "width": 42, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 0.6, + "damage": 0.5, + "speed": 0.9, + "scatterRate": 0.9, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.5 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 63, + "name": "Glider", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": "gliderlauncher", + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 56.7, + "delay": 0, + "reload": 4, + "recoil": 3, + "isTrapezoid": true, + "trapezoidDirection": 3.141592653589793, + "addon": null, + "bullet": { + "type": "glider", + "sizeRatio": 1, + "health": 3, + "damage": 1, + "speed": 0.5, + "scatterRate": 1, + "lifeLength": 1.3, + "absorbtionFactor": 0.1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 64, + "name": "Firework", + "upgradeMessage": "Right click to explode your bullets", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": "fireworklauncher", + "postAddon": "fireworkpronounced", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 33.6, + "delay": 0, + "reload": 4, + "recoil": 3.5, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "firework", + "sizeRatio": 1.59375, + "health": 4, + "damage": 0.7, + "speed": 0.4, + "scatterRate": 0.3, + "lifeLength": 1.2, + "absorbtionFactor": 0.1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + } +] diff --git a/src/Const/TankDefinitions.json b/src/Const/TankDefinitions.json index 5350f193..b86b2fb1 100644 --- a/src/Const/TankDefinitions.json +++ b/src/Const/TankDefinitions.json @@ -9,7 +9,8 @@ 6, 7, 8, - 36 + 36, + 58 ], "flags": { "invisibility": false, @@ -883,7 +884,7 @@ "sizeRatio": 1, "health": 1, "damage": 1, - "speed": 1.5, + "speed": 1.4, "scatterRate": 0.3, "lifeLength": 1, "absorbtionFactor": 1 @@ -933,7 +934,8 @@ "upgrades": [ 10, 20, - 29 + 29, + 62 ], "flags": { "invisibility": false, @@ -1176,7 +1178,7 @@ "width": 42, "delay": 0.5, "reload": 1, - "recoil": 2.5, + "recoil": 2.4, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1184,10 +1186,10 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.2, + "damage": 0.15, "speed": 1, "scatterRate": 1, - "lifeLength": 0.5, + "lifeLength": 0.25, "absorbtionFactor": 1 } }, @@ -1196,9 +1198,9 @@ "offset": 0, "size": 80, "width": 42, - "delay": 0.5, + "delay": 0.4, "reload": 1, - "recoil": 2.5, + "recoil": 2.4, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1206,10 +1208,10 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.2, + "damage": 0.15, "speed": 1, "scatterRate": 1, - "lifeLength": 0.5, + "lifeLength": 0.25, "absorbtionFactor": 1 } } @@ -1258,7 +1260,9 @@ 25, 49, 54, - 55 + 55, + 63, + 64 ], "flags": { "invisibility": false, @@ -1648,8 +1652,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 1, - "damage": 0.5, + "health": 0.9, + "damage": 0.6, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1670,8 +1674,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 1, - "damage": 0.5, + "health": 0.9, + "damage": 0.6, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1692,8 +1696,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 1, - "damage": 0.5, + "health": 0.9, + "damage": 0.6, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1714,8 +1718,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 1, - "damage": 0.5, + "health": 0.9, + "damage": 0.6, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1787,9 +1791,9 @@ "offset": 0, "size": 80, "width": 42, - "delay": 0.66, + "delay": 0, "reload": 1, - "recoil": 0.7, + "recoil": 0.5, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1797,7 +1801,7 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.55, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1809,9 +1813,9 @@ "offset": 0, "size": 80, "width": 42, - "delay": 0.66, + "delay": 0, "reload": 1, - "recoil": 0.7, + "recoil": 0.5, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1819,7 +1823,7 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.55, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1831,9 +1835,9 @@ "offset": 0, "size": 95, "width": 42, - "delay": 0.33, + "delay": 0, "reload": 1, - "recoil": 0.7, + "recoil": 0.5, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1841,7 +1845,7 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.55, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1853,9 +1857,9 @@ "offset": 0, "size": 95, "width": 42, - "delay": 0.33, + "delay": 0, "reload": 1, - "recoil": 0.7, + "recoil": 0.5, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1863,7 +1867,7 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.55, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1877,7 +1881,7 @@ "width": 42, "delay": 0, "reload": 1, - "recoil": 0.7, + "recoil": 0.5, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1885,7 +1889,7 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.55, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1946,7 +1950,7 @@ "visibilityRateShooting": 0.23, "visibilityRateMoving": 0.08, "invisibilityRate": 0.03, - "fieldFactor": 0.8, + "fieldFactor": 0.75, "absorbtionFactor": 1, "speed": 1, "maxHealth": 50, @@ -1962,7 +1966,7 @@ "width": 42, "delay": 0, "reload": 2, - "recoil": 3, + "recoil": 4, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1972,7 +1976,7 @@ "health": 1, "damage": 1, "speed": 1.5, - "scatterRate": 0.3, + "scatterRate": 0.2, "lifeLength": 1, "absorbtionFactor": 1 } @@ -2137,7 +2141,7 @@ "sizeRatio": 1, "health": 2, "damage": 0.42, - "speed": 0.72, + "speed": 0.76, "scatterRate": 1, "lifeLength": -1, "absorbtionFactor": 1 @@ -2161,7 +2165,7 @@ "sizeRatio": 1, "health": 2, "damage": 0.42, - "speed": 0.72, + "speed": 0.76, "scatterRate": 1, "lifeLength": -1, "absorbtionFactor": 1 @@ -2241,8 +2245,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 1, - "damage": 0.5, + "health": 0.9, + "damage": 0.6, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -2263,8 +2267,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 1, - "damage": 0.5, + "health": 0.9, + "damage": 0.6, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -2285,8 +2289,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 1, - "damage": 0.5, + "health": 0.9, + "damage": 0.6, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -2307,8 +2311,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 1, - "damage": 0.5, + "health": 0.9, + "damage": 0.6, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -2329,8 +2333,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 1, - "damage": 0.5, + "health": 0.9, + "damage": 0.6, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -2351,8 +2355,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 1, - "damage": 0.5, + "health": 0.9, + "damage": 0.6, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -2544,7 +2548,7 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.45, + "health": 0.5, "damage": 0.5, "speed": 1.1, "scatterRate": 1, @@ -2566,7 +2570,7 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.45, + "health": 0.5, "damage": 0.5, "speed": 1.1, "scatterRate": 1, @@ -2588,7 +2592,7 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.45, + "health": 0.5, "damage": 0.5, "speed": 1.1, "scatterRate": 1, @@ -2610,7 +2614,7 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.45, + "health": 0.5, "damage": 0.5, "speed": 1.1, "scatterRate": 1, @@ -2669,7 +2673,7 @@ "visibilityRateShooting": 0.23, "visibilityRateMoving": 0.08, "invisibilityRate": 0.03, - "fieldFactor": 0.8, + "fieldFactor": 0.75, "absorbtionFactor": 1, "speed": 1, "maxHealth": 50, @@ -2685,7 +2689,7 @@ "width": 42, "delay": 0, "reload": 2, - "recoil": 3, + "recoil": 4, "isTrapezoid": true, "trapezoidDirection": 3.141592653589793, "addon": null, @@ -2695,7 +2699,7 @@ "health": 1, "damage": 1, "speed": 1.5, - "scatterRate": 0.3, + "scatterRate": 0.1, "lifeLength": 1, "absorbtionFactor": 1 } @@ -2751,7 +2755,7 @@ "visibilityRateShooting": 0.23, "visibilityRateMoving": 0.08, "invisibilityRate": 0.03, - "fieldFactor": 0.7, + "fieldFactor": 0.65, "absorbtionFactor": 1, "speed": 1, "maxHealth": 50, @@ -2767,7 +2771,7 @@ "width": 42, "delay": 0, "reload": 2, - "recoil": 3, + "recoil": 4, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -2777,7 +2781,7 @@ "health": 1, "damage": 1, "speed": 1.5, - "scatterRate": 0.3, + "scatterRate": 0, "lifeLength": 1, "absorbtionFactor": 1 } @@ -6636,5 +6640,728 @@ "max": 7 } ] + }, + null, + null, + { + "id": 58, + "name": "Auto Tank", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "autoturret", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 95, + "width": 42, + "delay": 0, + "reload": 1, + "recoil": 1, + "isTrapezoid": false, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "bullet", + "sizeRatio": 1, + "health": 1, + "damage": 1, + "speed": 1, + "scatterRate": 1, + "lifeLength": 1, + "absorbtionFactor": 1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + null, + { + "id": 60, + "name": "Dual-Barrel", + "upgradeMessage": "Right click to shoot your other barrel", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "shotpronounced", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 17, + "size": 95, + "width": 16.8, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "bullet": { + "type": "bullet", + "sizeRatio": 1.89947, + "health": 0.6, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 2.75, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.3 + } + }, + { + "angle": 0, + "offset": 17, + "size": 95, + "width": 16.8, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "bullet": { + "type": "bullet", + "sizeRatio": 1.89947, + "health": 0.6, + "damage": 0.5, + "speed": 1, + "scatterRate": 1.2, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.3 + } + }, + { + "angle": 0, + "offset": 17, + "size": 95, + "width": 16.8, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "bullet": { + "type": "bullet", + "sizeRatio": 1.89947, + "health": 0.6, + "damage": 0.5, + "speed": 0.9, + "scatterRate": 0.9, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.3 + } + }, + { + "angle": 0, + "offset": -17, + "size": 95, + "width": 16.8, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "rightClickFire": true, + "bullet": { + "type": "bullet", + "sizeRatio": 1.89947, + "health": 0.6, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 2.75, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.3 + } + }, + { + "angle": 0, + "offset": -17, + "size": 95, + "width": 16.8, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "rightClickFire": true, + "bullet": { + "type": "bullet", + "sizeRatio": 1.89947, + "health": 0.6, + "damage": 0.5, + "speed": 1, + "scatterRate": 1.2, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.3 + } + }, + { + "angle": 0, + "offset": -17, + "size": 95, + "width": 16.8, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "rightClickFire": true, + "bullet": { + "type": "bullet", + "sizeRatio": 1.89947, + "health": 0.6, + "damage": 0.5, + "speed": 0.9, + "scatterRate": 0.9, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.3 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 61, + "name": "Pellet Shot", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": "pelletlauncher", + "postAddon": "pelletpronounced", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0, + "reload": 4, + "recoil": 0.4, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 10, + "bullet": { + "type": "bullet", + "sizeRatio": 0.56, + "health": 0.2, + "damage": 0.65, + "speed": [1.08, 1.32], + "scatterRate": 3, + "lifeLength": 0.4, + "absorbtionFactor": 0.2, + "launchSpeed": [0.75, 2.25] + } + }, + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0, + "reload": 4, + "recoil": 0.4, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 10, + "bullet": { + "type": "bullet", + "sizeRatio": 0.63, + "health": 0.2, + "damage": 0.65, + "speed": [0.99, 1.21], + "scatterRate": 1.8, + "lifeLength": 0.4, + "absorbtionFactor": 0.2, + "launchSpeed": [0.75, 2.25] + } + }, + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 42, + "delay": 0, + "reload": 4, + "recoil": 0.4, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 10, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 0.2, + "damage": 0.65, + "speed": [0.9, 1.1], + "scatterRate": 0.75, + "lifeLength": 0.4, + "absorbtionFactor": 0.2, + "launchSpeed": [0.75, 2.25] + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 62, + "name": "Shotgun", + "upgradeMessage": "", + "levelRequirement": 30, + "upgrades": [ + 61, + 60 + ], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 1, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": null, + "postAddon": "shotpronounced", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 90, + "width": 42, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 0.6, + "damage": 0.5, + "speed": 1.1, + "scatterRate": 2.75, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.5 + } + }, + { + "angle": 0, + "offset": 0, + "size": 90, + "width": 42, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 0.6, + "damage": 0.5, + "speed": 1, + "scatterRate": 1.2, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.5 + } + }, + { + "angle": 0, + "offset": 0, + "size": 90, + "width": 42, + "delay": 0, + "reload": 4, + "recoil": 0.6, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bulletsPerShot": 4, + "bullet": { + "type": "bullet", + "sizeRatio": 0.7, + "health": 0.6, + "damage": 0.5, + "speed": 0.9, + "scatterRate": 0.9, + "lifeLength": 0.6, + "absorbtionFactor": 0.5, + "launchSpeed": 1.5 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 63, + "name": "Glider", + "upgradeMessage": "", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": "gliderlauncher", + "postAddon": null, + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 56.7, + "delay": 0, + "reload": 4, + "recoil": 3, + "isTrapezoid": true, + "trapezoidDirection": 3.141592653589793, + "addon": null, + "bullet": { + "type": "glider", + "sizeRatio": 1, + "health": 3, + "damage": 1, + "speed": 0.5, + "scatterRate": 1, + "lifeLength": 1.3, + "absorbtionFactor": 0.1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] + }, + { + "id": 64, + "name": "Firework", + "upgradeMessage": "Right click to explode your bullets", + "levelRequirement": 45, + "upgrades": [], + "flags": { + "invisibility": false, + "zoomAbility": false, + "canClaimSquares": false, + "devOnly": false + }, + "visibilityRateShooting": 0.23, + "visibilityRateMoving": 0.08, + "invisibilityRate": 0.03, + "fieldFactor": 0.9, + "absorbtionFactor": 1, + "speed": 1, + "maxHealth": 50, + "preAddon": "fireworklauncher", + "postAddon": "fireworkpronounced", + "sides": 1, + "borderWidth": 15, + "barrels": [ + { + "angle": 0, + "offset": 0, + "size": 80, + "width": 33.6, + "delay": 0, + "reload": 4, + "recoil": 3.5, + "isTrapezoid": true, + "trapezoidDirection": 0, + "addon": null, + "bullet": { + "type": "firework", + "sizeRatio": 1.59375, + "health": 4, + "damage": 0.7, + "speed": 0.4, + "scatterRate": 0.3, + "lifeLength": 1.2, + "absorbtionFactor": 0.1 + } + } + ], + "stats": [ + { + "name": "Movement Speed", + "max": 7 + }, + { + "name": "Reload", + "max": 7 + }, + { + "name": "Bullet Damage", + "max": 7 + }, + { + "name": "Bullet Penetration", + "max": 7 + }, + { + "name": "Bullet Speed", + "max": 7 + }, + { + "name": "Body Damage", + "max": 7 + }, + { + "name": "Max Health", + "max": 7 + }, + { + "name": "Health Regen", + "max": 7 + } + ] } ] diff --git a/src/Const/TankDefinitions.ts b/src/Const/TankDefinitions.ts index 246495b7..aa34e026 100644 --- a/src/Const/TankDefinitions.ts +++ b/src/Const/TankDefinitions.ts @@ -21,9 +21,9 @@ import { Tank, Color } from "./Enums"; import _TankDefinitions from "./TankDefinitions.json"; /** The types of post addons that exist in the game, by their id. */ -export type postAddonId = "dompronounced" | "auto5" | "auto3" | "autosmasher" | "spike" | "pronounced" | "smasher" | "landmine" | "autoturret" | "weirdspike" | "auto2" | "auto7" | "autorocket" | "spiesk" +export type postAddonId = "dompronounced" | "auto5" | "auto3" | "autosmasher" | "spike" | "pronounced" | "smasher" | "landmine" | "autoturret" | "shotpronounced" | "pelletpronounced" | "fireworkpronounced" | "weirdspike" | "auto2" | "auto7" | "autorocket" | "spiesk" /** The types of post addons that exist in the game, by their id. */ -export type preAddonId = "dombase" | "launcher" +export type preAddonId = "dombase" | "launcher" | "pelletlauncher" | "gliderlauncher" | "fireworklauncher" /** A joint list of all post addon ids and pre addon ids. */ export type addonId = preAddonId | postAddonId; @@ -42,26 +42,26 @@ export const visibilityRateDamage = 0.2; export interface BulletDefinition { /** The type of the bullet that the barrel shoots. */ type: projectileId; - /** Size of the bullet shot out of the barrel in relation to the barrel's size. */ - sizeRatio: number; - /** Used to calculate the health of the bullet that the barrel shoots. */ - health: number; - /** Used to calculate the damage of the bullet that the barrel shoots. */ - damage: number; - /** Used to calculate the speed of the bullet that the barrel shoots. */ - speed: number; + /** Size of the bullet shot out of the barrel in relation to the barrel's size. Can be an Array of 2 Values.*/ + sizeRatio: number| number[]; + /** Used to calculate the health of the bullet that the barrel shoots. Can be an Array of 2 Values.*/ + health: number| number[]; + /** Used to calculate the damage of the bullet that the barrel shoots. Can be an Array of 2 Values.*/ + damage: number| number[]; + /** Used to calculate the speed of the bullet that the barrel shoots. Can be an Array of 2 Values.*/ + speed: number | number[]; /** Used to calculate the scattering rate / spread of the bullets. */ scatterRate: number; - /** Used to calculate the life length of a bullet that the barrel shoots. */ - lifeLength: number; - /** Knockback factor field of the bullet */ - absorbtionFactor: number; + /** Used to calculate the life length of a bullet that the barrel shoots. Can be an Array of 2 Values.*/ + lifeLength: number | number[]; + /** Knockback factor field of the bullet. Can be an Array of 2 Values.*/ + absorbtionFactor: number | number[]; /** Projectile color - by default this is set to parent's body color. */ color?: Color; /** Overrides number of sides for projectile. */ sides?: number; - /** Used to calculate the initial burst of speed of the bullet that the barrel shoots.*/ - launchSpeed?: number; + /** Used to calculate the initial burst of speed of the bullet that the barrel shoots. Can be an Array of 2 Values.*/ + launchSpeed?: number | number[]; } /** diff --git a/src/Entity/Boss/FallenBooster.ts b/src/Entity/Boss/FallenBooster.ts index 7f94b069..817d1f41 100644 --- a/src/Entity/Boss/FallenBooster.ts +++ b/src/Entity/Boss/FallenBooster.ts @@ -38,7 +38,7 @@ export default class FallenBooster extends AbstractBoss { for (const barrelDefinition of TankDefinitions[Tank.Booster].barrels) { const def = Object.assign({}, barrelDefinition, {}); - def.bullet = Object.assign({}, def.bullet, { speed: 1.7, health: 6.25, damage:def.bullet.damage * 0.8 }); + def.bullet = Object.assign({}, def.bullet, { speed: 1.7, health: 6.25, damage:def.bullet.damage as number * 0.8 }); this.barrels.push(new Barrel(this, def)); } this.scale(Math.pow(1.01, 75 - 1)); // Level 75 size diff --git a/src/Entity/Tank/Addons.ts b/src/Entity/Tank/Addons.ts index 618494fa..907f96b6 100644 --- a/src/Entity/Tank/Addons.ts +++ b/src/Entity/Tank/Addons.ts @@ -297,7 +297,7 @@ class PronouncedAddon extends Addon { const pronounce = new ObjectEntity(this.game); const sizeRatio = 50 / 50; const widthRatio = 42 / 50; - const offsetRatio = 40 / 50; + const offsetRatio = 3 / 10; const size = this.owner.physicsData.values.size; pronounce.setParent(this.owner); @@ -306,7 +306,7 @@ class PronouncedAddon extends Addon { pronounce.physicsData.values.size = sizeRatio * size; pronounce.physicsData.values.width = widthRatio * size; - pronounce.positionData.values.x = offsetRatio * size; + pronounce.positionData.values.x = (pronounce.physicsData.values.size / 2) + (offsetRatio * size); pronounce.positionData.values.angle = Math.PI; pronounce.styleData.values.color = Color.Barrel; @@ -340,6 +340,159 @@ class PronouncedDomAddon extends Addon { pronounce.physicsData.values.sides = 2; } } + +/** The thing above shotguns's and dual-barrel's barrels. */ +class ShotPronouncedAddon extends Addon { + public constructor(owner: BarrelBase) { + super(owner); + + const pronounce = new ObjectEntity(this.game); + const sizeRatio = 75 / 50; + const widthRatio = 42 * 1.19048 / 50; + const offsetRatio = 1 /20; + const size = this.owner.physicsData.values.size; + + pronounce.setParent(this.owner); + pronounce.relationsData.values.owner = this.owner; + pronounce.relationsData.values.team = this.owner.relationsData.values.team + + pronounce.physicsData.values.size = sizeRatio * size; + pronounce.physicsData.values.width = widthRatio * size; + pronounce.positionData.values.x = (pronounce.physicsData.values.size / 2) + (offsetRatio * size); + + pronounce.styleData.values.color = Color.Barrel; + pronounce.physicsData.values.flags |= PhysicsFlags.isTrapezoid; + pronounce.physicsData.values.sides = 2; + } +} + +/** The thing above pelletshot's barrels. */ +class PelletPronouncedAddon extends Addon { + public constructor(owner: BarrelBase) { + super(owner); + + const pronounce = new ObjectEntity(this.game); + const sizeRatio = 65 / 50; + const widthRatio = 42 * 1.19048 / 50; + const size = this.owner.physicsData.values.size; + + pronounce.setParent(this.owner); + pronounce.relationsData.values.owner = this.owner; + pronounce.relationsData.values.team = this.owner.relationsData.values.team + + pronounce.physicsData.values.size = sizeRatio * size; + pronounce.physicsData.values.width = widthRatio * size; + pronounce.positionData.values.x = pronounce.physicsData.values.size / 2; + + pronounce.styleData.values.color = Color.Barrel; + pronounce.physicsData.values.flags |= PhysicsFlags.isTrapezoid; + pronounce.physicsData.values.sides = 2; + } +} + +/** The thing underneath Pelletshot addon. */ +class PelletLauncherAddon extends Addon { + public constructor(owner: BarrelBase) { + super(owner); + + const launcher = new ObjectEntity(this.game); + const sizeRatio = 95 / 50; + const widthRatio = 42 * 0.809524 / 50; + const size = this.owner.physicsData.values.size; + + launcher.setParent(this.owner); + launcher.relationsData.values.owner = this.owner; + launcher.relationsData.values.team = this.owner.relationsData.values.team; + + launcher.physicsData.values.size = sizeRatio * size; + launcher.physicsData.values.width = widthRatio * size; + launcher.positionData.values.x = launcher.physicsData.values.size / 2; + + launcher.styleData.values.color = Color.Barrel; + launcher.physicsData.values.flags |= PhysicsFlags.isTrapezoid; + launcher.physicsData.values.sides = 2; + } +} + +/** The thing underneath Glider addon. */ +class GliderLauncherAddon extends Addon { + public constructor(owner: BarrelBase) { + super(owner); + + const launcher = new ObjectEntity(this.game); + const sizeRatio = 65.5 * Math.SQRT2 / 50; + const widthRatio = 33.6 / 50; + const size = this.owner.physicsData.values.size; + + launcher.setParent(this.owner); + launcher.relationsData.values.owner = this.owner; + launcher.relationsData.values.team = this.owner.relationsData.values.team; + + launcher.physicsData.values.size = sizeRatio * size; + launcher.physicsData.values.width = widthRatio * size; + launcher.positionData.values.x = launcher.physicsData.values.size / 2; + + launcher.styleData.values.color = Color.Barrel; + launcher.physicsData.values.flags |= PhysicsFlags.isTrapezoid; + launcher.physicsData.values.sides = 2; + launcher.positionData.values.angle = Math.PI; + } +} + +//Firework's values are a bit off mainly due to the trapezoid ratio being 3:4 for some ungodly reason instead of 4:7 and diep custom doesn't support custom ratios for trapezoids + +/** The thing above firework's barrel. */ +class FireworkPronouncedAddon extends Addon { + public constructor(owner: BarrelBase) { + super(owner); + + const pronounce = new ObjectEntity(this.game); + const sizeRatio = 45 / 50; + const widthRatio = 53.55 / 50; + const offsetRatio = 3 / 10; + const size = this.owner.physicsData.values.size; + + pronounce.setParent(this.owner); + pronounce.relationsData.values.owner = this.owner; + pronounce.relationsData.values.team = this.owner.relationsData.values.team + + pronounce.physicsData.values.size = sizeRatio * size; + pronounce.physicsData.values.width = widthRatio * size; + pronounce.positionData.values.x = (pronounce.physicsData.values.size / 2) + (offsetRatio * size); + pronounce.positionData.values.angle = Math.PI; + + pronounce.styleData.values.color = Color.Barrel; + pronounce.physicsData.values.flags |= PhysicsFlags.isTrapezoid; + pronounce.physicsData.values.sides = 2; + pronounce.positionData.values.angle = Math.PI; + } +} + +/** The thing underneath Firework addon. */ +class FireworkLauncherAddon extends Addon { + public constructor(owner: BarrelBase) { + super(owner); + + const launcher = new ObjectEntity(this.game); + const sizeRatio = 80 / 50; + const widthRatio = 29.4 / 50; + const offsetRatio = 3 / 10; + const size = this.owner.physicsData.values.size; + + launcher.setParent(this.owner); + launcher.relationsData.values.owner = this.owner; + launcher.relationsData.values.team = this.owner.relationsData.values.team; + + launcher.physicsData.values.size = sizeRatio * size; + launcher.physicsData.values.width = widthRatio * size; + launcher.positionData.values.x = (launcher.physicsData.values.size / 2) + (offsetRatio * size); + + launcher.styleData.values.color = Color.Barrel; + launcher.physicsData.values.flags |= PhysicsFlags.isTrapezoid; + launcher.physicsData.values.sides = 2; + } +} + /** Weird spike addon. Based on the arrasio Original. */ class WeirdSpikeAddon extends Addon { public constructor(owner: BarrelBase) { @@ -425,6 +578,13 @@ export const AddonById: Record = { smasher: SmasherAddon, landmine: LandmineAddon, autoturret: AutoTurretAddon, + // a part of post 2018 diep + shotpronounced: ShotPronouncedAddon, + pelletpronounced: PelletPronouncedAddon, + pelletlauncher: PelletLauncherAddon, + gliderlauncher: GliderLauncherAddon, + fireworkpronounced: FireworkPronouncedAddon, + fireworklauncher: FireworkLauncherAddon, // not part of diep weirdspike: WeirdSpikeAddon, auto7: Auto7Addon, diff --git a/src/Entity/Tank/Barrel.ts b/src/Entity/Tank/Barrel.ts index 2d9c71f2..94fc3e35 100644 --- a/src/Entity/Tank/Barrel.ts +++ b/src/Entity/Tank/Barrel.ts @@ -37,6 +37,8 @@ import CrocSkimmer from "./Projectile/CrocSkimmer"; import { BarrelAddon, BarrelAddonById } from "./BarrelAddons"; import { Swarm } from "./Projectile/Swarm"; import NecromancerSquare from "./Projectile/NecromancerSquare"; +import Glider from "./Projectile/Glider"; +import Shell from "./Projectile/Shell"; /** * Class that determines when barrels can shoot, and when they can't. @@ -165,6 +167,12 @@ export default class Barrel extends ObjectEntity { let projectile: ObjectEntity | null = null; switch (this.definition.bullet.type) { + case "firework": + new Shell(this, this.tank, tankDefinition, angle); + break; + case "glider": + new Glider(this, this.tank, tankDefinition, angle); + break; case "skimmer": projectile = new Skimmer(this, this.tank, tankDefinition, angle, this.tank.inputs.attemptingRepel() ? -Skimmer.BASE_ROTATION : Skimmer.BASE_ROTATION); break; @@ -219,13 +227,13 @@ export default class Barrel extends ObjectEntity { public calculateStatData() { const reloadTime = this.tank.reloadTime * this.definition.reload; - + const bulletSpeed = (this.definition.bullet.speed instanceof Array) ? util.randomRange(this.definition.bullet.speed[0], this.definition.bullet.speed[1]) : this.definition.bullet.speed; if (reloadTime !== this.shootCycle.reloadTime) { this.shootCycle.pos *= reloadTime / this.shootCycle.reloadTime; this.shootCycle.reloadTime = this.barrelData.reloadTime = reloadTime; } - this.bulletAccel = (20 + (this.tank.cameraEntity.cameraData?.values.statLevels.values[Stat.BulletSpeed] || 0) * 3) * this.definition.bullet.speed; + this.bulletAccel = (20 + (this.tank.cameraEntity.cameraData?.values.statLevels.values[Stat.BulletSpeed] || 0) * 3) * bulletSpeed; } public tick(tick: number) { diff --git a/src/Entity/Tank/Projectile/Bullet.ts b/src/Entity/Tank/Projectile/Bullet.ts index 8e3fcd93..3d0b5ddd 100644 --- a/src/Entity/Tank/Projectile/Bullet.ts +++ b/src/Entity/Tank/Projectile/Bullet.ts @@ -23,6 +23,7 @@ import { HealthFlags, PositionFlags, PhysicsFlags, Stat, StyleFlags } from "../. import { TankDefinition } from "../../../Const/TankDefinitions"; import { BarrelBase } from "../TankBody"; import { EntityStateFlags } from "../../../Native/Entity"; +import { randomRange } from "../../../util"; /** * The bullet class represents the bullet entity in diep. @@ -68,35 +69,39 @@ export default class Bullet extends LivingEntity { const scaleFactor = tank.scaleFactor; const statLevels = tank.cameraEntity.cameraData?.values.statLevels.values; + + const launchSpeed = (bulletDefinition.launchSpeed instanceof Array) ? randomRange(bulletDefinition.launchSpeed[0], bulletDefinition.launchSpeed[1]) : bulletDefinition.launchSpeed ?? 1; + const absorbtionFactor = (bulletDefinition.absorbtionFactor instanceof Array) ? randomRange(bulletDefinition.absorbtionFactor[0], bulletDefinition.absorbtionFactor[1]) : bulletDefinition.absorbtionFactor; + const damage = (bulletDefinition.damage instanceof Array) ? randomRange(bulletDefinition.damage[0], bulletDefinition.damage[1]) : bulletDefinition.damage; + const health = (bulletDefinition.health instanceof Array) ? randomRange(bulletDefinition.health[0], bulletDefinition.health[1]) : bulletDefinition.health; + const sizeRatio = (bulletDefinition.sizeRatio instanceof Array) ? randomRange(bulletDefinition.sizeRatio[0], bulletDefinition.sizeRatio[1]) : bulletDefinition.sizeRatio; + const lifeLength = (bulletDefinition.lifeLength instanceof Array) ? randomRange(bulletDefinition.lifeLength[0], bulletDefinition.lifeLength[1]) : bulletDefinition.lifeLength; + this.relationsData.values.team = barrel.relationsData.values.team; this.relationsData.values.owner = tank; this.physicsData.values.sides = 1; this.physicsData.values.flags |= PhysicsFlags.noOwnTeamCollision | PhysicsFlags.canEscapeArena; if (tank.positionData.values.flags & PositionFlags.canMoveThroughWalls) this.positionData.values.flags |= PositionFlags.canMoveThroughWalls - this.physicsData.values.size = (barrel.physicsData.values.width / 2) * bulletDefinition.sizeRatio; + this.physicsData.values.size = (barrel.physicsData.values.width / 2) * sizeRatio; this.styleData.values.color = tank.rootParent.styleData.values.color; this.styleData.values.flags |= StyleFlags.hasNoDmgIndicator; this.healthData.values.flags = HealthFlags.hiddenHealthbar; const bulletDamage = statLevels ? statLevels[Stat.BulletDamage] : 0; const bulletPenetration = statLevels ? statLevels[Stat.BulletPenetration] : 0; - - this.physicsData.values.absorbtionFactor = bulletDefinition.absorbtionFactor; - this.physicsData.values.pushFactor = ((7 / 3) + bulletDamage) * bulletDefinition.damage * bulletDefinition.absorbtionFactor; + this.physicsData.values.absorbtionFactor = absorbtionFactor; + this.physicsData.values.pushFactor = ((7 / 3) + bulletDamage) * damage * absorbtionFactor this.baseAccel = barrel.bulletAccel; - this.baseSpeed = barrel.bulletAccel + 30 - Math.random() * bulletDefinition.scatterRate; - if(bulletDefinition.launchSpeed) { - this.baseSpeed *= bulletDefinition.launchSpeed; - } + this.baseSpeed = barrel.bulletAccel + (30 - Math.random() * bulletDefinition.scatterRate) * launchSpeed; - this.healthData.values.health = this.healthData.values.maxHealth = (1.5 * bulletPenetration + 2) * bulletDefinition.health; - this.damagePerTick = (7 + bulletDamage * 3) * bulletDefinition.damage; + this.healthData.values.health = this.healthData.values.maxHealth = (1.5 * bulletPenetration + 2) * health; + this.damagePerTick = (7 + bulletDamage * 3) * damage; this.minDamageMultiplier = 0.25; this.maxDamageMultiplier = 1; - this.lifeLength = bulletDefinition.lifeLength * 75; + this.lifeLength = lifeLength * 75; const {x, y} = tank.getWorldPosition(); diff --git a/src/Entity/Tank/Projectile/Drone.ts b/src/Entity/Tank/Projectile/Drone.ts index 909fb5ed..a2c5b19b 100644 --- a/src/Entity/Tank/Projectile/Drone.ts +++ b/src/Entity/Tank/Projectile/Drone.ts @@ -24,6 +24,7 @@ import { TankDefinition } from "../../../Const/TankDefinitions"; import { Entity } from "../../../Native/Entity"; import { AI, AIState } from "../../AI"; import { BarrelBase } from "../TankBody"; +import { randomRange } from "../../../util"; /** * The drone class represents the drone (projectile) entity in diep. @@ -48,7 +49,9 @@ export default class Drone extends Bullet { super(barrel, tank, tankDefinition, shootAngle); const bulletDefinition = barrel.definition.bullet; - + const absorbtionFactor = (bulletDefinition.absorbtionFactor instanceof Array) ? randomRange(bulletDefinition.absorbtionFactor[0], bulletDefinition.absorbtionFactor[1]) : bulletDefinition.absorbtionFactor; + const lifeLength = (bulletDefinition.lifeLength instanceof Array) ? randomRange(bulletDefinition.lifeLength[0], bulletDefinition.lifeLength[1]) : bulletDefinition.lifeLength; + this.usePosAngle = true; this.ai = new AI(this); @@ -62,14 +65,14 @@ export default class Drone extends Bullet { this.styleData.values.flags &= ~StyleFlags.hasNoDmgIndicator; if (barrel.definition.bullet.lifeLength !== -1) { - this.lifeLength = 88 * barrel.definition.bullet.lifeLength; + this.lifeLength = 88 * lifeLength; } else { this.lifeLength = Infinity; } this.deathAccelFactor = 1; this.physicsData.values.pushFactor = 4; - this.physicsData.values.absorbtionFactor = bulletDefinition.absorbtionFactor; + this.physicsData.values.absorbtionFactor = absorbtionFactor; this.baseSpeed /= 3; diff --git a/src/Entity/Tank/Projectile/Flame.ts b/src/Entity/Tank/Projectile/Flame.ts index f0744afe..48eb3110 100644 --- a/src/Entity/Tank/Projectile/Flame.ts +++ b/src/Entity/Tank/Projectile/Flame.ts @@ -21,10 +21,13 @@ import Bullet from "./Bullet"; import { TankDefinition } from "../../../Const/TankDefinitions"; import { BarrelBase } from "../TankBody"; +import { randomRange } from "../../../util"; export default class Flame extends Bullet { public constructor(barrel: Barrel, tank: BarrelBase, tankDefinition: TankDefinition | null, shootAngle: number) { super(barrel, tank, tankDefinition, shootAngle); + const bulletDefinition = barrel.definition.bullet; + const lifeLength = (bulletDefinition.lifeLength instanceof Array) ? randomRange(bulletDefinition.lifeLength[0], bulletDefinition.lifeLength[1]) : bulletDefinition.lifeLength this.baseSpeed *= 2; this.baseAccel = 0; @@ -32,7 +35,7 @@ export default class Flame extends Bullet { this.physicsData.values.sides = 4; this.physicsData.values.absorbtionFactor = this.physicsData.values.pushFactor = 0; - this.lifeLength = 25 * barrel.definition.bullet.lifeLength; + this.lifeLength = 25 * lifeLength; } public destroy(animate?: boolean): void { diff --git a/src/Entity/Tank/Projectile/Glider.ts b/src/Entity/Tank/Projectile/Glider.ts new file mode 100644 index 00000000..6868d85a --- /dev/null +++ b/src/Entity/Tank/Projectile/Glider.ts @@ -0,0 +1,105 @@ +/* + DiepCustom - custom tank game server that shares diep.io's WebSocket protocol + Copyright (C) 2022 ABCxFF (github.com/ABCxFF) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see +*/ + +import Barrel from "../Barrel"; +import Bullet from "./Bullet"; + +import { InputFlags } from "../../../Const/Enums"; +import { BarrelDefinition, TankDefinition } from "../../../Const/TankDefinitions"; +import { Inputs } from "../../AI"; +import { BarrelBase } from "../TankBody"; +import { CameraEntity } from "../../../Native/Camera"; +import { PI2 } from "../../../util"; + +/** + * Barrel definition for the rocketeer rocket's barrel. + */ +const GliderBarrelDefinition: BarrelDefinition = { + angle: Math.PI * 1.2, + offset: 0, + size: 70, + width: 43.02984, + delay: 0.5, + reload: 0.75, + recoil: 3.2, + isTrapezoid: false, + trapezoidDirection: 0, + addon: null, + bullet: { + type: "bullet", + health: 0.6, + damage: 0.6, + speed: 0.7, + scatterRate: 1, + lifeLength: 0.5, + sizeRatio: 1, + absorbtionFactor: 1 + } +}; + +/** + * Represents all glider rockets in game. + */ +export default class Glider extends Bullet implements BarrelBase { + /** glider's barrels */ + private gliderBarrels: Barrel[]; + + /** The camera entity (used as team) of the glider. */ + public cameraEntity: CameraEntity; + /** The reload time of the glider's barrel. */ + public reloadTime = 15; + /** The inputs for when to shoot or not. (glider) */ + public inputs: Inputs; + + + public constructor(barrel: Barrel, tank: BarrelBase, tankDefinition: TankDefinition | null, shootAngle: number) { + super(barrel, tank, tankDefinition, shootAngle); + + this.cameraEntity = tank.cameraEntity; + + const gliderBarrels: Barrel[] = this.gliderBarrels =[]; + + const s1 = new Barrel(this, {...GliderBarrelDefinition}); + const s2Definition = {...GliderBarrelDefinition}; + s2Definition.angle -= PI2/5 + const s2 = new Barrel(this, s2Definition); + + s1.styleData.values.color = this.styleData.values.color; + s1.scale(this.sizeFactor); + s2.styleData.values.color = this.styleData.values.color; + s2.scale(this.sizeFactor); + + gliderBarrels.push(s1, s2); + + this.inputs = new Inputs(); + this.inputs.flags |= InputFlags.leftclick; + } + + public get sizeFactor() { + return this.physicsData.values.size / 50; + } + + public tick(tick: number) { + this.reloadTime = this.tank.reloadTime; + super.tick(tick); + + if (this.deletionAnimation) return; + // Only accurate on current version, but we dont want that + // if (!Entity.exists(this.barrelEntity.rootParent) && (this.inputs.flags & InputFlags.leftclick)) this.inputs.flags ^= InputFlags.leftclick; + } +} diff --git a/src/Entity/Tank/Projectile/NecromancerSquare.ts b/src/Entity/Tank/Projectile/NecromancerSquare.ts index 87b69dd2..cea1d98b 100644 --- a/src/Entity/Tank/Projectile/NecromancerSquare.ts +++ b/src/Entity/Tank/Projectile/NecromancerSquare.ts @@ -24,6 +24,7 @@ import { TankDefinition } from "../../../Const/TankDefinitions"; import { AI } from "../../AI"; import { BarrelBase } from "../TankBody"; import LivingEntity from "../../Live"; +import { randomRange } from "../../../util"; /** * The drone class represents the drone (projectile) entity in diep. @@ -33,7 +34,8 @@ export default class NecromancerSquare extends Drone { super(barrel, tank, tankDefinition, shootAngle); const bulletDefinition = barrel.definition.bullet; - + const absorbtionFactor = (bulletDefinition.absorbtionFactor instanceof Array) ? randomRange(bulletDefinition.absorbtionFactor[0], bulletDefinition.absorbtionFactor[1]) : bulletDefinition.absorbtionFactor; + this.ai = new AI(this); this.ai.viewRange = 900; @@ -49,7 +51,7 @@ export default class NecromancerSquare extends Drone { this.maxDamageMultiplier = 4; this.physicsData.values.pushFactor = 4; - this.physicsData.values.absorbtionFactor = bulletDefinition.absorbtionFactor; + this.physicsData.values.absorbtionFactor = absorbtionFactor; this.baseSpeed = 0; } diff --git a/src/Entity/Tank/Projectile/Shell.ts b/src/Entity/Tank/Projectile/Shell.ts new file mode 100644 index 00000000..6d29fb65 --- /dev/null +++ b/src/Entity/Tank/Projectile/Shell.ts @@ -0,0 +1,243 @@ +/* + DiepCustom - custom tank game server that shares diep.io's WebSocket protocol + Copyright (C) 2022 ABCxFF (github.com/ABCxFF) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see +*/ + +import Barrel from "../Barrel"; +import Bullet from "./Bullet"; + +import { InputFlags } from "../../../Const/Enums"; +import { BarrelDefinition, TankDefinition } from "../../../Const/TankDefinitions"; +import { Inputs } from "../../AI"; +import { BarrelBase } from "../TankBody"; +import { CameraEntity } from "../../../Native/Camera"; +import { PI2 } from "../../../util"; + +/** + * Barrel definition for the firework shell's back barrel. + */ +const ShellBackBarrelDefinition: BarrelDefinition = { + angle: Math.PI, + offset: 0, + size: 63.9214, + width: 35.7, + delay: 0.5, + reload: 0.5, + recoil: 5.6, + isTrapezoid: false, + trapezoidDirection: 0, + addon: null, + bullet: { + type: "bullet", + health: 0.3, + damage: 0.6, + speed: 0.5, + scatterRate: 0.2, + lifeLength: 0.2, + sizeRatio: 1, + absorbtionFactor: 1, + launchSpeed: 1.5, + } +}; + +const ShellBurstBarrelDefinition1: BarrelDefinition = { + angle: -Math.PI + Math.PI/6, + offset: 0, + size: 0, + width: 35.7, + delay: 0, + reload: 20, + recoil: 0, + isTrapezoid: false, + trapezoidDirection: 0, + addon: null, + rightClickFire: true, + bullet: { + type: "bullet", + health: 0.4, + damage: 0.6, + speed: 0.4, + scatterRate: 0.5, + lifeLength: 0.16, + sizeRatio: 1, + absorbtionFactor: 0.25, + launchSpeed: 0.6 + } +}; + +const ShellBurstBarrelDefinition2: BarrelDefinition = { + angle: -Math.PI, + offset: 0, + size: 0, + width: 35.7, + delay: 0, + reload: 20, + recoil: 0, + isTrapezoid: false, + trapezoidDirection: 0, + addon: null, + rightClickFire: true, + bullet: { + type: "bullet", + health: 0.4, + damage: 0.6, + speed: 0.6, + scatterRate: 0.5, + lifeLength: 0.16, + sizeRatio: 1, + absorbtionFactor: 0.25, + launchSpeed: 0.8 + } +}; + +const ShellBurstBarrelDefinition3: BarrelDefinition = { + angle: -Math.PI + Math.PI/6, + offset: 0, + size: 0, + width: 35.7, + delay: 0, + reload: 20, + recoil: 0, + isTrapezoid: false, + trapezoidDirection: 0, + addon: null, + rightClickFire: true, + bullet: { + type: "bullet", + health: 0.4, + damage: 0.6, + speed: 0.8, + scatterRate: 0.5, + lifeLength: 0.16, + sizeRatio: 1, + absorbtionFactor: 0.25, + launchSpeed: 1 + } +}; + +const ShellBurstBarrelDefinition4: BarrelDefinition = { + angle: -Math.PI, + offset: 0, + size: 0, + width: 35.7, + delay: 0, + reload: 20, + recoil: 0, + isTrapezoid: false, + trapezoidDirection: 0, + addon: null, + rightClickFire: true, + bullet: { + type: "bullet", + health: 0.4, + damage: 0.6, + speed: 0.2, + scatterRate: 0.5, + lifeLength: 0.16, + sizeRatio: 1, + absorbtionFactor: 0.25, + launchSpeed: 0.4 + } +}; + +/** + * Represents all firework shells in game. + */ +export default class Shell extends Bullet implements BarrelBase { + /** shells's barrels */ + private shellBarrels: Barrel[]; + + /** The camera entity (used as team) of the shells. */ + public cameraEntity: CameraEntity; + /** The reload time of the shells's barrel. */ + public reloadTime = 15; + /** The inputs for when to shoot or not. (shells) */ + public inputs: Inputs; + /** Whether or not the shell has expoded */ + public hasBursted: Boolean; + + public constructor(barrel: Barrel, tank: BarrelBase, tankDefinition: TankDefinition | null, shootAngle: number) { + super(barrel, tank, tankDefinition, shootAngle); + + this.cameraEntity = tank.cameraEntity; + + this.physicsData.values.sides = 6; + + this.hasBursted = false; + + const shellBarrels: Barrel[] = this.shellBarrels =[]; + + const f1 = new Barrel(this, {...ShellBackBarrelDefinition}); + + f1.styleData.values.color = this.styleData.values.color; + f1.scale(this.sizeFactor); + shellBarrels.push(f1); + + //Now for the explosion barrels. + for (let i = 0; i < 6; ++i) { + let offset = PI2/6 * i - 1 + + let s1Definition = {...ShellBurstBarrelDefinition1}; + s1Definition.angle += offset + let s1 = new Barrel(this, {...s1Definition}); + s1.styleData.values.color = this.styleData.values.color; + s1.scale(this.sizeFactor); + + let s2Definition = {...ShellBurstBarrelDefinition2}; + s2Definition.angle += offset + let s2 = new Barrel(this, {...s2Definition}); + s2.styleData.values.color = this.styleData.values.color; + s2.scale(this.sizeFactor); + + let s3Definition = {...ShellBurstBarrelDefinition3}; + s3Definition.angle += offset + let s3 = new Barrel(this, {...s3Definition}); + s3.styleData.values.color = this.styleData.values.color; + s3.scale(this.sizeFactor); + + let s4Definition = {...ShellBurstBarrelDefinition4}; + s4Definition.angle += offset + let s4 = new Barrel(this, {...s4Definition}); + s4.styleData.values.color = this.styleData.values.color; + s4.scale(this.sizeFactor); + + shellBarrels.push(s1, s2, s3, s4); + } + + this.inputs = new Inputs(); + this.inputs.flags |= InputFlags.leftclick; + } + + public get sizeFactor() { + return this.physicsData.values.size * Math.SQRT2 / 50; + } + + public tick(tick: number) { + this.reloadTime = this.tank.reloadTime; + if(!this.hasBursted && this.tank.inputs.attemptingRepel() && tick >= this.spawnTick + 10) { + this.hasBursted = true + this.inputs.flags |= InputFlags.rightclick; + } + super.tick(tick); + + if (this.deletionAnimation) return; + if(this.hasBursted) { + this.destroy(true); + } + // Only accurate on current version, but we dont want that + // if (!Entity.exists(this.barrelEntity.rootParent) && (this.inputs.flags & InputFlags.leftclick)) this.inputs.flags ^= InputFlags.leftclick; + } +} diff --git a/src/Entity/Tank/Projectile/Trap.ts b/src/Entity/Tank/Projectile/Trap.ts index 670a529f..86b1a8b3 100644 --- a/src/Entity/Tank/Projectile/Trap.ts +++ b/src/Entity/Tank/Projectile/Trap.ts @@ -23,7 +23,7 @@ import { PhysicsFlags, StyleFlags } from "../../../Const/Enums"; import { TankDefinition } from "../../../Const/TankDefinitions"; import { BarrelBase } from "../TankBody"; import { DevTank } from "../../../Const/DevTankDefinitions"; -import { PI2 } from "../../../util"; +import { PI2, randomRange } from "../../../util"; /** * The trap class represents the trap (projectile) entity in diep. @@ -36,6 +36,7 @@ export default class Trap extends Bullet { super(barrel, tank, tankDefinition, shootAngle); const bulletDefinition = barrel.definition.bullet; + const lifeLength = (bulletDefinition.lifeLength instanceof Array) ? randomRange(bulletDefinition.lifeLength[0], bulletDefinition.lifeLength[1]) : bulletDefinition.lifeLength; this.baseSpeed = (barrel.bulletAccel / 2) + 30 - Math.random() * barrel.definition.bullet.scatterRate; this.baseAccel = 0; @@ -46,7 +47,7 @@ export default class Trap extends Bullet { this.styleData.values.flags &= ~StyleFlags.hasNoDmgIndicator; this.collisionEnd = this.lifeLength >> 3; - this.lifeLength = (600 * barrel.definition.bullet.lifeLength) >> 3; + this.lifeLength = (600 * lifeLength) >> 3; if (tankDefinition && tankDefinition.id === DevTank.Bouncy) this.collisionEnd = this.lifeLength - 1; // Check this? diff --git a/src/util.ts b/src/util.ts index 03a19e64..b05ef015 100644 --- a/src/util.ts +++ b/src/util.ts @@ -123,3 +123,10 @@ export const saveToLog = (title: string, description: string, color: number) => export const saveToVLog = (text: string) => { if (doVerboseLogs) console.log("[v] " + text); } + +/** + * Returns a value inbetween 2 seperate numbers + */ +export const randomRange = (min: number, max: number): number => { + return min + ((max - min) * Math.random()); +} From 378d20e64ed47fd3899188e97ecf99f0a4c0deca Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Sun, 20 Sep 2026 11:30:52 -0400 Subject: [PATCH 04/18] removals --- client/config.js | 91 +- src/Const/Enums.ts | 8 +- src/Const/TankDefinitions - Copy.json | 7367 ------------------------- src/Const/TankDefinitions.json | 723 --- src/Entity/Tank/Addons.ts | 159 - src/Entity/Tank/Projectile/Glider.ts | 105 - src/Entity/Tank/Projectile/Shell.ts | 243 - 7 files changed, 2 insertions(+), 8694 deletions(-) delete mode 100644 src/Const/TankDefinitions - Copy.json delete mode 100644 src/Entity/Tank/Projectile/Glider.ts delete mode 100644 src/Entity/Tank/Projectile/Shell.ts diff --git a/client/config.js b/client/config.js index 90804526..ec7bc023 100644 --- a/client/config.js +++ b/client/config.js @@ -373,96 +373,7 @@ const CUSTOM_ADDONS = { rect2.physicsData.width = entity.physicsData.width * 1.25; rect2.physicsData.size = entity.physicsData.size * (35 / 50); rect2.positionData.x = (-entity.physicsData.size + rect2.physicsData.size) / 2; - }, - "shotpronounced": entity => { - if(!(entity instanceof $Entity)) return; - const sizeRatio = 75; - const widthRatio = 42 * 1.19048; - const offsetRatio = 2.5; - - const pronounced = entity.createChild(false); - pronounced.defaults(); - pronounced.styleData.color = 1; - pronounced.physicsData.isTrapezoid = true; - pronounced.physicsData.sides = 2; - pronounced.physicsData.width = widthRatio - pronounced.physicsData.size = sizeRatio; - pronounced.positionData.x = offsetRatio + (pronounced.physicsData.size/2); - }, - "pelletpronounced": entity => { - if(!(entity instanceof $Entity)) return; - const sizeRatio = 65; - const widthRatio = 42 * 1.19048; - - const pronounced = entity.createChild(false); - pronounced.defaults(); - pronounced.styleData.color = 1; - pronounced.physicsData.isTrapezoid = true; - pronounced.physicsData.sides = 2; - pronounced.physicsData.width = widthRatio - pronounced.physicsData.size = sizeRatio; - pronounced.positionData.x = (pronounced.physicsData.size/2); - }, - "pelletlauncher": entity => { - if(!(entity instanceof $Entity)) return; - const sizeRatio = 95; - const widthRatio = 42 * 0.809524; - - const launcher = entity.createChild(false); - launcher.defaults(); - launcher.styleData.color = 1; - launcher.physicsData.isTrapezoid = true; - launcher.physicsData.sides = 2; - launcher.physicsData.width = widthRatio - launcher.physicsData.size = sizeRatio; - launcher.positionData.x = (launcher.physicsData.size/2); - }, - "gliderlauncher": entity => { - if(!(entity instanceof $Entity)) return; - const sizeRatio = 65.5 * Math.SQRT2; - const widthRatio = 33.6; - - const launcher = entity.createChild(false); - launcher.defaults(); - launcher.styleData.color = 1; - launcher.physicsData.isTrapezoid = true; - launcher.physicsData.sides = 2; - launcher.physicsData.width = widthRatio - launcher.physicsData.size = sizeRatio; - launcher.positionData.x = (launcher.physicsData.size/2); - launcher.positionData.angle = Math.PI; - }, - "fireworkpronounced": entity => { - if(!(entity instanceof $Entity)) return; - const sizeRatio = 45; - const widthRatio = 53.55; - const offsetRatio = 15; - - const pronounced = entity.createChild(false); - pronounced.defaults(); - pronounced.styleData.color = 1; - pronounced.physicsData.isTrapezoid = true; - pronounced.physicsData.sides = 2; - pronounced.physicsData.width = widthRatio - pronounced.physicsData.size = sizeRatio; - pronounced.positionData.x = offsetRatio + (pronounced.physicsData.size/2); - pronounced.positionData.angle = Math.PI; - }, - "fireworklauncher": entity => { - if(!(entity instanceof $Entity)) return; - const sizeRatio = 80; - const widthRatio = 29.4; - const offsetRatio = 15; - - const launcher = entity.createChild(false); - launcher.defaults(); - launcher.styleData.color = 1; - launcher.physicsData.isTrapezoid = true; - launcher.physicsData.sides = 2; - launcher.physicsData.width = widthRatio - launcher.physicsData.size = sizeRatio; - launcher.positionData.x = offsetRatio + (launcher.physicsData.size/2); - }, + } } const CUSTOM_COMMANDS = [ diff --git a/src/Const/Enums.ts b/src/Const/Enums.ts index 47600960..d597c360 100644 --- a/src/Const/Enums.ts +++ b/src/Const/Enums.ts @@ -125,13 +125,7 @@ export const enum Tank { Spike = 51, Factory = 52, Skimmer = 54, - Rocketeer = 55, - AutoTank = 58, - DualBarrel = 60, - PelletShot = 61, - Shotgun = 62, - Glider = 63, - Firework = 64, + Rocketeer = 55 } /** diff --git a/src/Const/TankDefinitions - Copy.json b/src/Const/TankDefinitions - Copy.json deleted file mode 100644 index 3e28b8b6..00000000 --- a/src/Const/TankDefinitions - Copy.json +++ /dev/null @@ -1,7367 +0,0 @@ -[ - { - "id": 0, - "name": "Tank", - "upgradeMessage": "", - "levelRequirement": 0, - "upgrades": [ - 1, - 6, - 7, - 8, - 36, - 58 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 1, - "name": "Twin", - "upgradeMessage": "", - "levelRequirement": 15, - "upgrades": [ - 3, - 4, - 13 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": -26, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 0.75, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.9, - "damage": 0.65, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 26, - "size": 95, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 0.75, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.9, - "damage": 0.65, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 2, - "name": "Triplet", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": -26, - "size": 80, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 0.5, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.7, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 26, - "size": 80, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 0.5, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.7, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 0.5, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.7, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 3, - "name": "Triple Shot", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 2, - 14, - 42 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": -0.7853981633974483, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.7, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0.7853981633974483, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.7, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.7, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 4, - "name": "Quad Tank", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 5, - 40 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 3.141592653589793, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.75, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": -1.5707963267948966, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.75, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 1.5707963267948966, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.75, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.75, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 5, - "name": "Octo Tank", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": -0.7853981633974483, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.65, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0.7853981633974483, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.65, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": -2.356194490192345, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.65, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.356194490192345, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.65, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.141592653589793, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.65, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": -1.5707963267948966, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.65, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 1.5707963267948966, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.65, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.65, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 6, - "name": "Sniper", - "upgradeMessage": "", - "levelRequirement": 15, - "upgrades": [ - 15, - 11, - 19, - 31 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 110, - "width": 42, - "delay": 0, - "reload": 1.5, - "recoil": 3, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1.4, - "scatterRate": 0.3, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 7, - "name": "Machine Gun", - "upgradeMessage": "", - "levelRequirement": 15, - "upgrades": [ - 10, - 20, - 29, - 62 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 0.5, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.7, - "speed": 1, - "scatterRate": 3, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 8, - "name": "Flank Guard", - "upgradeMessage": "", - "levelRequirement": 15, - "upgrades": [ - 9, - 4, - 13, - 41 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.141592653589793, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 9, - "name": "Tri-Angle", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 23, - 24 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.665191429188092, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 2.4, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.15, - "speed": 1, - "scatterRate": 1, - "lifeLength": 0.25, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.6179938779914944, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0.4, - "reload": 1, - "recoil": 2.4, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.15, - "speed": 1, - "scatterRate": 1, - "lifeLength": 0.25, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 10, - "name": "Destroyer", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 25, - 49, - 54, - 55, - 63, - 64 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 71.39999999999999, - "delay": 0, - "reload": 4, - "recoil": 15, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 2, - "damage": 3, - "speed": 0.7, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 0.1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 11, - "name": "Overseer", - "upgradeMessage": "Use your left mouse button to control the drones", - "levelRequirement": 30, - "upgrades": [ - 12, - 17, - 26, - 33, - 48, - 52 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": -1.5707963267948966, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 6, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 4, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.8, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 1.5707963267948966, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 6, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 4, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.8, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Drone Damage", - "max": 7 - }, - { - "name": "Drone Health", - "max": 7 - }, - { - "name": "Drone Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 12, - "name": "Overlord", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": -1.5707963267948966, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 6, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.8, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 1.5707963267948966, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 6, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.8, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 6, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.8, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.141592653589793, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 6, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.8, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Drone Damage", - "max": 7 - }, - { - "name": "Drone Health", - "max": 7 - }, - { - "name": "Drone Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 13, - "name": "Twin Flank", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 18, - 48 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": -26, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 26, - "size": 95, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.141592653589793, - "offset": -26, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.141592653589793, - "offset": 26, - "size": 95, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 14, - "name": "Penta Shot", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": -0.7853981633974483, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 0.5, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.5, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0.7853981633974483, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 0.5, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.5, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": -0.39269908169872414, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 0.5, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.5, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0.39269908169872414, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 0.5, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.5, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 110, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 0.5, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.5, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 15, - "name": "Assassin", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 22, - 21 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.75, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 120, - "width": 42, - "delay": 0, - "reload": 2, - "recoil": 4, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1.5, - "scatterRate": 0.2, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 16, - "name": "Arena Closer", - "upgradeMessage": "", - "levelRequirement": 0, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 75, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 300, - "damage": 7, - "speed": 2, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 17, - "name": "Necromancer", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": true, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 4, - "borderWidth": 15, - "barrels": [ - { - "angle": -1.5707963267948966, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 6, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 0, - "canControlDrones": true, - "bullet": { - "type": "necrodrone", - "sizeRatio": 1, - "health": 2, - "damage": 0.42, - "speed": 0.76, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 1.5707963267948966, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 6, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 0, - "canControlDrones": true, - "bullet": { - "type": "necrodrone", - "sizeRatio": 1, - "health": 2, - "damage": 0.42, - "speed": 0.76, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Drone Count", - "max": 7 - }, - { - "name": "Drone Damage", - "max": 7 - }, - { - "name": "Drone Health", - "max": 7 - }, - { - "name": "Drone Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 18, - "name": "Triple Twin", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": -26, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 26, - "size": 95, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.0943951023931953, - "offset": -26, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.0943951023931953, - "offset": 26, - "size": 95, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": -2.0943951023931953, - "offset": -26, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": -2.0943951023931953, - "offset": 26, - "size": 95, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 19, - "name": "Hunter", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 28, - 43 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.85, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 110, - "width": 42, - "delay": 0, - "reload": 2.5, - "recoil": 0.3, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.75, - "speed": 1.4, - "scatterRate": 0.3, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 56.7, - "delay": 0.2, - "reload": 2.5, - "recoil": 0.3, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.75, - "speed": 1.4, - "scatterRate": 0.3, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 20, - "name": "Gunner", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 39, - 32, - 43 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": -32, - "size": 65, - "width": 25.2, - "delay": 0.5, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.5, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 32, - "size": 65, - "width": 25.2, - "delay": 0.75, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.5, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": -17, - "size": 85, - "width": 25.2, - "delay": 0, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.5, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 17, - "size": 85, - "width": 25.2, - "delay": 0.25, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.5, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 21, - "name": "Stalker", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": true, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.75, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 120, - "width": 42, - "delay": 0, - "reload": 2, - "recoil": 4, - "isTrapezoid": true, - "trapezoidDirection": 3.141592653589793, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1.5, - "scatterRate": 0.3, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 22, - "name": "Ranger", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.7, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "pronounced", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 120, - "width": 42, - "delay": 0, - "reload": 2, - "recoil": 3, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1.5, - "scatterRate": 0.3, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 23, - "name": "Booster", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.9269908169872414, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0.66, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.2, - "speed": 1, - "scatterRate": 1, - "lifeLength": 0.5, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.356194490192345, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0.66, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.2, - "speed": 1, - "scatterRate": 1, - "lifeLength": 0.5, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.665191429188092, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0.33, - "reload": 1, - "recoil": 2.5, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.2, - "speed": 1, - "scatterRate": 1, - "lifeLength": 0.5, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.6179938779914944, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0.33, - "reload": 1, - "recoil": 2.5, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.2, - "speed": 1, - "scatterRate": 1, - "lifeLength": 0.5, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 24, - "name": "Fighter", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 1.5707963267948966, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0, - "reload": 1.5, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.8, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": -1.5707963267948966, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0, - "reload": 1.5, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.8, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.665191429188092, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 2.5, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.2, - "speed": 1, - "scatterRate": 1, - "lifeLength": 0.5, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.6179938779914944, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 2.5, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.2, - "speed": 1, - "scatterRate": 1, - "lifeLength": 0.5, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 25, - "name": "Hybrid", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 71.39999999999999, - "delay": 0, - "reload": 4, - "recoil": 15, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 2, - "damage": 3, - "speed": 0.7, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 0.1 - } - }, - { - "angle": 3.141592653589793, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 6, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": false, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 1.4, - "damage": 0.7, - "speed": 1, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 26, - "name": "Manager", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": true, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 3, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 8, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.8, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Drone Damage", - "max": 7 - }, - { - "name": "Drone Health", - "max": 7 - }, - { - "name": "Drone Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 27, - "name": "Mothership", - "upgradeMessage": "", - "levelRequirement": 0, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 0.01, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 16, - "borderWidth": 140, - "barrels": [ - { - "angle": 0.19634954084936207, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0.5890486225480862, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": false, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0.9817477042468103, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 1.3744467859455345, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": false, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 1.7671458676442586, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.159844949342983, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": false, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.552544031041707, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.9452431127404313, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": false, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.3379421944391554, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.7306412761378795, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": false, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 4.12333992150429, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 4.516039439535327, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": false, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 4.908738521234052, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 5.301437166600463, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": false, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 5.6941366846315, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": true, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 6.086835766330224, - "offset": 0, - "size": 60, - "width": 10.5, - "delay": 0, - "reload": 6, - "recoil": 0, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 2, - "canControlDrones": false, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 2, - "damage": 0.7, - "speed": 0.48, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Drone Damage", - "max": 7 - }, - { - "name": "Drone Health", - "max": 7 - }, - { - "name": "Drone Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 28, - "name": "Predator", - "upgradeMessage": "Use your right mouse button to look further in the direction you're facing", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": true, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.85, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 110, - "width": 42, - "delay": 0, - "reload": 3, - "recoil": 0.3, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.75, - "speed": 1.4, - "scatterRate": 0.3, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 56.7, - "delay": 0.2, - "reload": 3, - "recoil": 0.3, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.75, - "speed": 1.4, - "scatterRate": 0.3, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 71.39999999999999, - "delay": 0.4, - "reload": 3, - "recoil": 0.3, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.75, - "speed": 1.4, - "scatterRate": 0.3, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 29, - "name": "Sprayer", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 110, - "width": 42, - "delay": 0.5, - "reload": 1, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.1, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 0.5, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.7, - "speed": 1, - "scatterRate": 3, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - null, - { - "id": 31, - "name": "Trapper", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 35, - 32, - 33, - 34, - 44 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 60, - "width": 42, - "delay": 0, - "reload": 1.5, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 2, - "damage": 1, - "speed": 2, - "scatterRate": 1, - "lifeLength": 8, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 32, - "name": "Gunner Trapper", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": -16, - "size": 75, - "width": 21, - "delay": 0.66, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.5, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 16, - "size": 75, - "width": 21, - "delay": 0.33, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.5, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.141592653589793, - "offset": 0, - "size": 60, - "width": 54.6, - "delay": 0, - "reload": 3, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 2, - "damage": 1, - "speed": 2, - "scatterRate": 1, - "lifeLength": 8, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 33, - "name": "Overtrapper", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 60, - "width": 42, - "delay": 0, - "reload": 1.5, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 2, - "damage": 1, - "speed": 2, - "scatterRate": 1, - "lifeLength": 8, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.0943951023931953, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 6, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 1, - "canControlDrones": false, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 1.4, - "damage": 0.7, - "speed": 1, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - }, - { - "angle": 4.1887902047863905, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 6, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 1, - "canControlDrones": false, - "bullet": { - "type": "drone", - "sizeRatio": 1, - "health": 1.4, - "damage": 0.7, - "speed": 1, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 34, - "name": "Mega Trapper", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 60, - "width": 54.6, - "delay": 0, - "reload": 3.3, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "bullet": { - "type": "trap", - "sizeRatio": 1.28, - "health": 3.2, - "damage": 1.6, - "speed": 2, - "scatterRate": 1, - "lifeLength": 8, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 35, - "name": "Tri-Trapper", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 60, - "width": 42, - "delay": 0, - "reload": 1.5, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 2, - "damage": 1, - "speed": 2, - "scatterRate": 1, - "lifeLength": 3.2, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.0943951023931953, - "offset": 0, - "size": 60, - "width": 42, - "delay": 0, - "reload": 1.5, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 2, - "damage": 1, - "speed": 2, - "scatterRate": 1, - "lifeLength": 3.2, - "absorbtionFactor": 1 - } - }, - { - "angle": 4.1887902047863905, - "offset": 0, - "size": 60, - "width": 42, - "delay": 0, - "reload": 1.5, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 2, - "damage": 1, - "speed": 2, - "scatterRate": 1, - "lifeLength": 3.2, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 36, - "name": "Smasher", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 38, - 50, - 51 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "smasher", - "sides": 1, - "borderWidth": 15, - "barrels": [], - "stats": [ - { - "name": "Movement Speed", - "max": 10 - }, - { - "name": "Reload", - "max": 0 - }, - { - "name": "Bullet Damage", - "max": 0 - }, - { - "name": "Bullet Penetration", - "max": 0 - }, - { - "name": "Bullet Speed", - "max": 0 - }, - { - "name": "Body Damage", - "max": 10 - }, - { - "name": "Max Health", - "max": 10 - }, - { - "name": "Health Regen", - "max": 10 - } - ] - }, - null, - { - "id": 38, - "name": "Landmine", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": true, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0, - "visibilityRateMoving": 0.16, - "invisibilityRate": 0.003, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "landmine", - "sides": 1, - "borderWidth": 15, - "barrels": [], - "stats": [ - { - "name": "Movement Speed", - "max": 10 - }, - { - "name": "Reload", - "max": 0 - }, - { - "name": "Bullet Damage", - "max": 0 - }, - { - "name": "Bullet Penetration", - "max": 0 - }, - { - "name": "Bullet Speed", - "max": 0 - }, - { - "name": "Body Damage", - "max": 10 - }, - { - "name": "Max Health", - "max": 10 - }, - { - "name": "Health Regen", - "max": 10 - } - ] - }, - { - "id": 39, - "name": "Auto Gunner", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "autoturret", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": -32, - "size": 65, - "width": 25.2, - "delay": 0.5, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.45, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 32, - "size": 65, - "width": 25.2, - "delay": 0.75, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.45, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": -17, - "size": 85, - "width": 25.2, - "delay": 0, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.45, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 17, - "size": 85, - "width": 25.2, - "delay": 0.25, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 0.45, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 40, - "name": "Auto 5", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "auto5", - "sides": 1, - "borderWidth": 15, - "barrels": [], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 41, - "name": "Auto 3", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 40, - 39 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "auto3", - "sides": 1, - "borderWidth": 15, - "barrels": [], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 42, - "name": "Spread Shot", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 1.3089969389957472, - "offset": 0, - "size": 65, - "width": 29.4, - "delay": 0.833325, - "reload": 2, - "recoil": 0.1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": -1.3089969389957472, - "offset": 0, - "size": 65, - "width": 29.4, - "delay": 0.833325, - "reload": 2, - "recoil": 0.1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 1.0471975511965976, - "offset": 0, - "size": 71, - "width": 29.4, - "delay": 0.666675, - "reload": 2, - "recoil": 0.1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": -1.0471975511965976, - "offset": 0, - "size": 71, - "width": 29.4, - "delay": 0.666675, - "reload": 2, - "recoil": 0.1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0.7853981633974483, - "offset": 0, - "size": 77, - "width": 29.4, - "delay": 0.5, - "reload": 2, - "recoil": 0.1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": -0.7853981633974483, - "offset": 0, - "size": 77, - "width": 29.4, - "delay": 0.5, - "reload": 2, - "recoil": 0.1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0.5235987755982988, - "offset": 0, - "size": 83, - "width": 29.4, - "delay": 0.333325, - "reload": 2, - "recoil": 0.1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": -0.5235987755982988, - "offset": 0, - "size": 83, - "width": 29.4, - "delay": 0.333325, - "reload": 2, - "recoil": 0.1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0.2617993877991494, - "offset": 0, - "size": 89, - "width": 29.4, - "delay": 0.166675, - "reload": 2, - "recoil": 0.1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": -0.2617993877991494, - "offset": 0, - "size": 89, - "width": 29.4, - "delay": 0.166675, - "reload": 2, - "recoil": 0.1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 0.6, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 2, - "recoil": 0.1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 43, - "name": "Streamliner", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.85, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 110, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.2, - "speed": 1.1, - "scatterRate": 0.3, - "lifeLength": 0.8, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 100, - "width": 42, - "delay": 0.2, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.2, - "speed": 1.1, - "scatterRate": 0.3, - "lifeLength": 0.8, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 90, - "width": 42, - "delay": 0.4, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.2, - "speed": 1.1, - "scatterRate": 0.3, - "lifeLength": 0.8, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0.6, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.2, - "speed": 1.1, - "scatterRate": 0.3, - "lifeLength": 0.8, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0.8, - "reload": 1, - "recoil": 0.2, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.2, - "speed": 1.1, - "scatterRate": 0.3, - "lifeLength": 0.8, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 44, - "name": "Auto Trapper", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "autoturret", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 60, - "width": 42, - "delay": 0, - "reload": 1.5, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 2, - "damage": 1, - "speed": 2, - "scatterRate": 1, - "lifeLength": 8, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 45, - "name": "Dominator", - "upgradeMessage": "", - "levelRequirement": 0, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 6000, - "preAddon": "dombase", - "postAddon": "dompronounced", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 34.99965, - "delay": 0.001, - "reload": 3, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 100, - "damage": 10, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 0.1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 0 - }, - { - "name": "Reload", - "max": 0 - }, - { - "name": "Bullet Damage", - "max": 0 - }, - { - "name": "Bullet Penetration", - "max": 0 - }, - { - "name": "Bullet Speed", - "max": 0 - }, - { - "name": "Body Damage", - "max": 0 - }, - { - "name": "Max Health", - "max": 0 - }, - { - "name": "Health Regen", - "max": 0 - } - ] - }, - { - "id": 46, - "name": "Dominator", - "upgradeMessage": "", - "levelRequirement": 0, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 6000, - "preAddon": "dombase", - "postAddon": "dompronounced", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": -6, - "size": 75, - "width": 17.50035, - "delay": 0.666, - "reload": 0.3, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.6, - "health": 5, - "damage": 1, - "speed": 1.2, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 6, - "size": 75, - "width": 17.50035, - "delay": 0.333, - "reload": 0.3, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.6, - "health": 5, - "damage": 1, - "speed": 1.2, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 17.50035, - "delay": 0.001, - "reload": 0.3, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 0.6, - "health": 5, - "damage": 1, - "speed": 1.2, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 0 - }, - { - "name": "Reload", - "max": 0 - }, - { - "name": "Bullet Damage", - "max": 0 - }, - { - "name": "Bullet Penetration", - "max": 0 - }, - { - "name": "Bullet Speed", - "max": 0 - }, - { - "name": "Body Damage", - "max": 0 - }, - { - "name": "Max Health", - "max": 0 - }, - { - "name": "Health Regen", - "max": 0 - } - ] - }, - { - "id": 47, - "name": "Dominator", - "upgradeMessage": "", - "levelRequirement": 0, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 6000, - "preAddon": "dombase", - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 60, - "width": 21, - "delay": 0, - "reload": 1.5, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "forceFire": true, - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 20, - "damage": 3, - "speed": 4, - "scatterRate": 1, - "lifeLength": 3.2, - "absorbtionFactor": 1 - } - }, - { - "angle": 0.7853981633974483, - "offset": 0, - "size": 60, - "width": 21, - "delay": 0, - "reload": 1.5, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "forceFire": true, - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 20, - "damage": 3, - "speed": 4, - "scatterRate": 1, - "lifeLength": 3.2, - "absorbtionFactor": 1 - } - }, - { - "angle": 1.5707963267948966, - "offset": 0, - "size": 60, - "width": 21, - "delay": 0, - "reload": 1.5, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "forceFire": true, - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 20, - "damage": 3, - "speed": 4, - "scatterRate": 1, - "lifeLength": 3.2, - "absorbtionFactor": 1 - } - }, - { - "angle": 2.356194490192345, - "offset": 0, - "size": 60, - "width": 21, - "delay": 0, - "reload": 1.5, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "forceFire": true, - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 20, - "damage": 3, - "speed": 4, - "scatterRate": 1, - "lifeLength": 3.2, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.141592653589793, - "offset": 0, - "size": 60, - "width": 21, - "delay": 0, - "reload": 1.5, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "forceFire": true, - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 20, - "damage": 3, - "speed": 4, - "scatterRate": 1, - "lifeLength": 3.2, - "absorbtionFactor": 1 - } - }, - { - "angle": 3.9269908169872414, - "offset": 0, - "size": 60, - "width": 21, - "delay": 0, - "reload": 1.5, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "forceFire": true, - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 20, - "damage": 3, - "speed": 4, - "scatterRate": 1, - "lifeLength": 3.2, - "absorbtionFactor": 1 - } - }, - { - "angle": 4.71238898038469, - "offset": 0, - "size": 60, - "width": 21, - "delay": 0, - "reload": 1.5, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "forceFire": true, - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 20, - "damage": 3, - "speed": 4, - "scatterRate": 1, - "lifeLength": 3.2, - "absorbtionFactor": 1 - } - }, - { - "angle": 5.497787143782138, - "offset": 0, - "size": 60, - "width": 21, - "delay": 0, - "reload": 1.5, - "recoil": 0, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": "trapLauncher", - "forceFire": true, - "bullet": { - "type": "trap", - "sizeRatio": 0.8, - "health": 20, - "damage": 3, - "speed": 4, - "scatterRate": 1, - "lifeLength": 3.2, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 0 - }, - { - "name": "Reload", - "max": 0 - }, - { - "name": "Bullet Damage", - "max": 0 - }, - { - "name": "Bullet Penetration", - "max": 0 - }, - { - "name": "Bullet Speed", - "max": 0 - }, - { - "name": "Body Damage", - "max": 0 - }, - { - "name": "Max Health", - "max": 0 - }, - { - "name": "Health Regen", - "max": 0 - } - ] - }, - { - "id": 48, - "name": "Battleship", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 1.5707963267948966, - "offset": -20, - "size": 75, - "width": 29.4, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 3.141592653589793, - "addon": null, - "droneCount": 4294967295, - "canControlDrones": false, - "bullet": { - "type": "swarm", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.15, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 4.71238898038469, - "offset": -20, - "size": 75, - "width": 29.4, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 3.141592653589793, - "addon": null, - "droneCount": 4294967295, - "canControlDrones": false, - "bullet": { - "type": "swarm", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.15, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 1.5707963267948966, - "offset": 20, - "size": 75, - "width": 29.4, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 3.141592653589793, - "addon": null, - "droneCount": 4294967295, - "canControlDrones": true, - "bullet": { - "type": "swarm", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.15, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - }, - { - "angle": 4.71238898038469, - "offset": 20, - "size": 75, - "width": 29.4, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 3.141592653589793, - "addon": null, - "droneCount": 4294967295, - "canControlDrones": true, - "bullet": { - "type": "swarm", - "sizeRatio": 0.7, - "health": 1, - "damage": 0.15, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 49, - "name": "Annihilator", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 96.6, - "delay": 0, - "reload": 4, - "recoil": 17, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 2, - "damage": 3, - "speed": 0.7, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 0.05 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 50, - "name": "Auto Smasher", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "autosmasher", - "sides": 1, - "borderWidth": 15, - "barrels": [], - "stats": [ - { - "name": "Movement Speed", - "max": 10 - }, - { - "name": "Reload", - "max": 10 - }, - { - "name": "Bullet Damage", - "max": 10 - }, - { - "name": "Bullet Penetration", - "max": 10 - }, - { - "name": "Bullet Speed", - "max": 10 - }, - { - "name": "Body Damage", - "max": 10 - }, - { - "name": "Max Health", - "max": 10 - }, - { - "name": "Health Regen", - "max": 10 - } - ] - }, - { - "id": 51, - "name": "Spike", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "bodyDamage": 2, - "preAddon": null, - "postAddon": "spike", - "sides": 1, - "borderWidth": 15, - "barrels": [], - "stats": [ - { - "name": "Movement Speed", - "max": 10 - }, - { - "name": "Reload", - "max": 0 - }, - { - "name": "Bullet Damage", - "max": 0 - }, - { - "name": "Bullet Penetration", - "max": 0 - }, - { - "name": "Bullet Speed", - "max": 0 - }, - { - "name": "Body Damage", - "max": 10 - }, - { - "name": "Max Health", - "max": 10 - }, - { - "name": "Health Regen", - "max": 10 - } - ] - }, - { - "id": 52, - "name": "Factory", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 4, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 70, - "width": 42, - "delay": 0, - "reload": 3, - "recoil": 1, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "droneCount": 6, - "canControlDrones": true, - "bullet": { - "type": "minion", - "sizeRatio": 1, - "health": 4, - "damage": 0.7, - "speed": 0.56, - "scatterRate": 1, - "lifeLength": -1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Drone Damage", - "max": 7 - }, - { - "name": "Drone Health", - "max": 7 - }, - { - "name": "Drone Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 53, - "name": "", - "upgradeMessage": "", - "levelRequirement": 0, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": true - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 54, - "name": "Skimmer", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": "launcher", - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 71.39999999999999, - "delay": 0, - "reload": 4, - "recoil": 3, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "skimmer", - "sizeRatio": 1, - "health": 3, - "damage": 1, - "speed": 0.5, - "scatterRate": 1, - "lifeLength": 1.3, - "absorbtionFactor": 0.1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 55, - "name": "Rocketeer", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": "launcher", - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 52.5, - "delay": 0, - "reload": 4, - "recoil": 3, - "isTrapezoid": true, - "trapezoidDirection": 3.141592653589793, - "addon": null, - "bullet": { - "type": "rocket", - "sizeRatio": 1, - "health": 5, - "damage": 1, - "speed": 0.3, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 0.1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - null, - null, - { - "id": 58, - "name": "Auto Tank", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "autoturret", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - null, - { - "id": 60, - "name": "Dual-Barrel", - "upgradeMessage": "Right click to shoot your other barrel", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "shotpronounced", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 17, - "size": 95, - "width": 16.8, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "bullet": { - "type": "bullet", - "sizeRatio": 1.89947, - "health": 0.6, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 2.75, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.3 - } - }, - { - "angle": 0, - "offset": 17, - "size": 95, - "width": 16.8, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "bullet": { - "type": "bullet", - "sizeRatio": 1.89947, - "health": 0.6, - "damage": 0.5, - "speed": 1, - "scatterRate": 1.2, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.3 - } - }, - { - "angle": 0, - "offset": 17, - "size": 95, - "width": 16.8, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "bullet": { - "type": "bullet", - "sizeRatio": 1.89947, - "health": 0.6, - "damage": 0.5, - "speed": 0.9, - "scatterRate": 0.9, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.3 - } - }, - { - "angle": 0, - "offset": -17, - "size": 95, - "width": 16.8, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "rightClickFire": true, - "bullet": { - "type": "bullet", - "sizeRatio": 1.89947, - "health": 0.6, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 2.75, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.3 - } - }, - { - "angle": 0, - "offset": -17, - "size": 95, - "width": 16.8, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "rightClickFire": true, - "bullet": { - "type": "bullet", - "sizeRatio": 1.89947, - "health": 0.6, - "damage": 0.5, - "speed": 1, - "scatterRate": 1.2, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.3 - } - }, - { - "angle": 0, - "offset": -17, - "size": 95, - "width": 16.8, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "rightClickFire": true, - "bullet": { - "type": "bullet", - "sizeRatio": 1.89947, - "health": 0.6, - "damage": 0.5, - "speed": 0.9, - "scatterRate": 0.9, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.3 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 61, - "name": "Pellet Shot", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": "pelletlauncher", - "postAddon": "pelletpronounced", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0, - "reload": 4, - "recoil": 0.4, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 10, - "bullet": { - "type": "bullet", - "sizeRatio": 0.56, - "health": 0.2, - "damage": 0.65, - "speed": [1.08, 1.32], - "scatterRate": 3, - "lifeLength": 0.4, - "absorbtionFactor": 0.2, - "launchSpeed": [0.75, 2.25] - } - }, - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0, - "reload": 4, - "recoil": 0.4, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 10, - "bullet": { - "type": "bullet", - "sizeRatio": 0.63, - "health": 0.2, - "damage": 0.65, - "speed": [0.99, 1.21], - "scatterRate": 1.8, - "lifeLength": 0.4, - "absorbtionFactor": 0.2, - "launchSpeed": [0.75, 2.25] - } - }, - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0, - "reload": 4, - "recoil": 0.4, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 10, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 0.2, - "damage": 0.65, - "speed": [0.9, 1.1], - "scatterRate": 0.75, - "lifeLength": 0.4, - "absorbtionFactor": 0.2, - "launchSpeed": [0.75, 2.25] - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 62, - "name": "Shotgun", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 61, - 60 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "shotpronounced", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 90, - "width": 42, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 0.6, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 2.75, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.5 - } - }, - { - "angle": 0, - "offset": 0, - "size": 90, - "width": 42, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 0.6, - "damage": 0.5, - "speed": 1, - "scatterRate": 1.2, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.5 - } - }, - { - "angle": 0, - "offset": 0, - "size": 90, - "width": 42, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 0.6, - "damage": 0.5, - "speed": 0.9, - "scatterRate": 0.9, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.5 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 63, - "name": "Glider", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": "gliderlauncher", - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 56.7, - "delay": 0, - "reload": 4, - "recoil": 3, - "isTrapezoid": true, - "trapezoidDirection": 3.141592653589793, - "addon": null, - "bullet": { - "type": "glider", - "sizeRatio": 1, - "health": 3, - "damage": 1, - "speed": 0.5, - "scatterRate": 1, - "lifeLength": 1.3, - "absorbtionFactor": 0.1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 64, - "name": "Firework", - "upgradeMessage": "Right click to explode your bullets", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": "fireworklauncher", - "postAddon": "fireworkpronounced", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 33.6, - "delay": 0, - "reload": 4, - "recoil": 3.5, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "firework", - "sizeRatio": 1.59375, - "health": 4, - "damage": 0.7, - "speed": 0.4, - "scatterRate": 0.3, - "lifeLength": 1.2, - "absorbtionFactor": 0.1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - } -] diff --git a/src/Const/TankDefinitions.json b/src/Const/TankDefinitions.json index b86b2fb1..f0bce0e8 100644 --- a/src/Const/TankDefinitions.json +++ b/src/Const/TankDefinitions.json @@ -6640,728 +6640,5 @@ "max": 7 } ] - }, - null, - null, - { - "id": 58, - "name": "Auto Tank", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "autoturret", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 95, - "width": 42, - "delay": 0, - "reload": 1, - "recoil": 1, - "isTrapezoid": false, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "bullet", - "sizeRatio": 1, - "health": 1, - "damage": 1, - "speed": 1, - "scatterRate": 1, - "lifeLength": 1, - "absorbtionFactor": 1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - null, - { - "id": 60, - "name": "Dual-Barrel", - "upgradeMessage": "Right click to shoot your other barrel", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "shotpronounced", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 17, - "size": 95, - "width": 16.8, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "bullet": { - "type": "bullet", - "sizeRatio": 1.89947, - "health": 0.6, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 2.75, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.3 - } - }, - { - "angle": 0, - "offset": 17, - "size": 95, - "width": 16.8, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "bullet": { - "type": "bullet", - "sizeRatio": 1.89947, - "health": 0.6, - "damage": 0.5, - "speed": 1, - "scatterRate": 1.2, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.3 - } - }, - { - "angle": 0, - "offset": 17, - "size": 95, - "width": 16.8, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "bullet": { - "type": "bullet", - "sizeRatio": 1.89947, - "health": 0.6, - "damage": 0.5, - "speed": 0.9, - "scatterRate": 0.9, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.3 - } - }, - { - "angle": 0, - "offset": -17, - "size": 95, - "width": 16.8, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "rightClickFire": true, - "bullet": { - "type": "bullet", - "sizeRatio": 1.89947, - "health": 0.6, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 2.75, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.3 - } - }, - { - "angle": 0, - "offset": -17, - "size": 95, - "width": 16.8, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "rightClickFire": true, - "bullet": { - "type": "bullet", - "sizeRatio": 1.89947, - "health": 0.6, - "damage": 0.5, - "speed": 1, - "scatterRate": 1.2, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.3 - } - }, - { - "angle": 0, - "offset": -17, - "size": 95, - "width": 16.8, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "rightClickFire": true, - "bullet": { - "type": "bullet", - "sizeRatio": 1.89947, - "health": 0.6, - "damage": 0.5, - "speed": 0.9, - "scatterRate": 0.9, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.3 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 61, - "name": "Pellet Shot", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": "pelletlauncher", - "postAddon": "pelletpronounced", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0, - "reload": 4, - "recoil": 0.4, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 10, - "bullet": { - "type": "bullet", - "sizeRatio": 0.56, - "health": 0.2, - "damage": 0.65, - "speed": [1.08, 1.32], - "scatterRate": 3, - "lifeLength": 0.4, - "absorbtionFactor": 0.2, - "launchSpeed": [0.75, 2.25] - } - }, - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0, - "reload": 4, - "recoil": 0.4, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 10, - "bullet": { - "type": "bullet", - "sizeRatio": 0.63, - "health": 0.2, - "damage": 0.65, - "speed": [0.99, 1.21], - "scatterRate": 1.8, - "lifeLength": 0.4, - "absorbtionFactor": 0.2, - "launchSpeed": [0.75, 2.25] - } - }, - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 42, - "delay": 0, - "reload": 4, - "recoil": 0.4, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 10, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 0.2, - "damage": 0.65, - "speed": [0.9, 1.1], - "scatterRate": 0.75, - "lifeLength": 0.4, - "absorbtionFactor": 0.2, - "launchSpeed": [0.75, 2.25] - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 62, - "name": "Shotgun", - "upgradeMessage": "", - "levelRequirement": 30, - "upgrades": [ - 61, - 60 - ], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 1, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": null, - "postAddon": "shotpronounced", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 90, - "width": 42, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 0.6, - "damage": 0.5, - "speed": 1.1, - "scatterRate": 2.75, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.5 - } - }, - { - "angle": 0, - "offset": 0, - "size": 90, - "width": 42, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 0.6, - "damage": 0.5, - "speed": 1, - "scatterRate": 1.2, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.5 - } - }, - { - "angle": 0, - "offset": 0, - "size": 90, - "width": 42, - "delay": 0, - "reload": 4, - "recoil": 0.6, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bulletsPerShot": 4, - "bullet": { - "type": "bullet", - "sizeRatio": 0.7, - "health": 0.6, - "damage": 0.5, - "speed": 0.9, - "scatterRate": 0.9, - "lifeLength": 0.6, - "absorbtionFactor": 0.5, - "launchSpeed": 1.5 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 63, - "name": "Glider", - "upgradeMessage": "", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": "gliderlauncher", - "postAddon": null, - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 56.7, - "delay": 0, - "reload": 4, - "recoil": 3, - "isTrapezoid": true, - "trapezoidDirection": 3.141592653589793, - "addon": null, - "bullet": { - "type": "glider", - "sizeRatio": 1, - "health": 3, - "damage": 1, - "speed": 0.5, - "scatterRate": 1, - "lifeLength": 1.3, - "absorbtionFactor": 0.1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] - }, - { - "id": 64, - "name": "Firework", - "upgradeMessage": "Right click to explode your bullets", - "levelRequirement": 45, - "upgrades": [], - "flags": { - "invisibility": false, - "zoomAbility": false, - "canClaimSquares": false, - "devOnly": false - }, - "visibilityRateShooting": 0.23, - "visibilityRateMoving": 0.08, - "invisibilityRate": 0.03, - "fieldFactor": 0.9, - "absorbtionFactor": 1, - "speed": 1, - "maxHealth": 50, - "preAddon": "fireworklauncher", - "postAddon": "fireworkpronounced", - "sides": 1, - "borderWidth": 15, - "barrels": [ - { - "angle": 0, - "offset": 0, - "size": 80, - "width": 33.6, - "delay": 0, - "reload": 4, - "recoil": 3.5, - "isTrapezoid": true, - "trapezoidDirection": 0, - "addon": null, - "bullet": { - "type": "firework", - "sizeRatio": 1.59375, - "health": 4, - "damage": 0.7, - "speed": 0.4, - "scatterRate": 0.3, - "lifeLength": 1.2, - "absorbtionFactor": 0.1 - } - } - ], - "stats": [ - { - "name": "Movement Speed", - "max": 7 - }, - { - "name": "Reload", - "max": 7 - }, - { - "name": "Bullet Damage", - "max": 7 - }, - { - "name": "Bullet Penetration", - "max": 7 - }, - { - "name": "Bullet Speed", - "max": 7 - }, - { - "name": "Body Damage", - "max": 7 - }, - { - "name": "Max Health", - "max": 7 - }, - { - "name": "Health Regen", - "max": 7 - } - ] } ] diff --git a/src/Entity/Tank/Addons.ts b/src/Entity/Tank/Addons.ts index 907f96b6..7e52043a 100644 --- a/src/Entity/Tank/Addons.ts +++ b/src/Entity/Tank/Addons.ts @@ -341,158 +341,6 @@ class PronouncedDomAddon extends Addon { } } -/** The thing above shotguns's and dual-barrel's barrels. */ -class ShotPronouncedAddon extends Addon { - public constructor(owner: BarrelBase) { - super(owner); - - const pronounce = new ObjectEntity(this.game); - const sizeRatio = 75 / 50; - const widthRatio = 42 * 1.19048 / 50; - const offsetRatio = 1 /20; - const size = this.owner.physicsData.values.size; - - pronounce.setParent(this.owner); - pronounce.relationsData.values.owner = this.owner; - pronounce.relationsData.values.team = this.owner.relationsData.values.team - - pronounce.physicsData.values.size = sizeRatio * size; - pronounce.physicsData.values.width = widthRatio * size; - pronounce.positionData.values.x = (pronounce.physicsData.values.size / 2) + (offsetRatio * size); - - pronounce.styleData.values.color = Color.Barrel; - pronounce.physicsData.values.flags |= PhysicsFlags.isTrapezoid; - pronounce.physicsData.values.sides = 2; - } -} - -/** The thing above pelletshot's barrels. */ -class PelletPronouncedAddon extends Addon { - public constructor(owner: BarrelBase) { - super(owner); - - const pronounce = new ObjectEntity(this.game); - const sizeRatio = 65 / 50; - const widthRatio = 42 * 1.19048 / 50; - const size = this.owner.physicsData.values.size; - - pronounce.setParent(this.owner); - pronounce.relationsData.values.owner = this.owner; - pronounce.relationsData.values.team = this.owner.relationsData.values.team - - pronounce.physicsData.values.size = sizeRatio * size; - pronounce.physicsData.values.width = widthRatio * size; - pronounce.positionData.values.x = pronounce.physicsData.values.size / 2; - - pronounce.styleData.values.color = Color.Barrel; - pronounce.physicsData.values.flags |= PhysicsFlags.isTrapezoid; - pronounce.physicsData.values.sides = 2; - } -} - -/** The thing underneath Pelletshot addon. */ -class PelletLauncherAddon extends Addon { - public constructor(owner: BarrelBase) { - super(owner); - - const launcher = new ObjectEntity(this.game); - const sizeRatio = 95 / 50; - const widthRatio = 42 * 0.809524 / 50; - const size = this.owner.physicsData.values.size; - - launcher.setParent(this.owner); - launcher.relationsData.values.owner = this.owner; - launcher.relationsData.values.team = this.owner.relationsData.values.team; - - launcher.physicsData.values.size = sizeRatio * size; - launcher.physicsData.values.width = widthRatio * size; - launcher.positionData.values.x = launcher.physicsData.values.size / 2; - - launcher.styleData.values.color = Color.Barrel; - launcher.physicsData.values.flags |= PhysicsFlags.isTrapezoid; - launcher.physicsData.values.sides = 2; - } -} - -/** The thing underneath Glider addon. */ -class GliderLauncherAddon extends Addon { - public constructor(owner: BarrelBase) { - super(owner); - - const launcher = new ObjectEntity(this.game); - const sizeRatio = 65.5 * Math.SQRT2 / 50; - const widthRatio = 33.6 / 50; - const size = this.owner.physicsData.values.size; - - launcher.setParent(this.owner); - launcher.relationsData.values.owner = this.owner; - launcher.relationsData.values.team = this.owner.relationsData.values.team; - - launcher.physicsData.values.size = sizeRatio * size; - launcher.physicsData.values.width = widthRatio * size; - launcher.positionData.values.x = launcher.physicsData.values.size / 2; - - launcher.styleData.values.color = Color.Barrel; - launcher.physicsData.values.flags |= PhysicsFlags.isTrapezoid; - launcher.physicsData.values.sides = 2; - launcher.positionData.values.angle = Math.PI; - } -} - -//Firework's values are a bit off mainly due to the trapezoid ratio being 3:4 for some ungodly reason instead of 4:7 and diep custom doesn't support custom ratios for trapezoids - -/** The thing above firework's barrel. */ -class FireworkPronouncedAddon extends Addon { - public constructor(owner: BarrelBase) { - super(owner); - - const pronounce = new ObjectEntity(this.game); - const sizeRatio = 45 / 50; - const widthRatio = 53.55 / 50; - const offsetRatio = 3 / 10; - const size = this.owner.physicsData.values.size; - - pronounce.setParent(this.owner); - pronounce.relationsData.values.owner = this.owner; - pronounce.relationsData.values.team = this.owner.relationsData.values.team - - pronounce.physicsData.values.size = sizeRatio * size; - pronounce.physicsData.values.width = widthRatio * size; - pronounce.positionData.values.x = (pronounce.physicsData.values.size / 2) + (offsetRatio * size); - pronounce.positionData.values.angle = Math.PI; - - pronounce.styleData.values.color = Color.Barrel; - pronounce.physicsData.values.flags |= PhysicsFlags.isTrapezoid; - pronounce.physicsData.values.sides = 2; - pronounce.positionData.values.angle = Math.PI; - } -} - -/** The thing underneath Firework addon. */ -class FireworkLauncherAddon extends Addon { - public constructor(owner: BarrelBase) { - super(owner); - - const launcher = new ObjectEntity(this.game); - const sizeRatio = 80 / 50; - const widthRatio = 29.4 / 50; - const offsetRatio = 3 / 10; - const size = this.owner.physicsData.values.size; - - launcher.setParent(this.owner); - launcher.relationsData.values.owner = this.owner; - launcher.relationsData.values.team = this.owner.relationsData.values.team; - - launcher.physicsData.values.size = sizeRatio * size; - launcher.physicsData.values.width = widthRatio * size; - launcher.positionData.values.x = (launcher.physicsData.values.size / 2) + (offsetRatio * size); - - launcher.styleData.values.color = Color.Barrel; - launcher.physicsData.values.flags |= PhysicsFlags.isTrapezoid; - launcher.physicsData.values.sides = 2; - } -} - /** Weird spike addon. Based on the arrasio Original. */ class WeirdSpikeAddon extends Addon { public constructor(owner: BarrelBase) { @@ -578,13 +426,6 @@ export const AddonById: Record = { smasher: SmasherAddon, landmine: LandmineAddon, autoturret: AutoTurretAddon, - // a part of post 2018 diep - shotpronounced: ShotPronouncedAddon, - pelletpronounced: PelletPronouncedAddon, - pelletlauncher: PelletLauncherAddon, - gliderlauncher: GliderLauncherAddon, - fireworkpronounced: FireworkPronouncedAddon, - fireworklauncher: FireworkLauncherAddon, // not part of diep weirdspike: WeirdSpikeAddon, auto7: Auto7Addon, diff --git a/src/Entity/Tank/Projectile/Glider.ts b/src/Entity/Tank/Projectile/Glider.ts deleted file mode 100644 index 6868d85a..00000000 --- a/src/Entity/Tank/Projectile/Glider.ts +++ /dev/null @@ -1,105 +0,0 @@ -/* - DiepCustom - custom tank game server that shares diep.io's WebSocket protocol - Copyright (C) 2022 ABCxFF (github.com/ABCxFF) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see -*/ - -import Barrel from "../Barrel"; -import Bullet from "./Bullet"; - -import { InputFlags } from "../../../Const/Enums"; -import { BarrelDefinition, TankDefinition } from "../../../Const/TankDefinitions"; -import { Inputs } from "../../AI"; -import { BarrelBase } from "../TankBody"; -import { CameraEntity } from "../../../Native/Camera"; -import { PI2 } from "../../../util"; - -/** - * Barrel definition for the rocketeer rocket's barrel. - */ -const GliderBarrelDefinition: BarrelDefinition = { - angle: Math.PI * 1.2, - offset: 0, - size: 70, - width: 43.02984, - delay: 0.5, - reload: 0.75, - recoil: 3.2, - isTrapezoid: false, - trapezoidDirection: 0, - addon: null, - bullet: { - type: "bullet", - health: 0.6, - damage: 0.6, - speed: 0.7, - scatterRate: 1, - lifeLength: 0.5, - sizeRatio: 1, - absorbtionFactor: 1 - } -}; - -/** - * Represents all glider rockets in game. - */ -export default class Glider extends Bullet implements BarrelBase { - /** glider's barrels */ - private gliderBarrels: Barrel[]; - - /** The camera entity (used as team) of the glider. */ - public cameraEntity: CameraEntity; - /** The reload time of the glider's barrel. */ - public reloadTime = 15; - /** The inputs for when to shoot or not. (glider) */ - public inputs: Inputs; - - - public constructor(barrel: Barrel, tank: BarrelBase, tankDefinition: TankDefinition | null, shootAngle: number) { - super(barrel, tank, tankDefinition, shootAngle); - - this.cameraEntity = tank.cameraEntity; - - const gliderBarrels: Barrel[] = this.gliderBarrels =[]; - - const s1 = new Barrel(this, {...GliderBarrelDefinition}); - const s2Definition = {...GliderBarrelDefinition}; - s2Definition.angle -= PI2/5 - const s2 = new Barrel(this, s2Definition); - - s1.styleData.values.color = this.styleData.values.color; - s1.scale(this.sizeFactor); - s2.styleData.values.color = this.styleData.values.color; - s2.scale(this.sizeFactor); - - gliderBarrels.push(s1, s2); - - this.inputs = new Inputs(); - this.inputs.flags |= InputFlags.leftclick; - } - - public get sizeFactor() { - return this.physicsData.values.size / 50; - } - - public tick(tick: number) { - this.reloadTime = this.tank.reloadTime; - super.tick(tick); - - if (this.deletionAnimation) return; - // Only accurate on current version, but we dont want that - // if (!Entity.exists(this.barrelEntity.rootParent) && (this.inputs.flags & InputFlags.leftclick)) this.inputs.flags ^= InputFlags.leftclick; - } -} diff --git a/src/Entity/Tank/Projectile/Shell.ts b/src/Entity/Tank/Projectile/Shell.ts deleted file mode 100644 index 6d29fb65..00000000 --- a/src/Entity/Tank/Projectile/Shell.ts +++ /dev/null @@ -1,243 +0,0 @@ -/* - DiepCustom - custom tank game server that shares diep.io's WebSocket protocol - Copyright (C) 2022 ABCxFF (github.com/ABCxFF) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see -*/ - -import Barrel from "../Barrel"; -import Bullet from "./Bullet"; - -import { InputFlags } from "../../../Const/Enums"; -import { BarrelDefinition, TankDefinition } from "../../../Const/TankDefinitions"; -import { Inputs } from "../../AI"; -import { BarrelBase } from "../TankBody"; -import { CameraEntity } from "../../../Native/Camera"; -import { PI2 } from "../../../util"; - -/** - * Barrel definition for the firework shell's back barrel. - */ -const ShellBackBarrelDefinition: BarrelDefinition = { - angle: Math.PI, - offset: 0, - size: 63.9214, - width: 35.7, - delay: 0.5, - reload: 0.5, - recoil: 5.6, - isTrapezoid: false, - trapezoidDirection: 0, - addon: null, - bullet: { - type: "bullet", - health: 0.3, - damage: 0.6, - speed: 0.5, - scatterRate: 0.2, - lifeLength: 0.2, - sizeRatio: 1, - absorbtionFactor: 1, - launchSpeed: 1.5, - } -}; - -const ShellBurstBarrelDefinition1: BarrelDefinition = { - angle: -Math.PI + Math.PI/6, - offset: 0, - size: 0, - width: 35.7, - delay: 0, - reload: 20, - recoil: 0, - isTrapezoid: false, - trapezoidDirection: 0, - addon: null, - rightClickFire: true, - bullet: { - type: "bullet", - health: 0.4, - damage: 0.6, - speed: 0.4, - scatterRate: 0.5, - lifeLength: 0.16, - sizeRatio: 1, - absorbtionFactor: 0.25, - launchSpeed: 0.6 - } -}; - -const ShellBurstBarrelDefinition2: BarrelDefinition = { - angle: -Math.PI, - offset: 0, - size: 0, - width: 35.7, - delay: 0, - reload: 20, - recoil: 0, - isTrapezoid: false, - trapezoidDirection: 0, - addon: null, - rightClickFire: true, - bullet: { - type: "bullet", - health: 0.4, - damage: 0.6, - speed: 0.6, - scatterRate: 0.5, - lifeLength: 0.16, - sizeRatio: 1, - absorbtionFactor: 0.25, - launchSpeed: 0.8 - } -}; - -const ShellBurstBarrelDefinition3: BarrelDefinition = { - angle: -Math.PI + Math.PI/6, - offset: 0, - size: 0, - width: 35.7, - delay: 0, - reload: 20, - recoil: 0, - isTrapezoid: false, - trapezoidDirection: 0, - addon: null, - rightClickFire: true, - bullet: { - type: "bullet", - health: 0.4, - damage: 0.6, - speed: 0.8, - scatterRate: 0.5, - lifeLength: 0.16, - sizeRatio: 1, - absorbtionFactor: 0.25, - launchSpeed: 1 - } -}; - -const ShellBurstBarrelDefinition4: BarrelDefinition = { - angle: -Math.PI, - offset: 0, - size: 0, - width: 35.7, - delay: 0, - reload: 20, - recoil: 0, - isTrapezoid: false, - trapezoidDirection: 0, - addon: null, - rightClickFire: true, - bullet: { - type: "bullet", - health: 0.4, - damage: 0.6, - speed: 0.2, - scatterRate: 0.5, - lifeLength: 0.16, - sizeRatio: 1, - absorbtionFactor: 0.25, - launchSpeed: 0.4 - } -}; - -/** - * Represents all firework shells in game. - */ -export default class Shell extends Bullet implements BarrelBase { - /** shells's barrels */ - private shellBarrels: Barrel[]; - - /** The camera entity (used as team) of the shells. */ - public cameraEntity: CameraEntity; - /** The reload time of the shells's barrel. */ - public reloadTime = 15; - /** The inputs for when to shoot or not. (shells) */ - public inputs: Inputs; - /** Whether or not the shell has expoded */ - public hasBursted: Boolean; - - public constructor(barrel: Barrel, tank: BarrelBase, tankDefinition: TankDefinition | null, shootAngle: number) { - super(barrel, tank, tankDefinition, shootAngle); - - this.cameraEntity = tank.cameraEntity; - - this.physicsData.values.sides = 6; - - this.hasBursted = false; - - const shellBarrels: Barrel[] = this.shellBarrels =[]; - - const f1 = new Barrel(this, {...ShellBackBarrelDefinition}); - - f1.styleData.values.color = this.styleData.values.color; - f1.scale(this.sizeFactor); - shellBarrels.push(f1); - - //Now for the explosion barrels. - for (let i = 0; i < 6; ++i) { - let offset = PI2/6 * i - 1 - - let s1Definition = {...ShellBurstBarrelDefinition1}; - s1Definition.angle += offset - let s1 = new Barrel(this, {...s1Definition}); - s1.styleData.values.color = this.styleData.values.color; - s1.scale(this.sizeFactor); - - let s2Definition = {...ShellBurstBarrelDefinition2}; - s2Definition.angle += offset - let s2 = new Barrel(this, {...s2Definition}); - s2.styleData.values.color = this.styleData.values.color; - s2.scale(this.sizeFactor); - - let s3Definition = {...ShellBurstBarrelDefinition3}; - s3Definition.angle += offset - let s3 = new Barrel(this, {...s3Definition}); - s3.styleData.values.color = this.styleData.values.color; - s3.scale(this.sizeFactor); - - let s4Definition = {...ShellBurstBarrelDefinition4}; - s4Definition.angle += offset - let s4 = new Barrel(this, {...s4Definition}); - s4.styleData.values.color = this.styleData.values.color; - s4.scale(this.sizeFactor); - - shellBarrels.push(s1, s2, s3, s4); - } - - this.inputs = new Inputs(); - this.inputs.flags |= InputFlags.leftclick; - } - - public get sizeFactor() { - return this.physicsData.values.size * Math.SQRT2 / 50; - } - - public tick(tick: number) { - this.reloadTime = this.tank.reloadTime; - if(!this.hasBursted && this.tank.inputs.attemptingRepel() && tick >= this.spawnTick + 10) { - this.hasBursted = true - this.inputs.flags |= InputFlags.rightclick; - } - super.tick(tick); - - if (this.deletionAnimation) return; - if(this.hasBursted) { - this.destroy(true); - } - // Only accurate on current version, but we dont want that - // if (!Entity.exists(this.barrelEntity.rootParent) && (this.inputs.flags & InputFlags.leftclick)) this.inputs.flags ^= InputFlags.leftclick; - } -} From 01ddf4f85caebd82707a93e92b3b4a38715e4dfa Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Sun, 20 Sep 2026 11:33:32 -0400 Subject: [PATCH 05/18] fixes --- src/Const/TankDefinitions.json | 126 ++++++++++++++++----------------- src/Const/TankDefinitions.ts | 6 +- src/Entity/Tank/Barrel.ts | 8 --- 3 files changed, 64 insertions(+), 76 deletions(-) diff --git a/src/Const/TankDefinitions.json b/src/Const/TankDefinitions.json index f0bce0e8..570eda15 100644 --- a/src/Const/TankDefinitions.json +++ b/src/Const/TankDefinitions.json @@ -9,8 +9,7 @@ 6, 7, 8, - 36, - 58 + 36 ], "flags": { "invisibility": false, @@ -884,7 +883,7 @@ "sizeRatio": 1, "health": 1, "damage": 1, - "speed": 1.4, + "speed": 1.5, "scatterRate": 0.3, "lifeLength": 1, "absorbtionFactor": 1 @@ -934,8 +933,7 @@ "upgrades": [ 10, 20, - 29, - 62 + 29 ], "flags": { "invisibility": false, @@ -1178,7 +1176,7 @@ "width": 42, "delay": 0.5, "reload": 1, - "recoil": 2.4, + "recoil": 2.5, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1186,10 +1184,10 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.15, + "damage": 0.2, "speed": 1, "scatterRate": 1, - "lifeLength": 0.25, + "lifeLength": 0.5, "absorbtionFactor": 1 } }, @@ -1198,9 +1196,9 @@ "offset": 0, "size": 80, "width": 42, - "delay": 0.4, + "delay": 0.5, "reload": 1, - "recoil": 2.4, + "recoil": 2.5, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1208,10 +1206,10 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.15, + "damage": 0.2, "speed": 1, "scatterRate": 1, - "lifeLength": 0.25, + "lifeLength": 0.5, "absorbtionFactor": 1 } } @@ -1260,9 +1258,7 @@ 25, 49, 54, - 55, - 63, - 64 + 55 ], "flags": { "invisibility": false, @@ -1652,8 +1648,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, + "health": 1, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1674,8 +1670,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, + "health": 1, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1696,8 +1692,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, + "health": 1, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1718,8 +1714,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, + "health": 1, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1791,9 +1787,9 @@ "offset": 0, "size": 80, "width": 42, - "delay": 0, + "delay": 0.66, "reload": 1, - "recoil": 0.5, + "recoil": 0.7, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1801,7 +1797,7 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.5, + "damage": 0.55, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1813,9 +1809,9 @@ "offset": 0, "size": 80, "width": 42, - "delay": 0, + "delay": 0.66, "reload": 1, - "recoil": 0.5, + "recoil": 0.7, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1823,7 +1819,7 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.5, + "damage": 0.55, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1835,9 +1831,9 @@ "offset": 0, "size": 95, "width": 42, - "delay": 0, + "delay": 0.33, "reload": 1, - "recoil": 0.5, + "recoil": 0.7, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1845,7 +1841,7 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.5, + "damage": 0.55, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1857,9 +1853,9 @@ "offset": 0, "size": 95, "width": 42, - "delay": 0, + "delay": 0.33, "reload": 1, - "recoil": 0.5, + "recoil": 0.7, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1867,7 +1863,7 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.5, + "damage": 0.55, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1881,7 +1877,7 @@ "width": 42, "delay": 0, "reload": 1, - "recoil": 0.5, + "recoil": 0.7, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1889,7 +1885,7 @@ "type": "bullet", "sizeRatio": 1, "health": 1, - "damage": 0.5, + "damage": 0.55, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -1950,7 +1946,7 @@ "visibilityRateShooting": 0.23, "visibilityRateMoving": 0.08, "invisibilityRate": 0.03, - "fieldFactor": 0.75, + "fieldFactor": 0.8, "absorbtionFactor": 1, "speed": 1, "maxHealth": 50, @@ -1966,7 +1962,7 @@ "width": 42, "delay": 0, "reload": 2, - "recoil": 4, + "recoil": 3, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -1976,7 +1972,7 @@ "health": 1, "damage": 1, "speed": 1.5, - "scatterRate": 0.2, + "scatterRate": 0.3, "lifeLength": 1, "absorbtionFactor": 1 } @@ -2141,7 +2137,7 @@ "sizeRatio": 1, "health": 2, "damage": 0.42, - "speed": 0.76, + "speed": 0.72, "scatterRate": 1, "lifeLength": -1, "absorbtionFactor": 1 @@ -2165,7 +2161,7 @@ "sizeRatio": 1, "health": 2, "damage": 0.42, - "speed": 0.76, + "speed": 0.72, "scatterRate": 1, "lifeLength": -1, "absorbtionFactor": 1 @@ -2245,8 +2241,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, + "health": 1, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -2267,8 +2263,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, + "health": 1, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -2289,8 +2285,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, + "health": 1, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -2311,8 +2307,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, + "health": 1, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -2333,8 +2329,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, + "health": 1, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -2355,8 +2351,8 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.9, - "damage": 0.6, + "health": 1, + "damage": 0.5, "speed": 1, "scatterRate": 1, "lifeLength": 1, @@ -2548,7 +2544,7 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.5, + "health": 0.45, "damage": 0.5, "speed": 1.1, "scatterRate": 1, @@ -2570,7 +2566,7 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.5, + "health": 0.45, "damage": 0.5, "speed": 1.1, "scatterRate": 1, @@ -2592,7 +2588,7 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.5, + "health": 0.45, "damage": 0.5, "speed": 1.1, "scatterRate": 1, @@ -2614,7 +2610,7 @@ "bullet": { "type": "bullet", "sizeRatio": 1, - "health": 0.5, + "health": 0.45, "damage": 0.5, "speed": 1.1, "scatterRate": 1, @@ -2673,7 +2669,7 @@ "visibilityRateShooting": 0.23, "visibilityRateMoving": 0.08, "invisibilityRate": 0.03, - "fieldFactor": 0.75, + "fieldFactor": 0.8, "absorbtionFactor": 1, "speed": 1, "maxHealth": 50, @@ -2689,7 +2685,7 @@ "width": 42, "delay": 0, "reload": 2, - "recoil": 4, + "recoil": 3, "isTrapezoid": true, "trapezoidDirection": 3.141592653589793, "addon": null, @@ -2699,7 +2695,7 @@ "health": 1, "damage": 1, "speed": 1.5, - "scatterRate": 0.1, + "scatterRate": 0.3, "lifeLength": 1, "absorbtionFactor": 1 } @@ -2755,7 +2751,7 @@ "visibilityRateShooting": 0.23, "visibilityRateMoving": 0.08, "invisibilityRate": 0.03, - "fieldFactor": 0.65, + "fieldFactor": 0.7, "absorbtionFactor": 1, "speed": 1, "maxHealth": 50, @@ -2771,7 +2767,7 @@ "width": 42, "delay": 0, "reload": 2, - "recoil": 4, + "recoil": 3, "isTrapezoid": false, "trapezoidDirection": 0, "addon": null, @@ -2781,7 +2777,7 @@ "health": 1, "damage": 1, "speed": 1.5, - "scatterRate": 0, + "scatterRate": 0.3, "lifeLength": 1, "absorbtionFactor": 1 } @@ -6641,4 +6637,4 @@ } ] } -] +] \ No newline at end of file diff --git a/src/Const/TankDefinitions.ts b/src/Const/TankDefinitions.ts index aa34e026..ba47d777 100644 --- a/src/Const/TankDefinitions.ts +++ b/src/Const/TankDefinitions.ts @@ -21,14 +21,14 @@ import { Tank, Color } from "./Enums"; import _TankDefinitions from "./TankDefinitions.json"; /** The types of post addons that exist in the game, by their id. */ -export type postAddonId = "dompronounced" | "auto5" | "auto3" | "autosmasher" | "spike" | "pronounced" | "smasher" | "landmine" | "autoturret" | "shotpronounced" | "pelletpronounced" | "fireworkpronounced" | "weirdspike" | "auto2" | "auto7" | "autorocket" | "spiesk" +export type postAddonId = "dompronounced" | "auto5" | "auto3" | "autosmasher" | "spike" | "pronounced" | "smasher" | "landmine" | "autoturret" | "weirdspike" | "auto2" | "auto7" | "autorocket" | "spiesk" /** The types of post addons that exist in the game, by their id. */ -export type preAddonId = "dombase" | "launcher" | "pelletlauncher" | "gliderlauncher" | "fireworklauncher" +export type preAddonId = "dombase" | "launcher" /** A joint list of all post addon ids and pre addon ids. */ export type addonId = preAddonId | postAddonId; /** The types of projectiles in the game */ -export type projectileId = "bullet" | "drone" | "trap" | "necrodrone" | "minion" | "skimmer" | "rocket" | "swarm" | "glider" | "firework" | "flame" | "wall" | "croc"; +export type projectileId = "bullet" | "drone" | "trap" | "necrodrone" | "minion" | "skimmer" | "rocket" | "swarm" | "flame" | "wall" | "croc"; /** The types of barrel addons that exist in the game */ export type barrelAddonId = "trapLauncher" | "purplebarrel"; diff --git a/src/Entity/Tank/Barrel.ts b/src/Entity/Tank/Barrel.ts index 94fc3e35..3e416f19 100644 --- a/src/Entity/Tank/Barrel.ts +++ b/src/Entity/Tank/Barrel.ts @@ -37,8 +37,6 @@ import CrocSkimmer from "./Projectile/CrocSkimmer"; import { BarrelAddon, BarrelAddonById } from "./BarrelAddons"; import { Swarm } from "./Projectile/Swarm"; import NecromancerSquare from "./Projectile/NecromancerSquare"; -import Glider from "./Projectile/Glider"; -import Shell from "./Projectile/Shell"; /** * Class that determines when barrels can shoot, and when they can't. @@ -167,12 +165,6 @@ export default class Barrel extends ObjectEntity { let projectile: ObjectEntity | null = null; switch (this.definition.bullet.type) { - case "firework": - new Shell(this, this.tank, tankDefinition, angle); - break; - case "glider": - new Glider(this, this.tank, tankDefinition, angle); - break; case "skimmer": projectile = new Skimmer(this, this.tank, tankDefinition, angle, this.tank.inputs.attemptingRepel() ? -Skimmer.BASE_ROTATION : Skimmer.BASE_ROTATION); break; From 94741bcf909b47897dcae3daccef62b8ea1849e4 Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Tue, 22 Sep 2026 13:13:06 -0400 Subject: [PATCH 06/18] Update TankDefinitions.json --- src/Const/TankDefinitions.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Const/TankDefinitions.json b/src/Const/TankDefinitions.json index 570eda15..80c55127 100644 --- a/src/Const/TankDefinitions.json +++ b/src/Const/TankDefinitions.json @@ -6637,4 +6637,3 @@ } ] } -] \ No newline at end of file From 937e27ef1d13224adeb6c9a6cd307c0ca9872d06 Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Tue, 22 Sep 2026 13:13:45 -0400 Subject: [PATCH 07/18] Update TankDefinitions.json --- src/Const/TankDefinitions.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Const/TankDefinitions.json b/src/Const/TankDefinitions.json index 80c55127..5350f193 100644 --- a/src/Const/TankDefinitions.json +++ b/src/Const/TankDefinitions.json @@ -6637,3 +6637,4 @@ } ] } +] From 13c2adf0cb1013caeba10802d7cd3cfbe3378a95 Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Tue, 22 Sep 2026 17:26:48 -0400 Subject: [PATCH 08/18] Update TankDefinitions.ts --- src/Const/TankDefinitions.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Const/TankDefinitions.ts b/src/Const/TankDefinitions.ts index ba47d777..3a2a46ed 100644 --- a/src/Const/TankDefinitions.ts +++ b/src/Const/TankDefinitions.ts @@ -43,11 +43,11 @@ export interface BulletDefinition { /** The type of the bullet that the barrel shoots. */ type: projectileId; /** Size of the bullet shot out of the barrel in relation to the barrel's size. Can be an Array of 2 Values.*/ - sizeRatio: number| number[]; + sizeRatio: number | number[]; /** Used to calculate the health of the bullet that the barrel shoots. Can be an Array of 2 Values.*/ - health: number| number[]; + health: number | number[]; /** Used to calculate the damage of the bullet that the barrel shoots. Can be an Array of 2 Values.*/ - damage: number| number[]; + damage: number | number[]; /** Used to calculate the speed of the bullet that the barrel shoots. Can be an Array of 2 Values.*/ speed: number | number[]; /** Used to calculate the scattering rate / spread of the bullets. */ From 2e77ec92c3190f2846090e2e945b84bb4fcb620c Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Thu, 24 Sep 2026 12:32:19 -0400 Subject: [PATCH 09/18] undid randomized values --- src/Const/TankDefinitions.ts | 28 +++++++++---------- src/Entity/Boss/FallenBooster.ts | 2 +- src/Entity/Tank/Addons.ts | 4 +-- src/Entity/Tank/Barrel.ts | 3 +- src/Entity/Tank/Projectile/Bullet.ts | 24 ++++++---------- src/Entity/Tank/Projectile/Drone.ts | 11 +++----- src/Entity/Tank/Projectile/Flame.ts | 7 ++--- .../Tank/Projectile/NecromancerSquare.ts | 6 ++-- src/Entity/Tank/Projectile/Trap.ts | 5 ++-- 9 files changed, 36 insertions(+), 54 deletions(-) diff --git a/src/Const/TankDefinitions.ts b/src/Const/TankDefinitions.ts index 3a2a46ed..cf5516d3 100644 --- a/src/Const/TankDefinitions.ts +++ b/src/Const/TankDefinitions.ts @@ -42,26 +42,26 @@ export const visibilityRateDamage = 0.2; export interface BulletDefinition { /** The type of the bullet that the barrel shoots. */ type: projectileId; - /** Size of the bullet shot out of the barrel in relation to the barrel's size. Can be an Array of 2 Values.*/ - sizeRatio: number | number[]; - /** Used to calculate the health of the bullet that the barrel shoots. Can be an Array of 2 Values.*/ - health: number | number[]; - /** Used to calculate the damage of the bullet that the barrel shoots. Can be an Array of 2 Values.*/ - damage: number | number[]; - /** Used to calculate the speed of the bullet that the barrel shoots. Can be an Array of 2 Values.*/ - speed: number | number[]; + /** Size of the bullet shot out of the barrel in relation to the barrel's size.*/ + sizeRatio: number; + /** Used to calculate the health of the bullet that the barrel shoots.*/ + health: number; + /** Used to calculate the damage of the bullet that the barrel shoots.*/ + damage: number; + /** Used to calculate the speed of the bullet that the barrel shoots.*/ + speed: number; /** Used to calculate the scattering rate / spread of the bullets. */ scatterRate: number; - /** Used to calculate the life length of a bullet that the barrel shoots. Can be an Array of 2 Values.*/ - lifeLength: number | number[]; - /** Knockback factor field of the bullet. Can be an Array of 2 Values.*/ - absorbtionFactor: number | number[]; + /** Used to calculate the life length of a bullet that the barrel shoots.*/ + lifeLength: number; + /** Knockback factor field of the bullet.*/ + absorbtionFactor: number; /** Projectile color - by default this is set to parent's body color. */ color?: Color; /** Overrides number of sides for projectile. */ sides?: number; - /** Used to calculate the initial burst of speed of the bullet that the barrel shoots. Can be an Array of 2 Values.*/ - launchSpeed?: number | number[]; + /** Used to calculate the initial burst of speed of the bullet that the barrel shoots.*/ + launchSpeed?: number; } /** diff --git a/src/Entity/Boss/FallenBooster.ts b/src/Entity/Boss/FallenBooster.ts index 817d1f41..7f94b069 100644 --- a/src/Entity/Boss/FallenBooster.ts +++ b/src/Entity/Boss/FallenBooster.ts @@ -38,7 +38,7 @@ export default class FallenBooster extends AbstractBoss { for (const barrelDefinition of TankDefinitions[Tank.Booster].barrels) { const def = Object.assign({}, barrelDefinition, {}); - def.bullet = Object.assign({}, def.bullet, { speed: 1.7, health: 6.25, damage:def.bullet.damage as number * 0.8 }); + def.bullet = Object.assign({}, def.bullet, { speed: 1.7, health: 6.25, damage:def.bullet.damage * 0.8 }); this.barrels.push(new Barrel(this, def)); } this.scale(Math.pow(1.01, 75 - 1)); // Level 75 size diff --git a/src/Entity/Tank/Addons.ts b/src/Entity/Tank/Addons.ts index 7e52043a..8966a1b5 100644 --- a/src/Entity/Tank/Addons.ts +++ b/src/Entity/Tank/Addons.ts @@ -297,7 +297,7 @@ class PronouncedAddon extends Addon { const pronounce = new ObjectEntity(this.game); const sizeRatio = 50 / 50; const widthRatio = 42 / 50; - const offsetRatio = 3 / 10; + const offsetRatio = 40 / 50; const size = this.owner.physicsData.values.size; pronounce.setParent(this.owner); @@ -306,7 +306,7 @@ class PronouncedAddon extends Addon { pronounce.physicsData.values.size = sizeRatio * size; pronounce.physicsData.values.width = widthRatio * size; - pronounce.positionData.values.x = (pronounce.physicsData.values.size / 2) + (offsetRatio * size); + pronounce.positionData.values.x = offsetRatio * size; pronounce.positionData.values.angle = Math.PI; pronounce.styleData.values.color = Color.Barrel; diff --git a/src/Entity/Tank/Barrel.ts b/src/Entity/Tank/Barrel.ts index 3e416f19..a70370ad 100644 --- a/src/Entity/Tank/Barrel.ts +++ b/src/Entity/Tank/Barrel.ts @@ -219,13 +219,12 @@ export default class Barrel extends ObjectEntity { public calculateStatData() { const reloadTime = this.tank.reloadTime * this.definition.reload; - const bulletSpeed = (this.definition.bullet.speed instanceof Array) ? util.randomRange(this.definition.bullet.speed[0], this.definition.bullet.speed[1]) : this.definition.bullet.speed; if (reloadTime !== this.shootCycle.reloadTime) { this.shootCycle.pos *= reloadTime / this.shootCycle.reloadTime; this.shootCycle.reloadTime = this.barrelData.reloadTime = reloadTime; } - this.bulletAccel = (20 + (this.tank.cameraEntity.cameraData?.values.statLevels.values[Stat.BulletSpeed] || 0) * 3) * bulletSpeed; + this.bulletAccel = (20 + (this.tank.cameraEntity.cameraData?.values.statLevels.values[Stat.BulletSpeed] || 0) * 3) * this.definition.bullet.speed; } public tick(tick: number) { diff --git a/src/Entity/Tank/Projectile/Bullet.ts b/src/Entity/Tank/Projectile/Bullet.ts index 3d0b5ddd..5f9f6d52 100644 --- a/src/Entity/Tank/Projectile/Bullet.ts +++ b/src/Entity/Tank/Projectile/Bullet.ts @@ -23,7 +23,6 @@ import { HealthFlags, PositionFlags, PhysicsFlags, Stat, StyleFlags } from "../. import { TankDefinition } from "../../../Const/TankDefinitions"; import { BarrelBase } from "../TankBody"; import { EntityStateFlags } from "../../../Native/Entity"; -import { randomRange } from "../../../util"; /** * The bullet class represents the bullet entity in diep. @@ -69,39 +68,32 @@ export default class Bullet extends LivingEntity { const scaleFactor = tank.scaleFactor; const statLevels = tank.cameraEntity.cameraData?.values.statLevels.values; - - const launchSpeed = (bulletDefinition.launchSpeed instanceof Array) ? randomRange(bulletDefinition.launchSpeed[0], bulletDefinition.launchSpeed[1]) : bulletDefinition.launchSpeed ?? 1; - const absorbtionFactor = (bulletDefinition.absorbtionFactor instanceof Array) ? randomRange(bulletDefinition.absorbtionFactor[0], bulletDefinition.absorbtionFactor[1]) : bulletDefinition.absorbtionFactor; - const damage = (bulletDefinition.damage instanceof Array) ? randomRange(bulletDefinition.damage[0], bulletDefinition.damage[1]) : bulletDefinition.damage; - const health = (bulletDefinition.health instanceof Array) ? randomRange(bulletDefinition.health[0], bulletDefinition.health[1]) : bulletDefinition.health; - const sizeRatio = (bulletDefinition.sizeRatio instanceof Array) ? randomRange(bulletDefinition.sizeRatio[0], bulletDefinition.sizeRatio[1]) : bulletDefinition.sizeRatio; - const lifeLength = (bulletDefinition.lifeLength instanceof Array) ? randomRange(bulletDefinition.lifeLength[0], bulletDefinition.lifeLength[1]) : bulletDefinition.lifeLength; - this.relationsData.values.team = barrel.relationsData.values.team; this.relationsData.values.owner = tank; this.physicsData.values.sides = 1; this.physicsData.values.flags |= PhysicsFlags.noOwnTeamCollision | PhysicsFlags.canEscapeArena; if (tank.positionData.values.flags & PositionFlags.canMoveThroughWalls) this.positionData.values.flags |= PositionFlags.canMoveThroughWalls - this.physicsData.values.size = (barrel.physicsData.values.width / 2) * sizeRatio; + this.physicsData.values.size = (barrel.physicsData.values.width / 2) * bulletDefinition.sizeRatio; this.styleData.values.color = tank.rootParent.styleData.values.color; this.styleData.values.flags |= StyleFlags.hasNoDmgIndicator; this.healthData.values.flags = HealthFlags.hiddenHealthbar; const bulletDamage = statLevels ? statLevels[Stat.BulletDamage] : 0; const bulletPenetration = statLevels ? statLevels[Stat.BulletPenetration] : 0; - this.physicsData.values.absorbtionFactor = absorbtionFactor; - this.physicsData.values.pushFactor = ((7 / 3) + bulletDamage) * damage * absorbtionFactor + + this.physicsData.values.absorbtionFactor = bulletDefinition.absorbtionFactor; + this.physicsData.values.pushFactor = ((7 / 3) + bulletDamage) * bulletDefinition.damage * bulletDefinition.absorbtionFactor; this.baseAccel = barrel.bulletAccel; - this.baseSpeed = barrel.bulletAccel + (30 - Math.random() * bulletDefinition.scatterRate) * launchSpeed; + this.baseSpeed = barrel.bulletAccel + (30 - Math.random() * bulletDefinition.scatterRate) * (bulletDefinition.launchSpeed ?? 1); - this.healthData.values.health = this.healthData.values.maxHealth = (1.5 * bulletPenetration + 2) * health; - this.damagePerTick = (7 + bulletDamage * 3) * damage; + this.healthData.values.health = this.healthData.values.maxHealth = (1.5 * bulletPenetration + 2) * bulletDefinition.health; + this.damagePerTick = (7 + bulletDamage * 3) * bulletDefinition.damage; this.minDamageMultiplier = 0.25; this.maxDamageMultiplier = 1; - this.lifeLength = lifeLength * 75; + this.lifeLength = bulletDefinition.lifeLength * 75; const {x, y} = tank.getWorldPosition(); diff --git a/src/Entity/Tank/Projectile/Drone.ts b/src/Entity/Tank/Projectile/Drone.ts index a2c5b19b..87cf9736 100644 --- a/src/Entity/Tank/Projectile/Drone.ts +++ b/src/Entity/Tank/Projectile/Drone.ts @@ -24,7 +24,6 @@ import { TankDefinition } from "../../../Const/TankDefinitions"; import { Entity } from "../../../Native/Entity"; import { AI, AIState } from "../../AI"; import { BarrelBase } from "../TankBody"; -import { randomRange } from "../../../util"; /** * The drone class represents the drone (projectile) entity in diep. @@ -49,9 +48,7 @@ export default class Drone extends Bullet { super(barrel, tank, tankDefinition, shootAngle); const bulletDefinition = barrel.definition.bullet; - const absorbtionFactor = (bulletDefinition.absorbtionFactor instanceof Array) ? randomRange(bulletDefinition.absorbtionFactor[0], bulletDefinition.absorbtionFactor[1]) : bulletDefinition.absorbtionFactor; - const lifeLength = (bulletDefinition.lifeLength instanceof Array) ? randomRange(bulletDefinition.lifeLength[0], bulletDefinition.lifeLength[1]) : bulletDefinition.lifeLength; - + this.usePosAngle = true; this.ai = new AI(this); @@ -65,14 +62,14 @@ export default class Drone extends Bullet { this.styleData.values.flags &= ~StyleFlags.hasNoDmgIndicator; if (barrel.definition.bullet.lifeLength !== -1) { - this.lifeLength = 88 * lifeLength; + this.lifeLength = 88 * barrel.definition.bullet.lifeLength; } else { this.lifeLength = Infinity; } this.deathAccelFactor = 1; this.physicsData.values.pushFactor = 4; - this.physicsData.values.absorbtionFactor = absorbtionFactor; + this.physicsData.values.absorbtionFactor = bulletDefinition.absorbtionFactor; this.baseSpeed /= 3; @@ -144,4 +141,4 @@ export default class Drone extends Bullet { this.tickMixin(tick); } -} \ No newline at end of file +} diff --git a/src/Entity/Tank/Projectile/Flame.ts b/src/Entity/Tank/Projectile/Flame.ts index 48eb3110..033a198a 100644 --- a/src/Entity/Tank/Projectile/Flame.ts +++ b/src/Entity/Tank/Projectile/Flame.ts @@ -21,13 +21,10 @@ import Bullet from "./Bullet"; import { TankDefinition } from "../../../Const/TankDefinitions"; import { BarrelBase } from "../TankBody"; -import { randomRange } from "../../../util"; export default class Flame extends Bullet { public constructor(barrel: Barrel, tank: BarrelBase, tankDefinition: TankDefinition | null, shootAngle: number) { super(barrel, tank, tankDefinition, shootAngle); - const bulletDefinition = barrel.definition.bullet; - const lifeLength = (bulletDefinition.lifeLength instanceof Array) ? randomRange(bulletDefinition.lifeLength[0], bulletDefinition.lifeLength[1]) : bulletDefinition.lifeLength this.baseSpeed *= 2; this.baseAccel = 0; @@ -35,7 +32,7 @@ export default class Flame extends Bullet { this.physicsData.values.sides = 4; this.physicsData.values.absorbtionFactor = this.physicsData.values.pushFactor = 0; - this.lifeLength = 25 * lifeLength; + this.lifeLength = 25 * barrel.definition.bullet.lifeLength; } public destroy(animate?: boolean): void { @@ -48,4 +45,4 @@ export default class Flame extends Bullet { this.damageReduction += 1 / 25; this.styleData.opacity -= 1 / 25; } -} \ No newline at end of file +} diff --git a/src/Entity/Tank/Projectile/NecromancerSquare.ts b/src/Entity/Tank/Projectile/NecromancerSquare.ts index cea1d98b..87b69dd2 100644 --- a/src/Entity/Tank/Projectile/NecromancerSquare.ts +++ b/src/Entity/Tank/Projectile/NecromancerSquare.ts @@ -24,7 +24,6 @@ import { TankDefinition } from "../../../Const/TankDefinitions"; import { AI } from "../../AI"; import { BarrelBase } from "../TankBody"; import LivingEntity from "../../Live"; -import { randomRange } from "../../../util"; /** * The drone class represents the drone (projectile) entity in diep. @@ -34,8 +33,7 @@ export default class NecromancerSquare extends Drone { super(barrel, tank, tankDefinition, shootAngle); const bulletDefinition = barrel.definition.bullet; - const absorbtionFactor = (bulletDefinition.absorbtionFactor instanceof Array) ? randomRange(bulletDefinition.absorbtionFactor[0], bulletDefinition.absorbtionFactor[1]) : bulletDefinition.absorbtionFactor; - + this.ai = new AI(this); this.ai.viewRange = 900; @@ -51,7 +49,7 @@ export default class NecromancerSquare extends Drone { this.maxDamageMultiplier = 4; this.physicsData.values.pushFactor = 4; - this.physicsData.values.absorbtionFactor = absorbtionFactor; + this.physicsData.values.absorbtionFactor = bulletDefinition.absorbtionFactor; this.baseSpeed = 0; } diff --git a/src/Entity/Tank/Projectile/Trap.ts b/src/Entity/Tank/Projectile/Trap.ts index 86b1a8b3..670a529f 100644 --- a/src/Entity/Tank/Projectile/Trap.ts +++ b/src/Entity/Tank/Projectile/Trap.ts @@ -23,7 +23,7 @@ import { PhysicsFlags, StyleFlags } from "../../../Const/Enums"; import { TankDefinition } from "../../../Const/TankDefinitions"; import { BarrelBase } from "../TankBody"; import { DevTank } from "../../../Const/DevTankDefinitions"; -import { PI2, randomRange } from "../../../util"; +import { PI2 } from "../../../util"; /** * The trap class represents the trap (projectile) entity in diep. @@ -36,7 +36,6 @@ export default class Trap extends Bullet { super(barrel, tank, tankDefinition, shootAngle); const bulletDefinition = barrel.definition.bullet; - const lifeLength = (bulletDefinition.lifeLength instanceof Array) ? randomRange(bulletDefinition.lifeLength[0], bulletDefinition.lifeLength[1]) : bulletDefinition.lifeLength; this.baseSpeed = (barrel.bulletAccel / 2) + 30 - Math.random() * barrel.definition.bullet.scatterRate; this.baseAccel = 0; @@ -47,7 +46,7 @@ export default class Trap extends Bullet { this.styleData.values.flags &= ~StyleFlags.hasNoDmgIndicator; this.collisionEnd = this.lifeLength >> 3; - this.lifeLength = (600 * lifeLength) >> 3; + this.lifeLength = (600 * barrel.definition.bullet.lifeLength) >> 3; if (tankDefinition && tankDefinition.id === DevTank.Bouncy) this.collisionEnd = this.lifeLength - 1; // Check this? From 06120651b24bd1fcd1ac35ef20a1ef366519003d Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Thu, 24 Sep 2026 12:33:10 -0400 Subject: [PATCH 10/18] Update TankDefinitions.ts --- src/Const/TankDefinitions.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Const/TankDefinitions.ts b/src/Const/TankDefinitions.ts index cf5516d3..ac599bad 100644 --- a/src/Const/TankDefinitions.ts +++ b/src/Const/TankDefinitions.ts @@ -42,17 +42,17 @@ export const visibilityRateDamage = 0.2; export interface BulletDefinition { /** The type of the bullet that the barrel shoots. */ type: projectileId; - /** Size of the bullet shot out of the barrel in relation to the barrel's size.*/ + /** Size of the bullet shot out of the barrel in relation to the barrel's size. */ sizeRatio: number; - /** Used to calculate the health of the bullet that the barrel shoots.*/ + /** Used to calculate the health of the bullet that the barrel shoots. */ health: number; - /** Used to calculate the damage of the bullet that the barrel shoots.*/ + /** Used to calculate the damage of the bullet that the barrel shoots. */ damage: number; - /** Used to calculate the speed of the bullet that the barrel shoots.*/ + /** Used to calculate the speed of the bullet that the barrel shoots. */ speed: number; /** Used to calculate the scattering rate / spread of the bullets. */ scatterRate: number; - /** Used to calculate the life length of a bullet that the barrel shoots.*/ + /** Used to calculate the life length of a bullet that the barrel shoots. */ lifeLength: number; /** Knockback factor field of the bullet.*/ absorbtionFactor: number; @@ -60,7 +60,7 @@ export interface BulletDefinition { color?: Color; /** Overrides number of sides for projectile. */ sides?: number; - /** Used to calculate the initial burst of speed of the bullet that the barrel shoots.*/ + /** Used to calculate the initial burst of speed of the bullet that the barrel shoots. */ launchSpeed?: number; } From b4fcb37a8f16bbe2b4250ec7a899575b53d8760b Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Thu, 24 Sep 2026 12:34:37 -0400 Subject: [PATCH 11/18] Update TankDefinitions.ts --- src/Const/TankDefinitions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Const/TankDefinitions.ts b/src/Const/TankDefinitions.ts index ac599bad..afbb2e74 100644 --- a/src/Const/TankDefinitions.ts +++ b/src/Const/TankDefinitions.ts @@ -54,7 +54,7 @@ export interface BulletDefinition { scatterRate: number; /** Used to calculate the life length of a bullet that the barrel shoots. */ lifeLength: number; - /** Knockback factor field of the bullet.*/ + /** Knockback factor field of the bullet. */ absorbtionFactor: number; /** Projectile color - by default this is set to parent's body color. */ color?: Color; @@ -72,7 +72,7 @@ export interface BarrelDefinition { angle: number; /** The x offset of the barrel (think of Twin's barrels for example) at base radius (50). */ offset: number; - /** The y offset of the barrel (distance from the tanks main body) at base radius (50). Will have no effect on clientside tankrendering.*/ + /** The y offset of the barrel (distance from the tanks main body) at base radius (50). Will have no effect on clientside tankrendering. */ distance?: number; /** The size of the barrel. Think of Sniper, the longer side is the size. */ size: number; From 0002beb25a154e79fad6d3b2d8defc96973020b9 Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Thu, 24 Sep 2026 12:35:38 -0400 Subject: [PATCH 12/18] Update Flame.ts From 5973574ae45804fde42b5aedfea3a2b0c16b81e4 Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Thu, 24 Sep 2026 12:35:54 -0400 Subject: [PATCH 13/18] Update Drone.ts From efb8ca2bf1b90b8acf53eba7c211ec05ffab4c66 Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Thu, 24 Sep 2026 12:36:10 -0400 Subject: [PATCH 14/18] Update Flame.ts From 42effd98374157de7da3617e96022917235e131f Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Thu, 24 Sep 2026 12:36:42 -0400 Subject: [PATCH 15/18] Update Flame.ts From 07502334869373a86ead9430e3fccb1a70820984 Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Thu, 24 Sep 2026 12:37:13 -0400 Subject: [PATCH 16/18] Update Flame.ts From f6455996bc65163ca8d48907c92f7e5f1d8bcef7 Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Thu, 24 Sep 2026 12:37:37 -0400 Subject: [PATCH 17/18] Update Flame.ts From db9fc604918d44cc8beb3ecce3dc2058def8d456 Mon Sep 17 00:00:00 2001 From: CrabbytheCrab <79179107+CrabbytheCrab@users.noreply.github.com> Date: Thu, 24 Sep 2026 12:38:10 -0400 Subject: [PATCH 18/18] fixes --- src/Entity/Tank/Projectile/Drone.ts | 2 +- src/Entity/Tank/Projectile/Flame.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Entity/Tank/Projectile/Drone.ts b/src/Entity/Tank/Projectile/Drone.ts index 87cf9736..909fb5ed 100644 --- a/src/Entity/Tank/Projectile/Drone.ts +++ b/src/Entity/Tank/Projectile/Drone.ts @@ -141,4 +141,4 @@ export default class Drone extends Bullet { this.tickMixin(tick); } -} +} \ No newline at end of file diff --git a/src/Entity/Tank/Projectile/Flame.ts b/src/Entity/Tank/Projectile/Flame.ts index 033a198a..f0744afe 100644 --- a/src/Entity/Tank/Projectile/Flame.ts +++ b/src/Entity/Tank/Projectile/Flame.ts @@ -45,4 +45,4 @@ export default class Flame extends Bullet { this.damageReduction += 1 / 25; this.styleData.opacity -= 1 / 25; } -} +} \ No newline at end of file