84 Commits

Author SHA1 Message Date
5870c129eb staggered "xp", "hp" labels in UI 2024-09-07 16:33:58 -07:00
68863280f3 stagger the bars 2024-09-07 16:17:38 -07:00
3f7c4f59c0 stretch meter area 2024-09-07 16:15:00 -07:00
804eb62ae7 p is now x in ui
"x" looks pretty bad with a drop shadow! will tweak soon anyway
2024-09-07 16:07:40 -07:00
303148876d Remove power mechanics. Replace with XP stub.
Also a few random comments and cleanups along the way.
2024-09-07 16:04:01 -07:00
b379e47dbf bonus shield powerup
mostly to test whether redistributing the shield and health meters works
2024-09-02 15:22:33 -07:00
4ca3913637 it's still tyrian-like so update last_tyrianlike 2024-09-02 15:09:27 -07:00
f9ba59d992 refactor mknew
saves tokens, harder to forget to use it
2024-09-02 15:08:58 -07:00
dd143060ac squash: refactor bullets to remove enemy flag
commit ead2a7d874
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Mon Sep 2 14:45:56 2024 -0700

    fix remaining `vulcan`-family bug

commit 571412b15e
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Mon Sep 2 14:15:56 2024 -0700

    fix chasey xl offsets

commit 907bd8318c
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Mon Sep 2 14:12:35 2024 -0700

    several more fixes, now runs to the end but shot offset is wrong

commit 7170552448
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Mon Sep 2 13:41:42 2024 -0700

    first three waves of bug fixes

commit 01ab6d3969
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Mon Sep 2 12:59:49 2024 -0700

    maybe the rest of the refactor?

commit 7869192dee
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Tue Aug 20 01:21:13 2024 -0700

    partial refactor continued

commit a4658e3ef4
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Mon Aug 19 16:00:16 2024 -0700

    halfway through bullet refactor
2024-09-02 14:46:51 -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
c5e49740c4 reorganize UI 2024-08-17 23:22:42 -07:00
59738d0376 use constraints to make chasey chase; now it is not wiggly 2024-08-16 19:48:44 -07:00
f736f50870 port improvements to autobrake_test too, excluding the weird calc_targets thing 2024-08-16 19:37:43 -07:00
ccb897af24 fix calculation 2024-08-16 19:37:05 -07:00
c130f4cf52 actually invoke calc_targets 2024-08-16 19:25:10 -07:00
cf48497432 ymin and ymax for player 2024-08-16 19:23:20 -07:00
9dc36a95ee port ship constraints logic 2024-08-16 19:20:30 -07:00
d33d7ad6d1 xmax constraint -- imperfect but good enough 2024-07-27 18:49:48 -07:00
00678f97fd Fix brake location calculation; was applying it to the wrong spot. 2024-07-27 17:47:29 -07:00
8fa98e3132 handle undershot and ok cases 2024-01-28 01:33:25 -08:00
5d2dafa64c I am baffled I never noticed this before 2024-01-27 13:25:47 -08:00
bd61ca2639 remove spark stub, not worth it in the test 2024-01-20 11:52:41 -08:00
54426be303 now it actually works! 2024-01-14 20:06:09 -08:00
84a803b828 fixed it! mostly 2024-01-14 20:02:45 -08:00
a4ed50d9e2 okay now i fucked it up differently 2024-01-14 19:59:51 -08:00
a1df463a16 braking distance and visualization. bad calculation
the visualization is really helpful for showing me that I fucked up my math
2024-01-14 19:57:22 -08:00
d0a17488d0 pull out calc_velocity
also prepare constraints to change color based on whether it changed the requested thrust
2024-01-14 19:33:57 -08:00
aa25f87c46 Full debug diagnostics display for autobrake_test 2024-01-14 19:03:34 -08:00
edbde8e689 ship mover, no constraint yet 2024-01-14 18:21:10 -08:00
5b668cf9c9 empty template for autobrake test cart 2024-01-12 11:14:54 -08:00
34af172ca5 Add code-of-conduct 2023-12-30 12:50:18 -08:00
4804402f32 fix search-and-replace damage from a while back
a batch change from ship to self broke the thing that kept the player on
the screen. also spawn_goodie got missed in the migration to `_ENV` for
looking up stuff by name.
2023-12-24 21:39:52 -08:00
97ddfb876b fix weird line break 2023-12-22 00:40:01 -08:00
fbeb313078 ignore vscode config 2023-12-21 23:30:17 -08:00
a359bc5031 duplicating the file -- preparing for major changes.
Vacuum Gambit is about to stop being a Tyrian clone. The hybrid of
Mega Man Battle Network and Slay the Spire mechanics lends itself better
to Galaga than Tyrian. updatedshmup.p8 remains an excellent basis for a
Tyrian-like shmup, especially since it has a (demo of a) level loading
engine that reads strings, and maybe I'll even implement something along
those lines someday -- but I'm about to tear it all down to build it up
again, starting with the entire model for levels and progress, followed
shortly by the "energy" system and its interaction with shields.

