Compare commits
No commits in common. "804eb62ae74343892047994e31b9c2afd1d0e3ae" and "b379e47dbf69bbdcc1646ce662851a9ff67aa7bc" have entirely different histories.
804eb62ae7
...
b379e47dbf
123
vacuum_gambit.p8
123
vacuum_gambit.p8
@ -339,10 +339,10 @@ function drawhud()
|
||||
draw_gun_info("❎",1,116,3,primary_ship.main_gun)
|
||||
draw_gun_info("🅾️",1,116,31,primary_ship.special_gun)
|
||||
|
||||
dropshadow("x h",114,59,1)
|
||||
dropshadow("p h",114,59,1)
|
||||
inset(114,66,119,125)
|
||||
fillp(0x5a5a)
|
||||
vertmeter(115,67,118,124,primary_ship.xp, primary_ship.xptarget, powcols)
|
||||
vertmeter(115,67,118,124,primary_ship.power, primary_ship.max_power, powcols)
|
||||
|
||||
inset(120,66,125,125)
|
||||
-- 57 px vertically
|
||||
@ -425,9 +425,14 @@ ship_m = mknew{
|
||||
-- ships have no shield by default
|
||||
shield = 0,
|
||||
maxshield = 0,
|
||||
shieldcost = 32767.9,
|
||||
shieldcooldown = 0x0.003c,--1s
|
||||
shieldpenalty = 0x0.012c, --5s
|
||||
|
||||
max_power = 120,
|
||||
power = 120,
|
||||
generator = 2, -- power gen per frame
|
||||
|
||||
slip = true, -- most enemies slide
|
||||
|
||||
xmomentum = 0,
|
||||
@ -487,6 +492,7 @@ end
|
||||
|
||||
function ship_m:move()
|
||||
self:refresh_shield()
|
||||
self.power = min(self.max_power, self.power + self.generator)
|
||||
local dx, dy, shoot_spec, shoot_main = self:act()
|
||||
dx = self:constrain(self.x, self.xmomentum, self.xmin, self.xmax, dx)
|
||||
dy = self:constrain(self.y, self.ymomentum, self.ymin, self.ymax, dy)
|
||||
@ -528,7 +534,9 @@ end
|
||||
|
||||
function ship_m:maybe_shoot(gun)
|
||||
if (not gun) return
|
||||
return gun:shoot(self.x + self.fire_off_x, self.y + self.fire_off_y)
|
||||
if (self.power < gun.power) return
|
||||
if (not gun:shoot(self.x + self.fire_off_x, self.y + self.fire_off_y)) return
|
||||
self.power -= gun.power
|
||||
end
|
||||
|
||||
function ship_m:hitship(other)
|
||||
@ -569,8 +577,10 @@ end
|
||||
function ship_m:refresh_shield()
|
||||
if (self.shield >= self.maxshield) return
|
||||
if (lframe < self.shield_refresh_ready) return
|
||||
if (self.power < self.shieldcost) return
|
||||
self.shield += 1
|
||||
self.shield = min(self.shield, self.maxshield)
|
||||
self.power -= self.shieldcost
|
||||
self.shield_refresh_ready = lframe + self.shieldcooldown
|
||||
end
|
||||
|
||||
@ -585,28 +595,6 @@ function enemy_blt_cat()
|
||||
return ebullets
|
||||
end
|
||||
|
||||
-- x, y: position
|
||||
-- dx, dy: movement (linear)
|
||||
-- f: frames remaining; nil for no limit
|
||||
-- sprite: what sprite to draw
|
||||
-- hurt -- hurtbox
|
||||
-- width, height -- in sprites
|
||||
-- x_off, y_off -- how to
|
||||
-- initially position relative
|
||||
-- to firing point. weird
|
||||
-- details, check impl
|
||||
-- damage -- damage to do to
|
||||
-- a ship that gets hit
|
||||
-- category -- function that
|
||||
-- returns which bullet list
|
||||
-- to spawn onto
|
||||
-- hitship -- event handler,
|
||||
-- takes ship as argument.
|
||||
-- default: die, return true.
|
||||
-- returns whether to delete
|
||||
-- the bullet
|
||||
-- die -- on-removal event,
|
||||
-- default no-op
|
||||
bullet_base = mknew{ }
|
||||
|
||||
gun_base = mknew{
|
||||
@ -625,8 +613,7 @@ end
|
||||
function bullet_base:move()
|
||||
self.x += self.dx
|
||||
self.y += self.dy
|
||||
if (self.f) self.f -= 1
|
||||
if (self.y > 128) or (self.y < -8 * self.height) or (self.f and self.f < 0) then
|
||||
if (self.y > 128) or (self.y < -8 * self.height) then
|
||||
self:die()
|
||||
return true
|
||||
end
|
||||
@ -667,7 +654,7 @@ end
|
||||
|
||||
zap_e = mknew(bullet_base.new{
|
||||
--shape
|
||||
sprite = 9, --index of ammo sprite
|
||||
sprite = 9, --index of enemy ammo sprite
|
||||
width = 1, --in 8x8 blocks
|
||||
height = 1,
|
||||
hurt = { -- hurtbox - where this ship can be hit
|
||||
@ -696,6 +683,7 @@ zap_p = mknew(zap_e.new{
|
||||
})
|
||||
|
||||
zap_gun_e = mknew(gun_base.new{
|
||||
power = 20, -- power consumed per shot
|
||||
cooldown = 0x0.000a, -- frames between shots
|
||||
ammo = nil, -- unlimited ammo - main gun
|
||||
actually_shoot = spawn_one(zap_e),
|
||||
@ -752,6 +740,7 @@ blast = mknew(bullet_base.new{
|
||||
|
||||
blast_gun = mknew(gun_base.new{
|
||||
icon = 13,
|
||||
power = 0, -- only cost is ammo
|
||||
cooldown = 0x0.0020, -- frames between shots
|
||||
ammo = 5,
|
||||
maxammo = 5,
|
||||
@ -787,6 +776,7 @@ protron_p = mknew(protron_e.new{
|
||||
|
||||
protron_gun_e = mknew(gun_base.new{
|
||||
icon = 25,
|
||||
power = 60,
|
||||
cooldown = 0x0.000f, -- frames between shots
|
||||
ammo = nil,
|
||||
maxammo = nil,
|
||||
@ -848,6 +838,7 @@ vulcan_p = mknew(vulcan_e.new{
|
||||
vulcan_gun_e = mknew(gun_base.new{
|
||||
icon = 37,
|
||||
enemy = false,
|
||||
power = 8,
|
||||
cooldown = 0x0.0002, -- frames between shots
|
||||
ammo = nil,
|
||||
maxammo = nil,
|
||||
@ -889,16 +880,13 @@ player = mknew(ship_m.new{
|
||||
sparkodds = 2,
|
||||
boss = true, -- dramatic special effects
|
||||
|
||||
-- health
|
||||
-- health and power
|
||||
hp = 3, -- current health, non-regenerating
|
||||
maxhp = 3, -- player only; other ships never heal
|
||||
shield = 2, -- regenerates
|
||||
shield = 2, -- regenerates, using power
|
||||
maxshield = 2,
|
||||
|
||||
-- xp, increments of 0x0.01
|
||||
xp = 0,
|
||||
xptarget = 0x0.05,
|
||||
level = 1,
|
||||
shieldcost = 60, -- power cost to refill shield
|
||||
generator = 2,
|
||||
|
||||
-- gun
|
||||
main_gun = nil, -- assign at spawn time
|
||||
@ -954,7 +942,7 @@ frownie = mknew(ship_m.new{
|
||||
sparks = smokespark,
|
||||
sparkodds = 8,
|
||||
|
||||
-- health
|
||||
-- health and power
|
||||
hp = 0.5, -- enemy ships need no max hp
|
||||
|
||||
-- position
|
||||
@ -996,6 +984,7 @@ blocky = mknew(frownie.new{
|
||||
|
||||
spewy = mknew(frownie.new{
|
||||
sprite=26,
|
||||
power=-20,
|
||||
hurt = {
|
||||
x_off=0,
|
||||
y_off=1,
|
||||
@ -1003,11 +992,13 @@ spewy = mknew(frownie.new{
|
||||
height=5
|
||||
},
|
||||
hp=0.5,
|
||||
maxpower=70,
|
||||
generator=0.5,
|
||||
fire_off_x=4,
|
||||
fire_off_y = 7,
|
||||
act=function(self)
|
||||
local dx,dy,shoot_spec=frownie.act(self)
|
||||
return dx, dy, shoot_spec, self.y > 10
|
||||
return dx, dy, shoot_spec, true
|
||||
end,
|
||||
init = function(ship)
|
||||
ship.main_gun=ship.main_gun or protron_gun_e.new{}
|
||||
@ -1028,6 +1019,7 @@ chasey = mknew(ship_m.new{
|
||||
hp = 1.5,
|
||||
shield = 1,
|
||||
maxshield = 1,
|
||||
shieldcost = 180,
|
||||
|
||||
fire_off_x = 4,
|
||||
fire_off_y = 7,
|
||||
@ -1045,7 +1037,7 @@ chasey = mknew(ship_m.new{
|
||||
function chasey:act()
|
||||
self.xmin = max(primary_ship.x-8, 0)
|
||||
self.xmax = min(primary_ship.x + 8, 112 - 8*self.size)
|
||||
return 0, 0, false, self.y > 10 and self.x - 16 < primary_ship.x and self.x + 16 > primary_ship.x
|
||||
return 0, 0, false, self.x - 16 < primary_ship.x and self.x + 16 > primary_ship.x
|
||||
end
|
||||
|
||||
xl_chasey=mknew(chasey.new{
|
||||
@ -1463,6 +1455,10 @@ algorithm expressed.
|
||||
|
||||
guns
|
||||
----
|
||||
* power - cost in generator
|
||||
power to fire. may be 0.
|
||||
field directly read by ships;
|
||||
required in all guns.
|
||||
* t - metatable for bullet type.
|
||||
fired once in the bullet's
|
||||
default direction per shot.
|
||||
@ -1490,6 +1486,11 @@ actually_shoot to change
|
||||
projectile logic while keeping
|
||||
cooldown and ammo logic.
|
||||
|
||||
ships manage generator power
|
||||
before asking the gun to shoot.
|
||||
this behavior is in
|
||||
ship_m:maybe_shoot.
|
||||
|
||||
bullets
|
||||
-------
|
||||
* dx, dy - movement per frame.
|
||||
@ -1576,19 +1577,39 @@ or less hp calls self:die() and
|
||||
tells the main game loop to
|
||||
remove it.
|
||||
|
||||
shieldcooldown is the interval
|
||||
between restoring shield points.
|
||||
shieldpenalty is the delay
|
||||
before restoring points after
|
||||
any damage, reset to this value
|
||||
on every damaging hit (whether
|
||||
it is absorbed by the shield or
|
||||
not) -- shield behaves like
|
||||
halo and other shooters in its
|
||||
heritage, where it recovers if
|
||||
you avoid damage for a while.
|
||||
not that there is any safe cover
|
||||
in this kind of game.
|
||||
ships have power, from 0 to
|
||||
ship.maxpower, increasing by
|
||||
ship.generator per frame.
|
||||
in maybe_shoot, ships check that
|
||||
they have power to fire before
|
||||
trying to fire (the gun itself
|
||||
checks ammo and cooldown), and
|
||||
spend that power if they fire.
|
||||
|
||||
power is also used to restore
|
||||
shields - ship.shieldcost per
|
||||
point of shields. shieldcooldown
|
||||
is the interval between
|
||||
restoring shield points, which
|
||||
is reset to shieldpenalty when a
|
||||
ship takes damage (regardless of
|
||||
whether that damage is stopped
|
||||
by the shield or not).
|
||||
shieldpenalty is much worse than
|
||||
shieldcooldown (hALO shield).
|
||||
|
||||
therefore:
|
||||
* damaged ships spend power
|
||||
repairing shields, which may
|
||||
affect ability to fire guns.
|
||||
this looks like a slow firing
|
||||
rate because the ship will
|
||||
eventually recover enough
|
||||
energy to fire.
|
||||
* a ship firing nonstop will
|
||||
typically be unable to recover
|
||||
any shields because it will
|
||||
not have energy to do so.
|
||||
|
||||
ships do not repair hp on their
|
||||
own. negative-damage bullets
|
||||
|
Loading…
Reference in New Issue
Block a user