From aaab67e0540563dd03180c0423d5b50aedfee016 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 15 Feb 2023 19:30:44 -0800 Subject: [PATCH] Modified celeste cart --- celeste/bin/carts/hackcel.p8 | 181 ++++++++++++++++++++--------------- 1 file changed, 103 insertions(+), 78 deletions(-) diff --git a/celeste/bin/carts/hackcel.p8 b/celeste/bin/carts/hackcel.p8 index 6a1f4c5..9db06ca 100755 --- a/celeste/bin/carts/hackcel.p8 +++ b/celeste/bin/carts/hackcel.p8 @@ -29,9 +29,16 @@ k_down=3 k_jump=4 k_dash=5 +-- HACK: used to slow down frame rate +frame_counter = 0 + -- entry point -- ----------------- + +-- HACK: wait function to slow down frame rate +function wait(a) for i = 1,a do flip() end end + function _init() title_screen() end @@ -46,7 +53,7 @@ function title_screen() start_game=false start_game_flash=0 music(40,0,7) - + -- HACK: skip title screen begin_game() @@ -104,9 +111,9 @@ dead_particles = {} -- player entity -- ------------------- -player = +player = { - init=function(this) + init=function(this) this.p_jump=false this.p_dash=false this.grace=0 @@ -123,20 +130,20 @@ player = end, update=function(this) if (pause_player) return - + local input = btn(k_right) and 1 or (btn(k_left) and -1 or 0) - + -- spikes collide if spikes_at(this.x+this.hitbox.x,this.y+this.hitbox.y,this.hitbox.w,this.hitbox.h,this.spd.x,this.spd.y) then kill_player(this) end - + -- bottom death if this.y>128 then kill_player(this) end local on_ground=this.is_solid(0,1) local on_ice=this.is_ice(0,1) - + -- smoke particles if on_ground and not this.was_on_ground then init_object(smoke,this.x,this.y+4) @@ -149,10 +156,10 @@ player = elseif this.jbuffer>0 then this.jbuffer-=1 end - + local dash = btn(k_dash) and not this.p_dash this.p_dash = btn(k_dash) - + if on_ground then this.grace=6 if this.djump maxrun then this.spd.x=appr(this.spd.x,sign(this.spd.x)*maxrun,deccel) else this.spd.x=appr(this.spd.x,input*maxrun,accel) end - + --facing if this.spd.x!=0 then this.flip.x=(this.spd.x<0) @@ -203,7 +210,7 @@ player = if abs(this.spd.y) <= 0.15 then gravity*=0.5 end - + -- wall slide if input!=0 and this.is_solid(input,0) and not this.is_ice(input,0) then maxfall=0.4 @@ -239,14 +246,14 @@ player = end end end - + -- dash local d_full=5 local d_half=d_full*0.70710678118 - + if this.djump>0 and dash then init_object(smoke,this.x,this.y) - this.djump-=1 + this.djump-=1 this.dash_time=4 has_dashed=true this.dash_effect_time=10 @@ -266,7 +273,7 @@ player = this.spd.x=(this.flip.x and -1 or 1) this.spd.y=0 end - + psfx(3) freeze=2 shake=6 @@ -274,24 +281,24 @@ player = this.dash_target.y=2*sign(this.spd.y) this.dash_accel.x=1.5 this.dash_accel.y=1.5 - + if this.spd.y<0 then this.dash_target.y*=.75 end - + if this.spd.y!=0 then this.dash_accel.x*=0.70710678118 end if this.spd.x!=0 then this.dash_accel.y*=0.70710678118 - end + end elseif dash and this.djump<=0 then psfx(9) init_object(smoke,this.x,this.y) end - + end - + -- animation this.spr_off+=0.25 if not on_ground then @@ -309,13 +316,13 @@ player = else this.spr=1+this.spr_off%4 end - + -- next level if this.y<-4 and level_index()<30 then next_room() end - + -- was on the ground this.was_on_ground=on_ground - + -- HACK: print player status printh( @@ -328,18 +335,18 @@ player = ) end, --121 then + if this.x<-1 or this.x>121 then this.x=clamp(this.x,-1,121) this.spd.x=0 end - + set_hair_color(this.djump) draw_hair(this,this.flip.x and -1 or 1) - spr(this.spr,this.x,this.y,1,1,this.flip.x,this.flip.y) + spr(this.spr,this.x,this.y,1,1,this.flip.x,this.flip.y) unset_hair_color() end } @@ -453,19 +460,19 @@ spring = { hit.djump=max_djump this.delay=10 init_object(smoke,this.x,this.y) - + -- breakable below us local below=this.collide(fall_floor,0,1) if below~=nil then break_fall_floor(below) end - + psfx(8) end elseif this.delay>0 then this.delay-=1 - if this.delay<=0 then - this.spr=18 + if this.delay<=0 then + this.spr=18 end end -- begin hiding @@ -486,13 +493,13 @@ end balloon = { tile=22, - init=function(this) + init=function(this) this.offset=rnd(1) this.start=this.y this.timer=0 this.hitbox={x=-1,y=-1,w=10,h=10} end, - update=function(this) + update=function(this) if this.spr==22 then this.offset+=0.01 this.y=this.start+sin(this.offset)*2 @@ -506,10 +513,10 @@ balloon = { end elseif this.timer>0 then this.timer-=1 - else + else psfx(7) init_object(smoke,this.x,this.y) - this.spr=22 + this.spr=22 end end, draw=function(this) @@ -599,7 +606,7 @@ smoke={ fruit={ tile=26, if_not_fruit=true, - init=function(this) + init=function(this) this.start=this.y this.off=0 end, @@ -622,7 +629,7 @@ add(types,fruit) fly_fruit={ tile=28, if_not_fruit=true, - init=function(this) + init=function(this) this.start=this.y this.fly=false this.step=0.5 @@ -903,7 +910,7 @@ orb={ max_djump=2 hit.djump=2 end - + spr(102,this.x,this.y) local off=frames/30 for i=0,7 do @@ -951,7 +958,7 @@ room_title = { if this.delay<-30 then destroy_object(this) elseif this.delay<0 then - + rectfill(24,58,104,70,0) --rect(26,64-10,102,64+10,7) --print("---",31,64-2,13) @@ -964,7 +971,7 @@ room_title = { print(level.." m",52+(level<1000 and 2 or 0),62,7) end --print("---",86,64-2,13) - + draw_time(4,4) end end @@ -1000,30 +1007,30 @@ function init_object(type,x,y) or obj.check(fall_floor,ox,oy) or obj.check(fake_wall,ox,oy) end - + obj.is_ice=function(ox,oy) return ice_at(obj.x+obj.hitbox.x+ox,obj.y+obj.hitbox.y+oy,obj.hitbox.w,obj.hitbox.h) end - + obj.collide=function(type,ox,oy) local other for i=1,count(objects) do other=objects[i] if other ~=nil and other.type == type and other != obj and other.collideable and - other.x+other.hitbox.x+other.hitbox.w > obj.x+obj.hitbox.x+ox and + other.x+other.hitbox.x+other.hitbox.w > obj.x+obj.hitbox.x+ox and other.y+other.hitbox.y+other.hitbox.h > obj.y+obj.hitbox.y+oy and - other.x+other.hitbox.x < obj.x+obj.hitbox.x+obj.hitbox.w+ox and + other.x+other.hitbox.x < obj.x+obj.hitbox.x+obj.hitbox.w+ox and other.y+other.hitbox.y < obj.y+obj.hitbox.y+obj.hitbox.h+oy then return other end end return nil end - + obj.check=function(type,ox,oy) return obj.collide(type,ox,oy) ~=nil end - + obj.move=function(ox,oy) local amount -- [x] get move amount @@ -1031,14 +1038,14 @@ function init_object(type,x,y) amount = flr(obj.rem.x + 0.5) obj.rem.x -= amount obj.move_x(amount,0) - + -- [y] get move amount obj.rem.y += oy amount = flr(obj.rem.y + 0.5) obj.rem.y -= amount obj.move_y(amount) end - + obj.move_x=function(amount,start) if obj.solids then local step = sign(amount) @@ -1055,7 +1062,7 @@ function init_object(type,x,y) obj.x += amount end end - + obj.move_y=function(amount) if obj.solids then local step = sign(amount) @@ -1159,16 +1166,16 @@ function load_room(x,y) elseif tile==12 then init_object(platform,tx*8,ty*8).dir=1 else - foreach(types, - function(type) + foreach(types, + function(type) if type.tile == tile then - init_object(type,tx*8,ty*8) - end + init_object(type,tx*8,ty*8) + end end) end end end - + if not is_title() then init_object(room_title,0,0) end @@ -1177,7 +1184,25 @@ end -- update function -- ----------------------- + +-- _update30 runs at 30 fps +-- _update60 does 60 fps +-- default for celeste is 30. + function _update() + --wait(10) + old_update() + --[[ + if frame_counter < 10 then + frame_counter+=1 + else + frame_counter = 0 + old_update() + end + ]]-- +end + +function old_update() frames=((frames+1)%30) if frames==0 and level_index()<30 then seconds=((seconds+1)%60) @@ -1185,18 +1210,18 @@ function _update() minutes+=1 end end - + if music_timer>0 then music_timer-=1 if music_timer<=0 then music(10,0,7) end end - + if sfx_timer>0 then sfx_timer-=1 end - + -- cancel if freeze if freeze>0 then freeze-=1 return end @@ -1208,7 +1233,7 @@ function _update() camera(-2+rnd(5),-2+rnd(5)) end end - + -- restart (soon) if will_restart and delay_restart>0 then delay_restart-=1 @@ -1222,10 +1247,10 @@ function _update() foreach(objects,function(obj) obj.move(obj.spd.x,obj.spd.y) if obj.type.update~=nil then - obj.type.update(obj) + obj.type.update(obj) end end) - + -- start game if is_title() then if not start_game and (btn(k_jump) or btn(k_dash)) then @@ -1247,10 +1272,10 @@ end ----------------------- function _draw() if freeze>0 then return end - + -- reset all palette values pal() - + -- start game flash if start_game then local c=10 @@ -1262,7 +1287,7 @@ function _draw() c=2 elseif start_game_flash>0 then c=1 - else + else c=0 end if c<10 then @@ -1309,29 +1334,29 @@ function _draw() -- draw terrain local off=is_title() and -4 or 0 map(room.x*16,room.y * 16,off,0,16,16,2) - + -- draw objects foreach(objects, function(o) if o.type~=platform and o.type~=big_chest then draw_object(o) end end) - + -- draw fg terrain map(room.x * 16,room.y * 16,0,0,16,16,8) - + -- particles foreach(particles, function(p) p.x += p.spd p.y += sin(p.off) p.off+= min(0.05,p.spd/32) rectfill(p.x,p.y,p.x+p.s,p.y+p.s,p.c) - if p.x>128+4 then + if p.x>128+4 then p.x=-4 p.y=rnd(128) end end) - + -- dead particles foreach(dead_particles, function(p) p.x += p.spd.x @@ -1340,20 +1365,20 @@ function _draw() if p.t <= 0 then del(dead_particles,p) end rectfill(p.x-p.t/5,p.y-p.t/5,p.x+p.t/5,p.y+p.t/5,14+p.t%2) end) - + -- draw outside of the screen for screenshake rectfill(-5,-5,-1,133,0) rectfill(-5,-5,133,-1,0) rectfill(-5,128,133,133,0) rectfill(128,-5,133,133,0) - + -- credits if is_title() then print("x+c",58,80,5) print("matt thorson",42,96,5) print("noel berry",46,102,5) end - + if level_index()==30 then local p for i=1,count(objects) do @@ -1386,7 +1411,7 @@ function draw_time(x,y) local s=seconds local m=minutes%60 local h=flr(minutes/60) - + rectfill(x,y,x+32,y+6,0) print((h<10 and "0"..h or h)..":"..(m<10 and "0"..m or m)..":"..(s<10 and "0"..s or s),x+1,y+1,7) @@ -1400,8 +1425,8 @@ function clamp(val,a,b) end function appr(val,target,amount) - return val > target - and max(val - amount, target) + return val > target + and max(val - amount, target) or min(val + amount, target) end