(long-term plan: shields will auto-recover after every "flotilla", but
health will be more difficult to recover. Player shots will be limited
entirely by ammo and cooldown, replacing the "burst throughput" vs.
"sustain throughput" system created by the generator, although some
enemy firing patterns may recreate that behavior.)

(plan for the "level" system: create Galaga-style flotillas. I think
ship behaviors can reasonably be declared in the 8 bits available in
sprite flags, meaning I can program simple enemies entirely from the
sprite sheet and draw flotillas on the map.)
2023-12-21 13:09:33 -08:00
cdf517c51c fix missing self plumbing 2023-12-20 18:16:55 -08:00
9aac99ef30 replace grab_butts with act
marshaling through a table is a waste of time, the duplication betweeen
positive and negative thrust vectors is pointless, and pre-multiplying
thrust complicates "stay in a box" goals later on.
2023-12-20 18:14:39 -08:00
5fef5bad00 Squash level_parser into main: parse levels in CSV
commit b91ebeb775
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Wed Dec 20 13:33:00 2023 -0800

    fix boss

    it works now except for a square being drawn in the shield. good enough

commit ab687f8f6d
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Wed Dec 20 13:23:29 2023 -0800

    adjust spawning

    now it runs for a little tiny bit!

commit bef95df6a1
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Wed Dec 20 13:18:20 2023 -0800

    typo

commit 24435a3c15
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Wed Dec 20 13:18:01 2023 -0800

    move guns before ships

commit 0c3a36f1fd
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Wed Dec 20 13:15:34 2023 -0800

    defer zap_gun creation until it exists

commit a39c419e5f
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Wed Dec 20 13:13:51 2023 -0800

    fix mknew

commit 9ef762268f
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Wed Dec 20 13:04:13 2023 -0800

    many assorted syntax errors

commit e50f516b11
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Wed Dec 20 12:00:34 2023 -0800

    allow strings when spawning guns

commit f9e28fa0e2
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Wed Dec 20 11:59:20 2023 -0800

    fix missing paren

commit 38a054dec1
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Wed Dec 20 11:48:08 2023 -0800

    candidate conversion to csv for level format

commit fd391ff3bc
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Wed Dec 20 11:40:11 2023 -0800

    use _ENV to get rid of level_events and spawns

commit fbd9f97429
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Wed Dec 20 11:33:59 2023 -0800

    maybe fix the level parser

commit 2a61e8b5d6
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Sun Oct 15 21:09:12 2023 -0700

    partial conversion to CSV-based levels, does not run yet

commit 4ccbe1dc35
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Fri Oct 13 01:02:43 2023 -0700

    okay honestly this all can and should just be CSVs

commit b536d2c987
Author: Kistaro Windrider <kistaro@gmail.com>
Date:   Sun Oct 8 00:41:24 2023 -0700

    base for representing a level as a string
