Something went wrong. Try again.
an npmx inspired game for PICO-8 npicomx.vinnymac.dev
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455-- data: constants & data tables
-- npicomx: npmx butterfly rescue game by vinnymac
-- ===== globals / data =====-- pk("a,b,c;d,e,f") -> {{a,b,c},{d,e,f}} (numeric). empty lists stay literal {}.function pk(s) local t={} for r in all(split(s,";")) do add(t,split(r)) end return t endbfly_seq=split"0,4,6,4" -- butterfly flap framesgpat={0x0000,0xa0a0,0xa5a5,0xf5f5,0xffff}fadep={0x0000,0xa000,0xa5a5,0xf5f5,0xffff}bc=split"8,9,10,11,12,14" -- balloon vertical-shade palette (was a local in draw_balloon)
-- flame dir vectors {advance_x,advance_y,perp_x,perp_y}. only up(0)/down(1) are used.-- to restore side l/r flames re-add: [2]={-1,0,0,1} (left) [3]={1,0,0,1} (right)du={[0]={0,-1,1,0},[1]={0,1,1,0}}-- em={x,y,dir} 0=up 1=down ; sp={cx,cy} spirals-- dec={type,x,y}: 1=candle 3=fire pit 4=roots 6=vinelevels={ {em=pk"252,71,0",sp={},dec=pk"1,55,27;1,140,19;1,220,25;1,300,21;1,368,28"}, {em=pk"196,71,0;232,56,1",sp={},dec=pk"6,84,30;6,156,30;6,268,30;6,332,30"}, {em=pk"88,72,1;128,55,0;320,71,0",sp=pk"280,64",dec=pk"3,176,95;3,236,95;1,40,23;1,356,23;4,70,30;4,216,30;4,306,30"}, {em=pk"84,72,1;112,55,0;148,72,1;184,55,0;228,72,1;304,71,0",sp=pk"248,64;280,56",dec=pk"1,40,23;3,170,95;1,330,23"}, {em={},sp=pk"130,58;195,52;255,70;315,62",dec={}}, -- cloud secret level (side-scroller: fireballs spread across the y38-86 tunnel + wind)}-- per-level scalars: bird,bx,by,ey,w (w default 48), read as lsc[lvl+1] in load_levellsc=pk"1,356,66,72,48;1,356,66,72,80;1,364,66,72,48;1,356,66,72,48;0,356,52,72,48"-- butterfly skin palette pairs: {color12_remap, color13_remap} + namessk_c=pk"12,13;8,9;11,3;10,14"sk_names=split("blue,ember,leaf,gold")bf_skin=0lvw=48shoutmsg=split("help!,save me,install me,not a virus,im scared,pick me!,deploy me")evilmsg=split("hehe,heart bleed,backdoor,malware,trojan,rm -rf,0-day,gotcha,pwned")overmsg=split("you are trapped in|dependency hell,the malware has spread,package size increased,all your secrets belong to us")pilepos=pk"48,90;57,90;66,90;57,82" -- crate-pile slot positions (right of the warning sign)-- intro monologue (level 1), '|' = line break (keep lines <=20 chars)dtext={ "packages are trapped|in dependency hell!", "i'll carry them to|the npmx balloon!", "some pkgs hide a|sneaky demon inside!", "drop demon pkgs to|save the ecosystem!",}
-- difficulty rows: flame_cad, devil_pct, hearts, timer_secs, demon_grace(frames)-- demon_grace: extra hold time (+3s/+2s/+0s easy/normal/hard) atop 45f base rattlediffs=pk"90,.15,4,90,120;60,.3,3,75,75;38,.45,2,60,6"diffnames=split"easy,normal,hard"diff=2
-- package name lists (popular = good; e18e+vulnerable = devils/burns)goodnames=split("nuxt,vue,nitro,astro,typescript,next,svelte,sveltekit,react,react-dom,vite,rollup,esbuild,turbo,pnpm,eslint,prettier,tailwindcss,zod,trpc,remix,solid,solid-js,qwik,preact,vitest,playwright,biome,unbuild,unplugin,vue-router,pinia,redux,zustand,jotai,valtio,swr,react-query,tanstack,jest,cypress,storybook,webpack,parcel,babel,swc,postcss,autoprefixer,sass,less,styled,emotion,clsx,classnames,framer-motion,gsap,three,d3,chart.js,ramda,rxjs,immer,date-fns,dayjs,luxon,axios,ky,got,node-fetch,undici,express,fastify,koa,hono,nestjs,graphql,apollo,prisma,drizzle,knex,sequelize,mongoose,typeorm,chalk,commander,yargs,inquirer,ora,chokidar,glob,nanoid,uuid,ws,socket.io")badnames=split("moment,lodash,underscore,qs,request,debug,rimraf,mkdirp,fs-extra,globby,fast-glob,execa,shortid,is-number,crypto-js,md5,bcrypt,jsonwebtoken,js-yaml,cosmiconfig,deep-equal,object-hash,extend,inherits,through,duplexer,emoji-regex,string-width,strip-ansi,wrap-ansi,is-odd,is-even,left-pad,querystring,clipboardy,find-up,read-pkg,path-exists,get-stream,array-flatten,jquery,object-assign,event-stream,flatmap-stream,eslint-scope,getcookies,ua-parser-js,coa,rc,node-ipc,colors,faker,bootstrap-sass,minimist,node-sass,crossenv,mongose,nodemailer,twilio-npm,fallguys,loadyaml,ansi-styles,color-convert,color-name,ansi-regex,slice-ansi,error-ex,is-arrayish,chalk-template,color-string,has-ansi,ctx,http-proxy,handlebars,marked,y18n,glob-parent,trim,tar")
if dbg then dbgt=0 end -- dbg-only state; --const dbg false strips this