From 9aac99ef30c99a548c24f389df6822e086cf3160 Mon Sep 17 00:00:00 2001 From: Kistaro Windrider Date: Wed, 20 Dec 2023 18:14:39 -0800 Subject: [PATCH] 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. --- updatedshmup.p8 | 120 ++++++++++++++++++------------------------------ 1 file changed, 44 insertions(+), 76 deletions(-) diff --git a/updatedshmup.p8 b/updatedshmup.p8 index 190d776..3e62746 100644 --- a/updatedshmup.p8 +++ b/updatedshmup.p8 @@ -397,23 +397,6 @@ function dropshadow(str, x, y, col) print(str, x, y, col) end -function grab_p1_butts() - if state ~= game then - local r = {0,0,0,0,0} - r[0] = 0 - return r - end - local b = btn() - return { - [0]=b&0x1, - [1]=(b&0x2)>>1, - [2]=(b&0x4)>>2, - [3]=(b&0x8)>>3, - [4]=(b&0x10)>>4, - [5]=(b&0x20)>>5 - } -end - -->8 --ship behavior @@ -448,12 +431,12 @@ end function ship_m:move() self:refresh_shield() self.power = min(self.max_power, self.power + self.generator) - butt = self:grab_butts() - if (butt[5] > 0) self:maybe_shoot(self.main_gun) - if (butt[4] > 0) self:maybe_shoot(self.special_gun) - if (butt[0]-butt[1] ~= 0 or butt[2]-butt[3] ~= 0) spark(self.sparks, self.x + 4*self.size, self.y + 4*self.size, butt, self.thrust, self.sparkodds) - self.xmomentum += (self.thrust * butt[1]) - (self.thrust * butt[0]) - self.ymomentum += (self.thrust * butt[3]) - (self.thrust * butt[2]) + local dx, dy, shoot_spec, shoot_main = self:act() + if (shoot_main) self:maybe_shoot(self.main_gun) + if (shoot_spec) self:maybe_shoot(self.special_gun) + if (dx ~= 0 or dy ~= 0) spark(self.sparks, self.x + 4*self.size, self.y + 4*self.size, dx*2.5, dy*2.5, self.sparkodds) + self.xmomentum += dx + self.ymomentum += dy self.xmomentum = mid(-self.maxspd, self.maxspd, self.xmomentum) self.ymomentum = mid(-self.maxspd, self.maxspd, self.ymomentum) @@ -869,16 +852,18 @@ player = ship_m.new{ thrust = 0.25, -- momentum added from button drag = 0.125, -- momentum lost per frame slip = false, -- does not slide down screen - grab_butts = function(self) -- fetch buttons - local butts = grab_p1_butts() - if butts[0] == butts[1] then - self.sprite = 1 - elseif butts[0] > 0 then - self.sprite = 17 + act = function(self) -- fetch buttons + local b,th = btn(),self.thrust + local blr = b&0x3 + if blr == 1 then + self.sprite=17 + elseif blr==2 then + self.sprite=18 else - self.sprite = 18 + self.sprite=1 end - return butts + --dx, dy, shoot_spec, shoot_main + return (((b&0x2)>>1) - (b&0x1)) * th, (((b&0x8)>>3) - ((b&0x4)>>2)) * th, (b&0x10) > 0, (b&0x20) > 0 end } mknew(player, @@ -912,18 +897,12 @@ frownie = ship_m.new{ thrust = 0.12, -- momentum added from button drag = 0.07, -- momentum lost per frame slip = true, - grab_butts = function(discard_self) - -- buttons are effectively analog - -- and negative buttons work just fine! - local butts = {} - local tstate = (1 + flr(4*t() + 0.5)) % 6 - butts[0] = ((tstate==1 or tstate==2) and 1) or 0 - butts[1] = ((tstate==4 or tstate==5) and 1) or 0 - for b=2, 5 do - butts[b]=0 - end - return butts - end, -- button fetch algorithm + act = function(self) + local tstate,dx = (1 + flr(4*t() + 0.5)) % 6,0 + if (tstate==1 or tstate==2) dx=-self.thrust + if (tstate>=4) dx=self.thrust + return dx,0,false,false + end, } mknew(frownie) @@ -962,10 +941,9 @@ spewy = frownie.new{ generator=0.5, fire_off_x=4, fire_off_y = 7, - grab_butts=function() - local butts=frownie.grab_butts() - butts[5]=1 - return butts + act=function() + local dx,dy,shoot_spec=frownie.act(self) + return dx, dy, shoot_spec, true end } mknew(spewy, function(ship) @@ -1000,12 +978,11 @@ mknew(chasey, function(ship) ship.main_gun=ship.main_gun or zap_gun.new{enemy=true} end) -function chasey:grab_butts() - local butts = {[0]=0,0,0,0,0,0} - if (self.x < primary_ship.x) butts[1] = 1 - if (self.x > primary_ship.x) butts[0] = 1 - if (self.x - 16 < primary_ship.x and self.x + 16 > primary_ship.x) butts[5] = 1 - return butts +function chasey:act() + local dx = 0 + if (self.x < primary_ship.x) dx=self.thrust + if (self.x > primary_ship.x) dx=-self.thrust + return dx, 0, false, self.x - 16 < primary_ship.x and self.x + 16 > primary_ship.x end xl_chasey=chasey.new{ @@ -1021,10 +998,10 @@ xl_chasey=chasey.new{ shield = 5, boss = true, slip = false, - grab_butts = function(self) - local butts = chasey.grab_butts(self) - if (self.y < 4) butts[3] = 1 - return butts + act = function(self) + local dx,dy,shoot_spec,shoot_main = chasey.act(self) + if (self.y < 4) dy=self.thrust + return dx,dy,shoot_spec,shoot_main end, draw = function(self) if(self.fx_pal) pal(self.fx_pal) @@ -1510,18 +1487,12 @@ like a player pushing buttons. the player ship actually reads buttons for this. -grab_butts - ship thrust control -based on btn() api. returns a -table indexed from 0..5 with -0 to not push this button and 1 -to push it. ships can use -fractional or out-of-range -numbers to get varying amounts -of thrust, including using -negative numbers for thrust in -the opposite direction. 4 and 5 -just check for nonzeroness to -attempt to fire. +act -- returns new acceleration: +dx, dy, shoot_spec, shoot_main. +dx and dy are change in momentum +in px/frame. this is controls +only -- friction is handled in +ship:move (`drag` value). ships hitting another ship take 1 damage per frame of overlap. @@ -1800,9 +1771,7 @@ function boom(x,y,boominess,is_boss) local boombonus = min(0.05 * boominess, 1.25) for _=1,boominess do local angle = rnd(1) - local butts = {0, sin(angle), 0} - butts[0] = cos(angle) - spark(sp,x+4,y+4,butts,boombase+rnd(boombonus),1, true) + spark(sp,x+4,y+4,cos(angle), sin(angle),boombase+rnd(boombonus),1, true) end return end @@ -1822,17 +1791,16 @@ function spark_particle:draw() pset(self.x,self.y,self.sprs[self.sidx]) end -function spark(sprs, x, y, butts, thrust, odds, fg) +function spark(sprs, x, y, dx, dy, odds, fg) if (sprs==nil or flr(rnd(odds)) ~= 0) return - thrust *= 2.5 local target = fg and intangibles_fg or intangibles_bg target:push_back(spark_particle.new{ x = x + rnd(4) - 2, y = y + rnd(4) - 2, sprs = sprs, sidx = 1, - dx = (butts[0] - butts[1]) * thrust + rnd(2) - 1, - dy = (butts[2] - butts[3]) * thrust + rnd(2) - 1, + dx = dx + rnd(2) - 1, + dy = dy + rnd(2) - 1, }) end -->8