2023-12-20 14:09:07 -08:00
2bbc4e598c clean up macOS garbage 2023-12-19 16:26:11 -08:00
62fe5f51d3 val helper function 2023-10-07 23:57:27 -07:00
fd68ef88ec document The Parser, take an emit function. 2023-10-07 23:53:40 -07:00
fd9866e963 The Parser 2023-10-03 22:41:52 -07:00
a5ce0fd020 update todo list 2023-10-01 14:39:34 -07:00
dae108c231 move spark_particle's mknew call to the right spot 2023-10-01 00:46:32 -07:00
2e46d87a84 refactor spark logic. this loses tokens; may need to revisit 2023-09-30 20:10:42 -07:00
a4590821be pre-initialize palettes for blip. costs tokens, saves time 2023-09-30 19:45:07 -07:00
cf1e1153a3 lframe increment is now 0x0.0001
avoids time rollover! not doing this for `distance` because I don't intend any level script to exceed five minutes, but freeze time could be much longer
2023-09-30 19:30:21 -07:00
f3ac1f492c Dithering-style fade
Higher performance, allows free use of other palettes, frees up compressed space.
2023-09-30 19:15:22 -07:00
fb95085bd9 declare bullet_base before bullets 2023-09-30 15:02:34 -07:00
6f9517cee1 complete conversion to new 2023-09-30 15:01:39 -07:00
8d5f697961 fix incomplete conversions 2023-09-30 14:27:43 -07:00
bad8452f3c migrate ships to mknew style 2023-09-30 14:24:31 -07:00
f49407baca move ship typedefs before ship impls 2023-09-30 14:11:36 -07:00
e8ed97be9e might as well offer a shortcut for that too 2023-09-30 14:07:54 -07:00
f4bcd11bed preserve extra args to puketh
useful for puking to the clipboard instead of the console
2023-09-30 14:07:23 -07:00
4ae0d05b47 actually fix indentation 2023-09-30 14:03:06 -07:00
a4bf3f616a fix indentation when puking up a linked list 2023-09-30 14:00:53 -07:00
8fb54ede26 fix list handling, add puketh 2023-09-30 13:59:07 -07:00
cb65a188a8 lua is not go 2023-09-30 13:50:39 -07:00
7c29c329b7 handle backreferences and linked lists in puke 2023-09-30 13:50:07 -07:00
f67c2da37f remove draw_debug since it doesn't work; add "puke" debug helper
linked lists don't have a measurable length. will use a persistent intangible for debug dumps in the future. `puke` however can be used at the CLI to dump a table. I need to write a `listpuke` variant too
2023-09-30 13:32:52 -07:00
da8a5b9589 update readme section 2023-09-30 13:06:34 -07:00
a58421bd19 once_next_frame helper
token and time inefficient for now, but might help reduce bugs later? dunno
2023-09-30 13:03:38 -07:00
e0b8386849 new events is now always valid to append to
also "vore" now resets the eaten list
2023-09-30 12:55:33 -07:00
2b02d2b94b fix blast projectile for rearranged checks 2023-09-30 12:52:58 -07:00
c90b56b603 fix obvious bugs
not working: ship bounds, "blast" weapon
2023-09-30 02:48:18 -07:00
2e8bba2a0e oops, tilde only means "not" in "not equals" 2023-09-30 02:18:19 -07:00
803062ef43 one-line if doesn't need end 2023-09-30 02:17:19 -07:00
b61fe936e3 lua ain't go 2023-09-30 02:16:24 -07:00
63c97d1bee fix handling pships as an arraylist 2023-09-30 02:15:05 -07:00
814149ceec methodize ship stuff, convert remaining add calls 2023-09-30 02:12:41 -07:00
3b8e86d0e7 drawgame via strip, remove bury_the_dead 2023-09-29 09:55:43 -07:00
1ba869b644 start replacing arrays with intrusive slists
`add` costs ten cycles. `push_back` isn't actually any better, but bury_the_dead can get pretty bad, especially for large arrays (like the bullets collections). also replacing the kill loop structure with the `strip` call removes a massive amount of code repetition that's costing me a lot of tokens. I think the final result is _probably_ actually slower because of function call overhead per iteration except when there are collisions on many frames; hopefully the headroom bought by the bucket collider is enough because I'm definitely going to need the tokens.
2023-09-29 01:10:16 -07:00
bd67006e3c todo -- rectfill 2023-09-23 09:56:55 -07:00
9 changed files with 5608 additions and 1024 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.DS_Store
.vscode/settings.json

244
autobrake_test.p8 Normal file
View File

