completion_tracker={} add(modules,completion_tracker) function completion_tracker:init() cartdata("pyrex_fortunesfoundation_1") end function completion_tracker:reset() for i=0,63 do if (i!=59) dset(i,0) -- don't clear music pref flag end end function completion_tracker:get_metascore() local b0=dget"60" local b1=dget"61" local b2=dget"62" local b3=dget"63" return (b0<<8)+b1+(b2>>8)+(b3>>16) end function completion_tracker:incr_metascore() local ms=self:get_metascore() ms+=0x0.0001 dset(60,(ms>>8)&0xff) dset(61,(ms)&0xff) dset(62,(ms<<8)&0xff) dset(63,(ms<<16)&0xff) end function completion_tracker:get_completion_level() return dget(0) end function completion_tracker:advance_completion_level(clevel) dset(0,max(dget(0), clevel)) end function completion_tracker:get_music_preference() return dget(59)==0 end function completion_tracker:set_music_preference() if (dget(59)==0) dset(59,1) return dset(59,0) end -- TODO: Bitfield instead function completion_tracker:mark_seen(text_id) local ix,bit=self:_unpack_text_id(text_id) dset(ix,dget(ix)|bit) end function completion_tracker:was_seen(text_id) local ix,bit=self:_unpack_text_id(text_id) return dget(ix)&bit !=0 end function completion_tracker:_unpack_text_id(text_id) assert(text_id>0) assert(text_id<120) -- max 120 texts for now -- using bytes 1 through 15 local ix,bit=1+text_id\8,text_id%8 assert(ix<16) return ix,1<