18 Commits

Author SHA1 Message Date
ead2a7d874 fix remaining vulcan-family bug 2024-09-02 14:45:56 -07:00
571412b15e fix chasey xl offsets 2024-09-02 14:15:56 -07:00
907bd8318c several more fixes, now runs to the end but shot offset is wrong 2024-09-02 14:12:35 -07:00
7170552448 first three waves of bug fixes 2024-09-02 13:41:42 -07:00
01ab6d3969 maybe the rest of the refactor? 2024-09-02 12:59:49 -07:00
7869192dee partial refactor continued 2024-08-20 01:21:13 -07:00
a4658e3ef4 halfway through bullet refactor 2024-08-19 16:00:16 -07:00
60b685d94b save a copy of vacuum_gambit.p8 as last_tyrianlike
next step is to pick a real direction -- MMBN-like (+STS-like) or
Survivors-like -- and adapt to match. I am likely to completely remove
the energy system and use permanent autofire, freeing both fire buttons
for more interesting tasks. It loses the opportunity to create a dynamic
around baiting an enemy to keep shooting so its shields don't recover,
but I don't think it loses a lot else.

Either energy management needs to become really important and the game
becomes strategic and tactical, or it needs to be a non-issue and it is
an arcade game. Tyrian itself did not make the energy system interesting
and it was just a tax, so making it interesting would be doing something
new. But I think it's a kind of "interesting" that almost nobody would
adopt unless I go _very hard_ into creating a tactical/strategic shmup.
A shmup that is actually a strange kind of RTS sounds... really cool,
actually, but I'm not at all confident I could design it.

Removing energy entirely gives us a button _and_ a meter back, which
can be used for XP (Survivors-like) or rearm time (MMBN-like).
2024-08-18 15:04:17 -07:00
cc1e7ea5b7 surive at 0hp and adjust hp values to match
Instead of doing a special case for 1HP, 0HP is survivable, ships die
at negative HP instead. all ship health is adjusted to match, assuming
the weakest shot is 0.5hp, which is currently true. the "real" game will
totally rebalance all ships and weapons anyway.

we're getting close to when I have to stop dawdling and implement the
real game, the engine is _there._
2024-08-18 14:57:29 -07:00
6b8efe3438 fix HP-only mode
it was showing the bar intended as the warning that there's no HP
under the shield. but I tried it and that bar just makes it look like
there *is* a sliver of health, which there isn't. so it's better off
without that in either mode.
2024-08-18 14:49:44 -07:00
c2668cefea handle 0 shield and 1 max HP cases 2024-08-18 14:40:11 -07:00
eebd84544b one hit comment now shows correct value to use
some guns do less than one damage per shot (vulcan gun does 0.5), so
Instant Death Mode needs to max at 0x0.0001, the smallest nonzero value
in Pico-8's fixed-point numeric type.

One Hit Mode is just a comment for now, but I've been uncommenting it
to test it. Note that replacing the health meter with a "!" is triggered
by max HP + max shield <= 1 because 1 hp shows an empty bar.

this needs some more special cases for low-HP ships with active shields.
2024-08-18 01:57:53 -07:00
965fc0d688 major rebalances
10s generator is too slow -- 10 seconds ago is an eternity in a shmup
and a player who has stopped firing should recover much faster. The
generator's max capacity is much lower and shield cost has been
rebalanced to match.

The Protron is much more expensive to fire, it was previously just
easy mode.

Shields now recover faster _once they start recovering_ (every second
if energy is available) but getting hit causes a "penalty cooldown"
that is much longer than the standard recovery interval. This behavior
is taken from Halo and basically every modern FPS that came after it;
it's unlike Tyrian, which had consistent shield recovery behavior.
But I think Halo's rule plays much better.
2024-08-18 01:46:39 -07:00
cc3ed20f76 fix overshield 2024-08-18 01:29:27 -07:00
fa0cff1ffc one hit mode, fix vertmeter
full height meters overflowed p8num range
2024-08-18 01:28:12 -07:00
4f8b861cdb okay I special cased it 2024-08-18 01:14:05 -07:00
5dc259c094 the Secret Hit Point: you have 1hp when the meter is empty
this won't work if your maxhp is 1, will need to special case that
2024-08-18 01:13:25 -07:00
51629376f2 adjust HUD
Health and shields now share one bar. one hit point is (about) the same
size in each. There is an indicator splitting the two categories of HP.
2024-08-18 01:10:20 -07:00
2 changed files with 2366 additions and 163 deletions