@ -0,0 +1,244 @@
pico-8 cartridge // http://www.pico-8.com
version 41
__lua__
-- vacuum gambit automatic brake test
-- by kistaro windrider
function usplit(str)
return unpack(split(str))
end
function csv(s)
local ret = split(s, "\n")
for i, v in ipairs(ret) do
ret[i] = type(v) == "string" and split(v) or { v }
end
return ret
end
-- generate standard "overlay"
-- constructor for type tt.
-- if more is defined, generated
-- new calls more(ret) after
-- ret is definitely not nil
-- before calling setmetatable.
-- use to initialize mutables.
--
-- if there was a previous new,
-- it is invoked on the new
-- object *after* more, because
-- this works better with the
-- `more` impls i use.
function mknew(tt, more)
local mt, oldnew = { __index = tt }, tt.new
tt.new = function(ret)
if (not ret) ret = {}
if (more) more(ret)
if (oldnew) oldnew(ret)
setmetatable(ret, mt)
return ret
end
end
function _init()
pal(1,129,1)
the_ship = ship.new()
constraints:setup()
slomo = 1
sloc = 0
reroll()
end
function reroll()
frames=0
sloc=0
the_ship:reroll()
end
function _update60()
if (btnp(4)) reroll()
if (btnp(5)) constraints:cycle()
if (btnp(3)) slomo <<= 1
if (btnp(2)) slomo >>= 1
slomo = (slomo < 1) and 1 or (slomo > 8192) and 8192 or slomo
sloc += 1
if sloc >= slomo then
frames += 1
the_ship:update()
sloc=0
end
end
function _draw()
cls(1)
constraints:draw()
the_ship:draw()
print("frames: " .. frames, 4, 64, 7)
print("speed: 1/" .. slomo, 8, 70, 7)
print("thrust: ".. actual_t, 4, 80, 7)
meter(80, 80, 128, 84, actual_t/the_ship.thrust/2)
print("dx: ".. the_ship.dx, 20, 86, 7)
meter(80, 86, 128, 90, the_ship.dx/the_ship.maxspd/2)
print("x: "..the_ship.x, 24, 92, 7)
print("bx: "..gbx, 20, 98, 7)
print("xmin:"..tostr(constraints.xmin), 12, 108, 7)
print("xmax:"..tostr(constraints.xmax), 12, 114, 7)
end
function meter(x0, y0, x1, y1, frac)
local c = 11
if frac < 0 then
frac = -frac
c = 8
end
local range = x1-x0
local midpoint = x0 + (range/2)
rectfill(x0, y0-1, x0, y1+1, 13)
rectfill(midpoint, y0-1, midpoint, y1 + 1, 13)
local width = range * frac
if (width ~= 0) rectfill(x0, y0, x0 + width, y1, c)
end
-->8
-- ship
ship = {
maxspd=4,
thrust=0.25,
drag=0.0625,
y=32,
}
mknew(ship)
function ship:reroll()
self.x=rnd(128)
self.dx=rnd(2*self.maxspd)-self.maxspd
end
function ship:draw()
if self.x < -7 then
spr(2, 0, self.y-7)
spr(2, 0, self.y+8)
elseif self.x > 127 then
spr(2, 120, self.y-7, 1, 1, true)
spr(2, 120, self.y+8, 1, 1, true)
else
spr(1,self.x,self.y)
end
--if (self.dx == 0) return
local bd, f = brake_dist(self.dx, self.thrust + self.drag)
gbx = self.x+bd
spr(3, gbx-2,self.y-2)
print(tostr(f), gbx-2, self.y - 8, 14)
end
function calc_velocity(v0, t, vmax, drag)
v0 = mid(v0 + t, vmax, -vmax)
return v0 - mid(drag, -drag, v0)
end
function ship:update()
local t = btn(0) and -1 or btn(1) and 1 or 0
t *= self.thrust
t = constraints:constrain(self, t)
-- t = constraints:constrain(self, t)
-- t = constraints:constrain(self, t)
local s = calc_velocity(self.dx, t, self.maxspd, self.drag)
self.x += s
self.dx = s
actual_t = t
end
-->8
-- constraints
constraints = {
ymin=20,
ymax=52,
color=10
}
function constraints:constrain(s, want)
self.color=10
if (not self.xmin) return want
-- bmx: brake max
local v1, bmx = calc_velocity(s.dx, want, s.maxspd, s.drag), s.thrust + s.drag
local bd, bf = brake_dist(v1, bmx)
local bx, txm = s.x + bd + v1, self.xmax
if bx < self.xmin then
-- predicted brake point left
-- of xmin; apply max reverse
-- thrust, treat xmin as our
-- max target, and handle
-- overbraking by coalescing
-- with past +xmax case
self.color = 9
want = s.thrust
txm = self.xmin
v1 = calc_velocity(s.dx, want, s.maxspd, s.drag)
bd, bf = brake_dist(v1, bmx)
bx = bd + s.x + v1
end
if (bx <= txm) return want
self.color = 8
local overage = bx - txm
want -= overage/max(bf,1)
if (want < -s.thrust) want = -s.thrust
return want
end
function brake_dist(v0, brake_max)
local tri_frames = abs(v0\brake_max)
local chunks = tri_frames * (tri_frames - 1) >> 1
local chunk_zone = chunks * brake_max
local overage = abs(v0) - tri_frames * brake_max
return (chunk_zone + overage * (tri_frames + 1)) * sgn(v0), (overage > 0) and tri_frames + 1 or tri_frames
end
function constraints:cycle()
if self.ctype=="bounds" then
self.ctype="point"
elseif self.ctype=="point" then
self.ctype="off"
else
self.ctype="bounds"
end
self:setup()
end
function constraints:setup()
if self.ctype=="point" then
self.xmin = 64
self.xmax = 64
elseif self.ctype=="bounds" then
self.xmin = 32
self.xmax = 96
else
self.xmin = nil
self.xmax = nil
end
end
function constraints:draw()
if (not self.xmin) return
rect(self.xmin, self.ymin, self.xmax, self.ymax, self.color)
end
-->8
-- fx
-- todo: spark ring buffer
__gfx__
000000008000000000080000a000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000006666000080000009090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000067777600800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000675555758008888009090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000006750007508000000a000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000067777500080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000005555000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

