This commit is contained in:
Aria 2025-03-21 22:23:30 +11:00
commit 9c94d113d3
Signed by untrusted user who does not match committer: aria
GPG key ID: 19AB7AA462B8AB3B
10260 changed files with 1237388 additions and 0 deletions

View file

@ -0,0 +1,26 @@
{
"itemName" : "guidedrocketlauncher",
"maxStack" : 1,
"rarity" : "legendary",
"description" : "It's time to rock some wicked trick shots.",
"shortdescription" : "Guided Rocket Launcher",
"tooltipKind" : "gun",
"weaponType" : "Gun",
"twoHanded" : true,
"itemTags" : ["weapon"],
"inventoryIcon" : "guidedrocketlauncher.png",
"animation" : "guidedrocketlauncher.animation",
"animationCustom" : { },
"scripts" : ["guidedrocketlauncher.lua"],
"fireOffset" : [2.0, 1.0],
"level" : 6,
"fireTime" : 2.0,
"inaccuracy" : 0.02,
"projectileType" : "guidedrocket",
"projectileParameters" : {
"power" : 12
}
}

View file

@ -0,0 +1,91 @@
{
"animatedParts" : {
"stateTypes" : {
"reload" : {
"default" : "ready",
"states" : {
"ready" : {},
"reload" : {
"frames" : 4,
"cycle" : 1.0,
"mode" : "transition",
"transition" : "ready"
}
}
}
},
"parts" : {
"gun" : {
"properties" : {
"centered" : true,
"image" : "guidedrocketlauncher.png",
"offset" : [-0.75, 0.75]
}
},
"reloadLights" : {
"properties" : {
"centered" : true,
"offset" : [-0.5, 0.875],
"zLevel" : 1,
"fullbright" : true
},
"partStates" : {
"reload" : {
"ready" : {
"properties" : {
"image" : "reloadlights.png:ready"
}
},
"reload" : {
"properties" : {
"image" : "reloadlights.png:reload.<frame>"
}
}
}
}
}
}
},
"particleEmitters" : {
"fireParticles" : {
"emissionRate" : 10.0,
"particles" : [
{
"particle" : "rocketbarrelpuff",
"offset" : [2, 0.75]
},
{
"particle" : "rocketbarrelpuff",
"offset" : [2, 0.75]
},
{
"particle" : "rocketbarrelpuff",
"offset" : [2, 0.75]
},
{
"particle" : "rocketbarrelpuff",
"offset" : [2, 0.75]
},
{
"particle" : "rocketbarrelpuff",
"offset" : [2, 0.75]
},
{
"particle" : "rocketbarrelpuff",
"offset" : [2, 0.75]
},
{
"particle" : "rocketbarrelpuff",
"offset" : [2, 0.75]
}
]
}
},
"sounds" : {
"fire" : [ "/sfx/gun/rocket1.ogg" ]
}
}

View file

@ -0,0 +1,108 @@
require "/scripts/vec2.lua"
function init()
-- scale damage and calculate energy cost
self.pType = config.getParameter("projectileType")
self.pParams = config.getParameter("projectileParameters", {})
if not self.pParams.power then
local projectileConfig = root.projectileConfig(self.pType)
self.pParams.power = projectileConfig.power
end
self.pParams.power = self.pParams.power * root.evalFunction("weaponDamageLevelMultiplier", config.getParameter("level", 1))
self.energyPerShot = 3 * self.pParams.power
self.fireOffset = config.getParameter("fireOffset")
updateAim()
storage.fireTimer = storage.fireTimer or 0
self.recoilTimer = 0
animator.setAnimationRate(1 / config.getParameter("fireTime", 1.0))
self.activeRockets = {}
updateCursor()
end
function update(dt, fireMode, shiftHeld)
updateAim()
storage.fireTimer = math.max(storage.fireTimer - dt, 0)
self.recoilTimer = math.max(self.recoilTimer - dt, 0)
if fireMode ~= "none"
and storage.fireTimer <= 0
and not world.pointTileCollision(firePosition())
and status.overConsumeResource("energy", self.energyPerShot) then
storage.fireTimer = config.getParameter("fireTime", 1.0)
fire()
end
activeItem.setRecoil(self.recoilTimer > 0)
updateRockets()
updateCursor()
end
function updateCursor()
if #self.activeRockets > 0 then
activeItem.setCursor("/cursors/chargeready.cursor")
else
activeItem.setCursor("/cursors/reticle0.cursor")
end
end
function uninit()
for i, rocket in ipairs(self.activeRockets) do
world.callScriptedEntity(rocket, "setTarget", nil)
end
end
function fire()
self.pParams.powerMultiplier = activeItem.ownerPowerMultiplier()
local rocketId = world.spawnProjectile(
self.pType,
firePosition(),
activeItem.ownerEntityId(),
aimVector(),
false,
self.pParams
)
if rocketId then
self.activeRockets[#self.activeRockets + 1] = rocketId
end
animator.setAnimationState("reload", "reload", true)
animator.burstParticleEmitter("fireParticles")
animator.playSound("fire")
self.recoilTimer = config.getParameter("recoilTime", 0.12)
end
function updateAim()
self.aimAngle, self.aimDirection = activeItem.aimAngleAndDirection(self.fireOffset[2], activeItem.ownerAimPosition())
activeItem.setArmAngle(self.aimAngle)
activeItem.setFacingDirection(self.aimDirection)
end
function updateRockets()
local newRockets = {}
for i, rocket in ipairs(self.activeRockets) do
if world.entityExists(rocket) then
newRockets[#newRockets + 1] = rocket
end
end
self.activeRockets = newRockets
for i, rocket in ipairs(self.activeRockets) do
world.callScriptedEntity(rocket, "setTarget", activeItem.ownerAimPosition())
end
end
function firePosition()
return vec2.add(mcontroller.position(), activeItem.handPosition(self.fireOffset))
end
function aimVector()
local aimVector = vec2.rotate({1, 0}, self.aimAngle + sb.nrand(config.getParameter("inaccuracy", 0), 0))
aimVector[1] = aimVector[1] * self.aimDirection
return aimVector
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 B

View file

@ -0,0 +1,14 @@
{
"frameGrid" : {
"size" : [10, 3],
"dimensions" : [1, 5],
"names" : [
[ "reload.1" ],
[ "reload.2" ],
[ "reload.3" ],
[ "reload.4" ],
[ "ready" ]
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B