2164
last_tyrianlike.p8 Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
pico-8 cartridge // http://www.pico-8.com pico-8 cartridge // http://www.pico-8.com
version 41 version 42
__lua__ __lua__
-- vacuum gambit -- vacuum gambit
-- by kistaro windrider -- by kistaro windrider
@ -18,6 +18,11 @@ function csv(s)
end end
return ret return ret
end end
function const_fxn(x)
return function()
return x
end
end
-- generate standard "overlay" -- generate standard "overlay"
-- constructor for type tt. -- constructor for type tt.
@ -118,7 +123,7 @@ end
function _init() function _init()
init_blip_pals() init_blip_pals()
wipe_level() wipe_level()
primary_ship.main_gun = zap_gun.new() primary_ship.main_gun = zap_gun_p.new() -- redundant?
load_level(example_level_csv) load_level(example_level_csv)
state = game state = game
pal(2,129) pal(2,129)
@ -320,6 +325,7 @@ function drawgame()
end end
powcols=split"170,154,153,148,68" powcols=split"170,154,153,148,68"
shlcols = split"204,220,221"
function drawhud() function drawhud()
-- 112-and-right is hud zone -- 112-and-right is hud zone
rectfill(112, 0, 127, 127,0x56) rectfill(112, 0, 127, 127,0x56)
@ -328,20 +334,30 @@ function drawhud()
line(113,127) line(113,127)
draw_gun_info("❎",1,116,3,primary_ship.main_gun) draw_gun_info("❎",1,116,3,primary_ship.main_gun)
draw_gun_info("🅾️",2,116,31,primary_ship.special_gun) draw_gun_info("🅾️",1,116,31,primary_ship.special_gun)
dropshadow("pwr",114,59,1) dropshadow("p h",114,59,1)
inset(114,66,119,125) inset(114,66,119,125)
fillp(0x5a5a) fillp(0x5a5a)
vertmeter(115,67,118,124,primary_ship.power, primary_ship.max_power, powcols) vertmeter(115,67,118,124,primary_ship.power, primary_ship.max_power, powcols)
inset(120,66,125,125) inset(120,66,125,125)
line(120,96,125,96,119) -- 57 px vertically
line(120,97,125,97,85) local mxs, cs, mxh, ch = primary_ship.maxshield, primary_ship.shield, primary_ship.maxhp, primary_ship.hp
pset(120, 125, 119) if (mxs > 0) and (mxh > 0) then
vertmeter(121,67,124,95,primary_ship.shield, primary_ship.maxshield,{204,220,221}) local split = 57 * (mxs / (mxs + mxh)) \ 1 + 66
vertmeter(121,98,124,124,primary_ship.hp, primary_ship.maxhp, hpcols) line(121, split, 124, split, 0xba)
fillp(0) vertmeter(121,67,124,split-1,cs, mxs,shlcols)
vertmeter(121,split+1,124,124,ch, mxh, hpcols)
elseif mxs > 0 then
vertmeter(121,67,124,124,cs,mxs,shlcols)
elseif mxh > 0 then
vertmeter(121,67,124,124,ch,mxh,hpcols)
else
print("!", 122, 94, 9)
print("!", 121, 93, 8)
end
fillp(0)
end end
function draw_gun_info(lbl,fgc,x,y,gun) function draw_gun_info(lbl,fgc,x,y,gun)
@ -367,9 +383,9 @@ function draw_gun_info(lbl,fgc,x,y,gun)
end end
function vertmeter(x0,y0,x1,y1,val,maxval,cols) function vertmeter(x0,y0,x1,y1,val,maxval,cols)
if (val <= 0) return if ((val <= 0) or (maxval <= 0)) return
local h = y1-y0 local h = y1-y0
local px = -flr(-(h*val)\maxval) local px = val/maxval * h \ 1
local ncols = #cols local ncols = #cols
local firstcol = ((h-px)*ncols\h)+1 local firstcol = ((h-px)*ncols\h)+1
local lastbottom = y0+(h*firstcol\ncols) local lastbottom = y0+(h*firstcol\ncols)
@ -407,13 +423,12 @@ ship_m = {
shield = 0, shield = 0,
maxshield = 0, maxshield = 0,
shieldcost = 32767.9, shieldcost = 32767.9,
shieldcooldown = 0x0.00a0, shieldcooldown = 0x0.003c,--1s
shieldpenalty = 0x0.012c, --5s
-- default generator behavior: max_power = 120,
-- 10 seconds for a full charge power = 120,
max_power = 600, generator = 2, -- power gen per frame
power = 600,
generator = 1, -- power gen per frame
slip = true, -- most enemies slide slip = true, -- most enemies slide
@ -431,7 +446,7 @@ mknew(ship_m)
function ship_m:die() function ship_m:die()
self.dead = true self.dead = true
if (self.hp <= 0) boom(self.x+self.size*4, self.y+self.size*4,12*self.size, self.boss) if (self.hp < 0) boom(self.x+self.size*4, self.y+self.size*4,12*self.size, self.boss)
end end
function ship_m:calc_velocity(v0, t) function ship_m:calc_velocity(v0, t)
@ -532,7 +547,7 @@ end
function ship_m:hitsomething(dmg) function ship_m:hitsomething(dmg)
if (dmg <= 0) return false if (dmg <= 0) return false
self.shield_refresh_ready = lframe + self.shieldcooldown self.shield_refresh_ready = lframe + self.shieldpenalty
if self.shield >= dmg then if self.shield >= dmg then
self.shield -= dmg self.shield -= dmg
self:ow(true) self:ow(true)
@ -541,7 +556,7 @@ function ship_m:hitsomething(dmg)
dmg -= self.shield dmg -= self.shield
self.shield = 0 self.shield = 0
self.hp -= dmg self.hp -= dmg
if self.hp <= 0 then if self.hp < 0 then
self:die() self:die()
return true return true
end end
@ -562,6 +577,7 @@ function ship_m:refresh_shield()
if (lframe < self.shield_refresh_ready) return if (lframe < self.shield_refresh_ready) return
if (self.power < self.shieldcost) return if (self.power < self.shieldcost) return
self.shield += 1 self.shield += 1
self.shield = min(self.shield, self.maxshield)
self.power -= self.shieldcost self.power -= self.shieldcost
self.shield_refresh_ready = lframe + self.shieldcooldown self.shield_refresh_ready = lframe + self.shieldcooldown
end end
@ -569,9 +585,15 @@ end
-->8 -->8
-- bullet and gun behaviors -- bullet and gun behaviors
bullet_base = { function player_blt_cat()
enemyspd = 0.5 return pbullets
} end
function enemy_blt_cat()
return ebullets
end
bullet_base = { }
mknew(bullet_base) mknew(bullet_base)
gun_base = { gun_base = {
@ -590,18 +612,10 @@ end
function bullet_base:move() function bullet_base:move()
self.x += self.dx self.x += self.dx
if self.enemy then self.y += self.dy
self.y += self.dy if (self.y > 128) or (self.y < -8 * self.height) then
if self.y > 128 then self:die()
self:die() return true
return true
end
else
self.y -= self.dy
if self.y < -8*self.height then
self:die()
return true
end
end end
return false return false
end end
@ -610,19 +624,20 @@ function bullet_base:draw()
spr(self.sprite, self.x, self.y, self.width, self.height) spr(self.sprite, self.x, self.y, self.width, self.height)
end end
function bullet_base:spawn_at(x, y) -- An `actually_shoot` factory
self.x = x - self.center_x_off -- for trivial guns
if self.enemy then function spawn_one(t)
self.dx *= self.enemyspd return function(gun, x, y)
self.dy *= self.enemyspd t.new{}:spawn_at(x, y)
self.y = y + self.top_y_off
ebullets:push_back(self)
else
self.y = y - (8 * self.height) + self.bottom_y_off
pbullets:push_back(self)
end end
end end
function bullet_base:spawn_at(x, y)
self.x = x - self.x_off
self.y = y - self.y_off
self.category():push_back(self)
end
function gun_base:shoot(x, y) function gun_base:shoot(x, y)
if (lframe < self.shoot_ready) return false if (lframe < self.shoot_ready) return false
if self.ammo then if self.ammo then
@ -634,23 +649,12 @@ function gun_base:shoot(x, y)
return true return true
end end
function gun_base:actually_shoot(x, y)
local typ = self.t
local b = typ.new{
enemy = self.enemy,
sprite = self.enemy and typ.esprite or typ.psprite,
}
b:spawn_at(x, y)
return true
end
-->8 -->8
-- bullets and guns -- bullets and guns
zap = bullet_base.new{ zap_e = bullet_base.new{
--shape --shape
psprite = 8, --index of player ammo sprite sprite = 9, --index of enemy ammo sprite
esprite = 9, -- index of enemy ammo sprite
width = 1, --in 8x8 blocks width = 1, --in 8x8 blocks
height = 1, height = 1,
hurt = { -- hurtbox - where this ship can be hit hurt = { -- hurtbox - where this ship can be hit
@ -659,33 +663,43 @@ zap = bullet_base.new{
width = 2, width = 2,
height = 8 height = 8
}, },
center_x_off = 1, -- how to position by ship x_off = 1, -- how to position by ship
bottom_y_off = 0, y_off = 8,
top_y_off = 0,
damage = 1, damage = 1,
dx = 0, -- px/frame dx = 0, -- px/frame
dy = 8, dy = 4,
hitship = function(_, _) hitship = const_fxn(true),
return true
end category = enemy_blt_cat,
} }
mknew(zap) mknew(zap_e)
zap_gun = gun_base.new{ zap_p = zap_e.new{
enemy = false, sprite = 8,
dy = -8,
y_off = 0,
category = player_blt_cat,
}
mknew(zap_p)
zap_gun_e = gun_base.new{
power = 20, -- power consumed per shot power = 20, -- power consumed per shot
cooldown = 0x0.000a, -- frames between shots cooldown = 0x0.000a, -- frames between shots
ammo = nil, -- unlimited ammo - main gun ammo = nil, -- unlimited ammo - main gun
t = zap -- metatable of bullet to fire actually_shoot = spawn_one(zap_e),
} }
mknew(zap_gun) mknew(zap_gun_e)
zap_gun_p = zap_gun_e.new{
actually_shoot = spawn_one(zap_p),
}
mknew(zap_gun_p)
blast = bullet_base.new{ blast = bullet_base.new{
--shape --shape
psprite = 12, --index of player ammo sprite sprite = 12, --index of player ammo sprite
esprite = 3, -- index of enemy ammo sprite
width = 1, --in 8x8 blocks width = 1, --in 8x8 blocks
height = 1, height = 1,
hurt = { -- hurtbox - where this ship can be hit hurt = { -- hurtbox - where this ship can be hit
@ -694,13 +708,12 @@ blast = bullet_base.new{
width = 6, width = 6,
height = 6 height = 6
}, },
center_x_off = 4, -- how to position by ship x_off = 4, -- how to position by ship
bottom_y_off = 0, y_off = 0,
top_y_off = 0,
damage = 4, damage = 4,
dx = 0, -- px/frame dx = 0, -- px/frame
dy = 2, dy = -2,
awaitcancel = false, awaitcancel = false,
-- disable damage for 2 frames -- disable damage for 2 frames
@ -725,25 +738,24 @@ blast = bullet_base.new{
self.awaitcancel = false self.awaitcancel = false
end) end)
end end
end end,
category=player_blt_cat
} }
mknew(blast) mknew(blast)
blast_gun = gun_base.new{ blast_gun = gun_base.new{
icon = 13, icon = 13,
enemy = false, power = 0, -- only cost is ammo
power = 0, -- ammo, not power
cooldown = 0x0.0020, -- frames between shots cooldown = 0x0.0020, -- frames between shots
ammo = 5, ammo = 5,
maxammo = 5, maxammo = 5,
t = blast -- type of bullet to fire actually_shoot = spawn_one(blast),
} }
mknew(blast_gun) mknew(blast_gun)
protron = bullet_base.new{ protron_e = bullet_base.new{
--shape --shape
psprite = 23, --index of player ammo sprite sprite = 24,
esprite = 24, -- index of enemy ammo sprite
width = 1, --in 8x8 blocks width = 1, --in 8x8 blocks
height = 1, height = 1,
hurt = { -- hurtbox - where this ship can be hit hurt = { -- hurtbox - where this ship can be hit
@ -752,56 +764,63 @@ protron = bullet_base.new{
width = 2, width = 2,
height = 2 height = 2
}, },
center_x_off = 1, -- how to position by ship x_off = 1, -- how to position by ship
bottom_y_off = 4, y_off = 4,
top_y_off = 0,
damage = 1, damage = 1,
dx = 0, -- px/frame dym = 0.5, -- gun sets dy;
dy = 3, -- this is mult
category = enemy_blt_cat,
} }
mknew(protron) mknew(protron_e)
protron_gun = gun_base.new{ protron_p = protron_e.new{
sprite=23,
dym = -1,
y_off = 0,
category=player_blt_cat,
}
mknew(protron_p)
protron_gun_e = gun_base.new{
icon = 25, icon = 25,
enemy = false, power = 60,
power = 35,
cooldown = 0x0.000f, -- frames between shots cooldown = 0x0.000f, -- frames between shots
ammo = nil, ammo = nil,
maxammo = nil, maxammo = nil,
actually_shoot = function(self, x, y) munition = protron_e
local sprite = protron.psprite
if (self.enemy) sprite=protron.esprite
for i=1,3 do
local b = protron.new{
enemy=self.enemy,
sprite=sprite,
dx = i,
dy = 4-i
}
b:spawn_at(x,y)
local b2 = protron.new{
enemy=self.enemy,
sprite=sprite,
dx = -i,
dy = 4-i
}
b2:spawn_at(x,y)
end
local bup = protron.new{
enemy=self.enemy,
sprite=sprite,
dy=4
}
bup:spawn_at(x,y)
end
} }
mknew(protron_gun) mknew(protron_gun_e)
vulcan = bullet_base.new{ function protron_gun_e:actually_shoot(x, y)
local m = self.munition.dym
for i=1,3 do
local b = self.munition.new{
dx = i*m,
dy = (4-i)*m,
}
b:spawn_at(x,y)
local b2 = self.munition.new{
dx = -i*m,
dy = (4-i)*m,
}
b2:spawn_at(x,y)
end
local bup = self.munition.new{
dx=0,
dy=4*m,
}
bup:spawn_at(x,y)
end
protron_gun_p = protron_gun_e.new{
munition = protron_p,
}
mknew(protron_gun_p)
vulcan_e = bullet_base.new{
--shape --shape
psprite = 22, --index of player ammo sprite sprite = 21,
esprite = 21, -- index of enemy ammo sprite
width = 1, --in 8x8 blocks width = 1, --in 8x8 blocks
height = 1, height = 1,
hurt = { -- hurtbox - where this ship can be hit hurt = { -- hurtbox - where this ship can be hit
@ -810,31 +829,37 @@ vulcan = bullet_base.new{
width = 1, width = 1,
height = 4 height = 4
}, },
center_x_off = 0.5, -- how to position by ship x_off = 0.5, -- how to position by ship
bottom_y_off = 4, y_off = 0,
top_y_off = 0,
damage = 0.5, damage = 0.5,
dx = 0, -- px/frame -- dx from gun
dy = 4, dy = 2,
category=enemy_blt_cat
} }
mknew(vulcan) mknew(vulcan_e)
vulcan_gun = gun_base.new{ vulcan_p = vulcan_e.new{
sprite=22,
y_off = 4,
dy = -4,
category=player_blt_cat
}
mknew(vulcan_p)
vulcan_gun_e = gun_base.new{
icon = 37, icon = 37,
enemy = false, enemy = false,
power = 8, power = 8,
cooldown = 0x0.0002, -- frames between shots cooldown = 0x0.0002, -- frames between shots
ammo = nil, ammo = nil,
maxammo = nil, maxammo = nil,
munition=vulcan_e,
dxs = {0.35, -0.35, -0.7, 0.7, 0.35, -0.35}, dxs = {0.35, -0.35, -0.7, 0.7, 0.35, -0.35},
xoffs = {1, 0, -1, 1, 0, -1}, xoffs = {1, 0, -1, 1, 0, -1},
dxidx = 1, dxidx = 1,
actually_shoot = function(self, x, y) actually_shoot = function(self, x, y)
local sprite = self.enemy and vulcan.esprite or vulcan.psprite local b = self.munition.new{
local b = vulcan.new{
enemy=self.enemy,
sprite=sprite,
dx = self.dxs[self.dxidx], dx = self.dxs[self.dxidx],
} }
b:spawn_at(self.xoffs[self.dxidx]+x,y) b:spawn_at(self.xoffs[self.dxidx]+x,y)
@ -842,7 +867,12 @@ vulcan_gun = gun_base.new{
if (self.dxidx > #self.dxs) self.dxidx = 1 if (self.dxidx > #self.dxs) self.dxidx = 1
end end
} }
mknew(vulcan_gun) mknew(vulcan_gun_e)
vulcan_gun_p = vulcan_gun_e.new{
munition=vulcan_p,
}
mknew(vulcan_gun_p)
-->8 -->8
--ships, including player --ships, including player
@ -869,8 +899,8 @@ player = ship_m.new{
maxhp = 3, -- player only; other ships never heal maxhp = 3, -- player only; other ships never heal
shield = 2, -- regenerates, using power shield = 2, -- regenerates, using power
maxshield = 2, maxshield = 2,
shieldcost = 300, -- power cost to refill shield shieldcost = 60, -- power cost to refill shield
generator = 1.5, -- 1 feels too slow generator = 2,
-- gun -- gun
main_gun = nil, -- assign at spawn time main_gun = nil, -- assign at spawn time
@ -904,7 +934,13 @@ player = ship_m.new{
} }
mknew(player, mknew(player,
function(p) function(p)
p.main_gun = zap_gun.new() p.main_gun = zap_gun_p.new()
-- ONE HIT MODE
--
-- p.hp = 0
-- p.maxhp = 0
-- p.shield = 0
-- p.maxshield = 0
end end
) )
@ -922,7 +958,7 @@ frownie = ship_m.new{
sparkodds = 8, sparkodds = 8,
-- health and power -- health and power
hp = 1, -- enemy ships need no max hp hp = 0.5, -- enemy ships need no max hp
-- position -- position
x=60, -- x and y are for upper left corner x=60, -- x and y are for upper left corner
@ -944,7 +980,7 @@ mknew(frownie)
blocky = frownie.new{ blocky = frownie.new{
sprite = 10, sprite = 10,
hp = 2, hp = 1.5,
hurt = { hurt = {
x_off = 0, x_off = 0,
y_off = 0, y_off = 0,
@ -953,7 +989,7 @@ blocky = frownie.new{
}, },
ow = function(self) ow = function(self)
if self.hp <= 1 then if self.hp < 1 then
self.sprite = 11 self.sprite = 11
else else
self.sprite = 10 self.sprite = 10
@ -972,7 +1008,7 @@ spewy = frownie.new{
width=8, width=8,
height=5 height=5
}, },
hp=1, hp=0.5,
maxpower=70, maxpower=70,
generator=0.5, generator=0.5,
fire_off_x=4, fire_off_x=4,
@ -983,7 +1019,7 @@ spewy = frownie.new{
end end
} }
mknew(spewy, function(ship) mknew(spewy, function(ship)
ship.main_gun=ship.main_gun or protron_gun.new{enemy=true} ship.main_gun=ship.main_gun or protron_gun_e.new{enemy=true}
end) end)
chasey = ship_m.new{ chasey = ship_m.new{
@ -997,7 +1033,7 @@ chasey = ship_m.new{
}, },
sparks = smokespark, sparks = smokespark,
sparkodds = 8, sparkodds = 8,
hp = 2, hp = 1.5,
shield = 1, shield = 1,
maxshield = 1, maxshield = 1,
shieldcost = 180, shieldcost = 180,
@ -1011,7 +1047,7 @@ chasey = ship_m.new{
slip = true, slip = true,
} }
mknew(chasey, function(ship) mknew(chasey, function(ship)
ship.main_gun=ship.main_gun or zap_gun.new{enemy=true} ship.main_gun=ship.main_gun or zap_gun_e.new{}
end) end)
function chasey:act() function chasey:act()
@ -1029,7 +1065,9 @@ xl_chasey=chasey.new{
width = 12, width = 12,
height = 10 height = 10
}, },
hp = 20, fire_off_x = 8,
fire_off_y = 15,
hp = 19.5,
shield = 5, shield = 5,
boss = true, boss = true,
slip = false, slip = false,
@ -1045,7 +1083,7 @@ xl_chasey=chasey.new{
end, end,
} }
mknew(xl_chasey, function(ship) mknew(xl_chasey, function(ship)
ship.main_gun=ship.main_gun or zap_gun.new{enemy=true} ship.main_gun=ship.main_gun or zap_gun_e.new{}
end) end)
-->8 -->8
-- collisions -- collisions
@ -1254,9 +1292,9 @@ end
function spawn_bonus_vulcan_chasey() function spawn_bonus_vulcan_chasey()
local c = spawn_chasey() local c = spawn_chasey()
c.main_gun=vulcan_gun.new{enemy=true} c.main_gun=vulcan_gun_e.new{enemy=true}
c.die = function(self) c.die = function(self)
spawn_main_gun_at(self.x-1, self.y-1, vulcan_gun) spawn_main_gun_at(self.x-1, self.y-1, vulcan_gun_p)
chasey.die(self) chasey.die(self)
end end
c.sprite=4 c.sprite=4
@ -1359,7 +1397,7 @@ example_level_csv=[[1,spawn_frownie
310,spawn_blocking_blocky 310,spawn_blocking_blocky
310,spawn_blocking_blocky 310,spawn_blocking_blocky
311,spawn_frownie 311,spawn_frownie
350,spawn_main_gun_at,70,-11,protron_gun 350,spawn_main_gun_at,70,-11,protron_gun_p
401,spawn_frownie 401,spawn_frownie
420,spawn_blocking_frownie 420,spawn_blocking_frownie
430,spawn_bonus_vulcan_chasey 430,spawn_bonus_vulcan_chasey
@ -1469,8 +1507,9 @@ bullets
shots much easier to dodge shots much easier to dodge
* damage - damage per hit; * damage - damage per hit;
used by ships used by ships
* psprite, esprite - index of * sprite - sprite index.
player or enemy sprite. * x_off, y_off - renamed for
the next two vars. may revert
* center_off_x - the horizontal * center_off_x - the horizontal
centerpoint of the bullet, centerpoint of the bullet,
for positioning when firing. for positioning when firing.
@ -1557,10 +1596,12 @@ shields - ship.shieldcost per
point of shields. shieldcooldown point of shields. shieldcooldown
is the interval between is the interval between
restoring shield points, which restoring shield points, which
is reset when a ship takes is reset to shieldpenalty when a
damage (regardless of whether ship takes damage (regardless of
that damage is stopped by the whether that damage is stopped
shield or not). by the shield or not).
shieldpenalty is much worse than
shieldcooldown (hALO shield).
therefore: therefore:
* damaged ships spend power * damaged ships spend power
@ -1857,7 +1898,7 @@ powerup = bullet_base.new{
-- easy to pick up -- easy to pick up
dx = 0, dx = 0,
dy = 1.5, -- 0.75 after enemyspd dy = 1.5, -- 0.75 after enemyspd
enemy = true, -- collides with player ship category = enemy_blt_cat, -- collides with player ship
damage = 0, damage = 0,
anim_speed = 2, anim_speed = 2,
@ -1890,9 +1931,8 @@ repair = powerup.new{
width = 12, width = 12,
height = 12 height = 12
}, },
center_x_off = 4, x_off = 4,
top_y_off = 0, y_off = 0,
bottom_y_off = 0,
sprites = sheen8x8, sprites = sheen8x8,
hitship = function(self, ship) hitship = function(self, ship)
if (ship ~= primary_ship) return false if (ship ~= primary_ship) return false
@ -1918,9 +1958,8 @@ gun_swap = powerup.new{
height = 16 height = 16
}, },
-- gun = gun_type.new{} -- gun = gun_type.new{}
center_x_off = 6, x_off = 6,
top_y_off = 0, y_off = 0,
bottom_y_off = 4,
width = 2, width = 2,
height = 2, height = 2,
sprites = {64, 66, 68, 70, 72, 74, 76, 78}, sprites = {64, 66, 68, 70, 72, 74, 76, 78},