1
code-of-conduct.md Normal file
View File

@ -0,0 +1 @@
Trans rights.

View File

@ -75,7 +75,7 @@ function updategame()
edeaths = {} edeaths = {}
for ip, ps in ipairs(pships) do for ip, ps in ipairs(pships) do
for ie, eb in ipairs(ebullets) do for ie, eb in ipairs(ebullets) do
if collides(hurtobx(ps), hurtbox(eb)) then if collides(hurtbox(ps), hurtbox(eb)) then
if (eb:hitship(ps)) add(edeaths, ie) if (eb:hitship(ps)) add(edeaths, ie)
if ps:hitbullet(eb) then if ps:hitbullet(eb) then
add(pdeaths, ip) add(pdeaths, ip)

2162
last_tyrianlike.p8 Normal file

File diff suppressed because it is too large Load Diff

61
the_parser.p8 Normal file
View File

@ -0,0 +1,61 @@
pico-8 cartridge // http://www.pico-8.com
version 41
__lua__
-- the parser
parser = {}
mknew(parser)
-- calls parse_into with a nop
-- emit function.
function parser:parse(str)
self:parse_into(str, function() end)
end
-- read a file of commands and
-- execute them, emitting the
-- results from each call into
-- `emit` as a table per row.
--
-- a "command" is a method on
-- self. a row alternates
-- commands with args. when
-- calling a command, it also
-- gets a table of previous
-- results as the first arg.
-- args are split on ','.
function parser:parse_into(str, emit)
for row in all(split(str, "\n")) do
local prev = {}
local sectors = split(row, ":")
for i=1,#sectors,2 do
local x = self[sectors[i]](self, prev, usplit(sectors[i+1]))
if (x) add(prev, x)
end
emit(prev)
end
end
-- saves prev[sel] as self.name.
-- if sel is unspecified, saves
-- all of prev (as a table).
function parser:saveas(prev, name, sel)
self[name] = sel and prev[sel] or prev
end
-- returns its args, ignoring
-- prev. Used to stuff things
-- into prev. args are packed
-- if there's multiple.
function parser:val(_, ...)
local ret := pack(...)
if (#ret == 1) return ret[1]
return ret
end
function parser:bind(_, fn, ...)
local f = self[fn]
return function()
f(...)
end
end

View File

@ -1,8 +1,8 @@
## 1. refine existing engine (knowing what I know now) ## 1. refine existing engine (knowing what I know now)
- [ ] rewrite event queue as a linked list - [x] rewrite event queue as a linked list
- [ ] rewrite animator stacks as linked lists - [x] rewrite animator stacks as linked lists
- [ ] rewrite ship/bullet collections as linked lists - [x] rewrite ship/bullet collections as linked lists
- [ ] update/draw mode switching system (high-efficiency version) - [ ] update/draw mode switching system (high-efficiency version)
- [ ] render ship shields (even for large ships) - [ ] render ship shields (even for large ships)
- [ ] duplicate file -- about to split away from Tyrian features - [ ] duplicate file -- about to split away from Tyrian features
@ -15,6 +15,7 @@
- [ ] remove weapon drops - [ ] remove weapon drops
- [ ] implement fallback pea shooter - [ ] implement fallback pea shooter
- [ ] implement turn timer (screen-height bar) - [ ] implement turn timer (screen-height bar)
- [ ] replace per-frame CLR with rectfill (saves time)
- [ ] implement extremely crude prototype for weapon select intermezzo - [ ] implement extremely crude prototype for weapon select intermezzo
- [ ] implement "deck" - [ ] implement "deck"
- [ ] implement basic weapon cards - [ ] implement basic weapon cards

File diff suppressed because it is too large Load Diff

2169
vacuum_gambit.p8 Normal file

File diff suppressed because it is too large Load Diff