#!/usr/bin/env octo-run :alias obtype v0 #Null entities have no behavior :alias obx v1 :alias oby v2 :alias obanim v3 :alias obdat1 v4 :alias obdat2 v5 :alias obdat3 v6 :alias obdat4 v7 :alias scratch1 v8 :alias scratch2 v9 :alias scratch3 va :alias scratch4 vb :alias param vc :alias this ve #Scratch aliases for loading a second object to compare or send messages :alias hitype v8 :alias hix v9 :alias hiy va :alias hianim vb :alias hithis vd : panic ; : breakpoint "panic" vf += 1 :macro swap A B { vf := A A := B B := vf } : init clear : main this := 0 sync clear hires hithis := 0 #Otherwise the game will act like it's paused. actob sync jump main #The entity buffer has 32 entries indexed by the receiver register "this." #At 1000 cycles per frame we get nearly 32 cycles per object if all are active. #The entity framework consumes half that iterating. If we are under capacity #you get a little extra headroom. : actob if this <= 239 then jump0 obtypes ; : nextob this += 8 if this >= 247 then this := 0 i := obdata i += this load obdat3 return #We want to push the current object while searching so we can be fast. #The hiob loses access to the extra data but you still have the param #register if you need it and you can always overwrite the low obtype #with hithis+offset if you need anything extra. : pushob i := obdata save obdat3 hithis := this this -= 8 i := obdata i += this load hianim return : popob #TODO: this can probably be improved this := hithis hithis := 8 i := scratchob save hianim i := scratchob i += hithis load obanim i := obdata i += this save obanim i := obdata i += this load obdat4 hithis := 0 return : killme obtype := 0 ; : spawnob i := regscratch save this this := 0 : spawnloop nextob if obtype == 0 begin i := obproto load obdat4 i := obdata i += this save obdat4 jump donespawn end if this <= 247 then jump spawnloop : donespawn i := regscratch load this return : sync loop vf := delay if vf != 0 then again # delay for up to 1/60th of a second # using the fixed-rate delay timer vf := 1 delay := vf return : regscratch 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 : scratchob 0 1 0 0 0 2 0 0x00 2 0 0 0 0 2 0 0x00 : playersprites 0x00 0x00 0x00 0x00 0x00 0x00 0x00 : arrow 0x40 0x20 0x90 0xFE 0x90 0x20 0x40 : explosionsprites 0x00 0x00 0x00 0x28 0x10 0x04 0x00 0x00 0x00 0x00 0x44 0x04 0x20 0x20 0x16 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x41 0x00 : bulletsprite 0b00000000 0b00000000 0b00010000 0b00000000 0b00000000 0b00010000 0b00101000 0b00010000 0b00000000 : obproto 0 0 0 0 0 0 0 0 #Object behavior : actnull if hithis != 0 then return nextob jump actob : shoot swap scratch3 v0 i := obproto v0 := 4 save v0 v0 := obx v0 += 6 save v0 v0 := oby save v0 v0 := param save v0 v0 := 58 save v0 spawnob swap scratch3 v0 return : actavatar i := playersprites i += obanim plane 1 sprite obx oby 7 if hithis != 0 then return if obanim != 8 then obanim := 8 scratch1 := OCTO_KEY_S if scratch1 key then oby += 1 scratch1 := OCTO_KEY_W if scratch1 key then oby -= 1 scratch1 := OCTO_KEY_F if scratch1 key begin if obdat1 == 0 begin param := obdat2 shoot obdat1 := 9 obdat2 += 4 if obdat2 > 64 then obdat2 := 0 end end if obdat1 > 0 then obdat1 -= 1 i := obdata i += this save obdat3 nextob jump actob : findcolbysprite pushob this := 0 : findcolloop nextob if obtype != 0 begin drawob if vf != 0 then jump donefindcolloop drawob end # if this != 0 then jump findcolloop : donefindcolloop param := this popob return : actexplosion i := explosionsprites i += obanim plane 2 sprite obx oby 8 if hithis != 0 then return obdat1 += 1 if obdat1 >= 7 begin obanim += 8 obdat1 := 1 end if obanim >= 24 then killme i := obdata i += this save obdat3 nextob jump actob : actbullet i := bulletsprite plane 3 sprite obx oby 3 if hithis != 0 then return if vf != 0 then jump bulletdeath param := obanim param >>= param param >>= param sincos obx += scratch1 oby += param obdat1 -= 1 if obdat1 == 0 then jump bulletdeath jump bulletdone : bulletdeath clear i := bulletsprite sprite obx oby 3 findcolbysprite obtype := 6 obanim := 1 obdat1 := 0 : bulletdone i := obdata i += this save obdat3 nextob jump actob : sincos scratch1 := 0b00001111 param &= scratch1 param <<= param swap param v0 swap scratch1 v1 i := sincostab i += v0 load v1 swap param v0 swap scratch1 v1 return : sincostab 3 0 2 1 2 2 1 2 0 3 -1 2 -2 2 -2 1 -3 0 -2 -1 -2 -2 -1 -2 0 -3 1 -2 2 -2 2 -1 #This will crash if not called from a pushed ob #If called on a null ob you'll leak call stack frames : drawob jump0 obtypes ; #The remaining entity tables consume half a kilobyte #REMEMBER THESE ARE TWO BYTES EACH!!!! : obtypes #Long jump table jump actnull #0 jump actavatar #2 jump actbullet #4 jump actexplosion #6 jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull jump actnull #object data buffer : obdata 0 1 0 0 0 2 0 0x00 2 0 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00 0 1 0 0 0 2 0 0x00 0 1 0 0 0 2 0 0x00 0 0 0 0 0 0 0 0x00 0 0 0 0 0 0 0 0x00