Jump to content
SteveB

ScuttleButt - Behind Enema Lines

Recommended Posts

This posting by Alex @HOME AUTOMATION in the thread of @Retrospect hilarious "Deluxe Butt-Plug Simulator" brought the 2018 Sinclair Spectrum game of Scuttlebutt to my attention. I liked the video so much that I thought about a possible port to the TI-99/4a. I contacted the author Karl Hörnell and he was so kind to send me the original artwork of the game.

 

  • Beautiful Graphics: Karl
  • Simple Graphics: Me

 

I chose to use the character/tile graphics, so the background isn’t as seamless as in the original, the compiled XB256 BASIC is not as fast and flexible as the assembly original, so I made some adjustments. And I adopted the subtitle from the C64 version because I liked it.

 

A giant posterior has turned up in your livingroom and intends to make a mess. Move left and right to catch the waste in your bucket.

The bucket has limited capacity. Empty it in the toilet now and then so that it doesn't overflow. Good luck!

ScuttleButt.png.5aeb9054aaad77f95b2d58fd669a6cfd.png 


The game is written in Structured Extended BASIC (SXB), getting translated to Standard Extended BASIC by the free TiCodEd Development Environment.

Control your player with "S" for left and "D" for right. Remember to dump the content of your bucket to the toilet on the right before it overflows.

 

 

Enjoy the game,

Steve

// ScuttleButt
//
// Original Game and Graphics by Karl Hörnell 2018
// Adapted for the TI-99/4a by Stefan Bauch 2022
//
//

DIM SC(6,31), SH(2),P1$(7),P2$(7),TX$(2)

GOSUB GameInit
REPEAT
  GOSUB StartGame
  REPEAT
    CALL turn(8)  :: dir = 1 :: lm = MIN(144,RND*(144-bx))
    REPEAT
      CALL KEY(3,k,s)
      IF s<>0 THEN BEGIN
        // walk right
        IF k=68 THEN BEGIN
           IF c=0 THEN IF P<22 THEN CALL DrCol(p,4) ELSE GOSUB EmptyBucket
           IF c=3 THEN CALL RemCol(p,0,SC(,))
           IF c=4 THEN CALL DrCol(p,5)
           IF c=7 THEN GOSUB MoveRight
           c = c + 1
        END
        // walk left
        IF k=83 THEN BEGIN
           IF c=4 THEN CALL DrCol(p,0)
           IF c=1 THEN CALL RemCol(p,4,SC(,))
           IF c=5 THEN CALL RemCol(p,5,SC(,))
           IF c=0 AND P>1 THEN GOSUB MoveLeft
           c = c - 1
        END
        IF c<0 THEN c=0
        CALL VWRITE(4872,P1$(C),5040,P2$(C))
      END
      GOSUB CheckButt
    UNTIL MI=3 OR TurdC=0
    CALL UnShit(sh(),turd)
    CALL Turn(0)
    IF MI<3 THEN BEGIN
      bf = 0 :: CALL bucket(bf)
      CALL Disply(8,7,"Well|done")
      CALL Disply(10,5,"Wave|00|cleared")
      CALL DisVal(10,10,2,lv)
      FOR i=1 TO 10
        CALL SOUND(100,220,4)
        score = score + 1
        CALL DISVAL(2,28,4,Score)
        CALL SOUND(50,220,30)
      NEXT i
      GOSUB UpperClear
      lv = lv +1 :: CALL DisVal(8,29,2,lv)
      GOSUB LevelPar
      CALL LOCATE(#9,240,1) :: txl=10+RND*(60-MIN(lv,30))
    END
  UNTIL MI=3
  // game over
  CALL disply(8,9,"GAME|OVER")
  REPEAT
    CALL KEY(3,k,s)
  UNTIL s=1
  FOR i=0 TO 5
    CALL RemCol(p,i,SC(,))
  NEXT i
  CALL HCHAR(24,1,0,27)
UNTIL k=78 OR k=88
END


CheckButt:
  CALL POSITION(#1,by,bx)
  IF dir=-1 AND bx<lm THEN CALL turn(8)  :: dir = 1 :: lm = bx+RND*(144-bx)
  IF dir= 1 AND bx>lm THEN CALL turn(-8) :: dir =-1 :: lm = 25+RND*(bx-25)

  CALL POSITION(#9,ty,tx)
  IF tx>txl AND turd>0 THEN BEGIN
    CALL LOCATE(#9,240,1) :: txl=10+RND*(60-MIN(lv,30))
    IF sh(0)=0 THEN CALL poop(0,sh(),bx) ELSE IF tsim>1 AND sh(1)=0 THEN CALL poop(1,sh(),bx) ELSE IF tsim>2 AND sh(2)=0  THEN CALL poop(2,sh(),bx) ELSE turd = turd +1
    turd = turd -1
  END

  FOR sn=0 TO 2
    CALL POSITION(#5+sn,sy,sx)
    IF sy>140 AND sh(sn) THEN IF sy<161 AND sx>p*8+c*2 AND sx<p*8+c*2+25 AND bf<6 THEN
       GOSUB catch ELSE IF sy>180 THEN GOSUB miss
  NEXT sn
RETURN

Catch:
  CALL SOUND(250,880-(bf=4)*880-(bf=5)*2640,0)
  score=score+1
  TurdC = TurdC - 1
  CALL DISVAL(2,28,4,Score)
  sh(sn)=0
  CALL DELSPRITE(#5+sn)
  bf = bf +1
  CALL bucket(bf)
RETURN

miss:
  CALL SOUND(500,110,0,110,30,830,30,-4,0)
  CALL UnShit(sh(),turd)
  CALL freeze
  MI = MI + 1
  CALL HCHAR(11,29,120,MI)
  GOSUB SPRITE11
  p = p - 2
  GOSUB MoveRight
  CALL RemCol(p,4,SC(,))
  CALL RemCol(p,5,SC(,))
  CALL delay(2000)
  IF MI<3 THEN CALL thaw :: GOSUB SPRITE00
  bf=0 :: CALL bucket(bf)
RETURN

MoveRight:
  CALL RemCol(p,1,SC(,))
  P = P + 2
  C = -1
  CALL window(18,p,23,p+3)
  CALL disply(18,p,PR$,0)
  CALL window
  IF p<20 THEN CALL Disply(24,P-2,FT$) ..
          ELSE CALL Disply(24,P-2,seg$(FT$,1,29-P))
RETURN

MoveLeft:
  P = P - 2
  C = 8
  CALL window(18,p+1,23,p+5)
  CALL disply(18,p+1,PL$,0)
  CALL window
  IF P=1 THEN CALL Disply(24,1,seg$(FT$,3,7)) ELSE
    IF p<20 THEN CALL Disply(24,P-2,FT$) ..
            ELSE CALL Disply(24,P-2,seg$(FT$,1,29-P))
RETURN

EmptyBucket:
  REPEAT
    IF s<>0 THEN BEGIN
      // walk right
      IF k=68 AND c<3 THEN BEGIN
         IF c=0 THEN CALL DrCol(p,4)
         IF c=1 THEN CALL DrCol(p,5)
         c = c + 1
      END
      // walk left
      IF k=83 THEN BEGIN
         IF c=2 THEN CALL RemCol(p,5,SC(,))
         IF c=1 THEN CALL RemCol(p,4,SC(,))
         c = c - 1
      END
      IF C>0 THEN ON C GOSUB SPRITE08, SPRITE09, SPRITE10
    END
    GOSUB CheckButt
    IF c=3 AND bf>0 THEN CALL SOUND(300,-7,10) :: bf = bf - 1 :: CALL bucket(bf)
    CALL KEY(3,k,s)
  UNTIL c<1
  CALL VWRITE(4872,P1$(0),5040,P2$(0))
RETURN


StartGame:
  CALL DISPLY(4,8,"SCUTTLEBUTT")
  CALL DISPLY(6,5,"Behind|Enema|Lines")
  i=1 :: j=0
  tx$(0) = "Press|any|key|||||||TI|Port|by|Stefan|Bauch||||||Original|Game|by|Karl|H}rnell|"
  tx$(1) = "This|giant|posterior|has|turned|up|in|your|livingroom|and|intends|to|make|a|mess.|Move|left|and|right|to|catch|the|waste|in|your|bucket.|"
  tx$(2) = "The|bucket|has|limited|capacity.|Empty|it|in|the|toilet|now|and|then|so|that|it|does|not|overflow.|Good|luck.|"
  REPEAT
    a$=seg$("||||||||||||||||||||||||||"&TX$(j),i,26)
    IF i>LEN(tx$(j))+25 THEN i=1 :: j=j+1 ELSE i=i+1
    IF j=3 THEN j=0
    CALL disply(10,1,a$)
    CALL delay(150)
    CALL KEY(3,k,s)
  UNTIL s=1

  GOSUB UpperClear
  IF score>hsc THEN CALL DisVal(5,28,4,score) :: hsc=score
  P = 9 :: C = 0 :: txl = 60
  LV = 1 :: MI = 0
  Score = 0 :: bf = 0
  CALL VWRITE(4872,P1$(0),5040,P2$(0))
  GOSUB ScoreTab
  GOSUB LevelPar
  GOSUB MoveRight
  CALL SPRITE(#9,88,3,240,1,0,10)
RETURN


GameInit:
  CALL SCRN2
  CALL SCREEN2(16)
  CALL COLOR2(81,16,16)
  CALL HCHAR(1,1,0,384)

  // Define Room Characters
  FOR C=1 TO 68::READ CN,CC$::CALL CHAR2(CN,CC$)::NEXT C

  CALL DISPLY(4,8,"SCUTTLEBUTT")

  // Draw Room
  FOR Y=0 TO 11
    FOR X=0 TO 31
      READ CP :: CALL VCHAR(Y+13,X+1,CP) :: SC(MAX(0,Y-5),X)=CP
    NEXT X
  NEXT Y

  CALL VCHAR(1,27,129,12)
  GOSUB ScoreTab
  CALL COLOR2(81,2,16)

  FOR i=0 TO 5
    FOR j=0 TO 3
      PR$=PR$&CHR$(1+j*7+i)
    NEXT j
  NEXT i

  FOR i=0 TO 5
    FOR j=1 TO 5
      PL$=PL$&CHR$(1+j*7+i)
    NEXT j
  NEXT i

  // Prepare Butt
  CALL MAGNIFY(3)
  CALL CHAR(100,"C0C8D0C0E079333C1E07070101000000000000000000081010C3D8F0FE7F0700")
  CALL CHAR(104,"000000000000002040000C4042F3FF3F00000000000000021A00032F7FFEE800")
  CALL CHAR(108,"00000006066C1C9C78F0E0E2FDFF0F0000000000000000000404C00B0FFFFC00")
  CALL CHAR(112,"00000100020009038F1FF8F0E0C000003030F070E0E0C0E00080000000000000")
  CALL SPRITE(#1,100,2,1,64,#2,104,2,1,80,#3,108,2,1,96,#4,112,2,1,112)
  // prepare shit and bucket
  CALL CHAR(116,"081C366DDBB6ED7F000000000000000000000000808080000000000000000000")
  CALL SPRITE(#8,120,15,113,225)

  // buffer 8 most used character definitions in CPU-RAM for speed
  FOR i=0 TO 7
    FOR j=1 TO 42
      CALL CHAR2(j,"00")
    NEXT j
    ON i+1 GOSUB SPRITE00, SPRITE01, SPRITE02, SPRITE03, SPRITE04, SPRITE05, SPRITE06, SPRITE07
    CALL VREAD(4872,168,P1$(i),5040,168,P2$(I))
  NEXT i

  // row 24 ... feet string
  ft$ = chr$(0)&chr$(0)&chr$(7)&chr$(14)&chr$(21)&chr$(28)&chr$(35)&chr$(42)&chr$(0)&chr$(0)
RETURN

LevelPar:
  CASE lv OF
    1 : turd = 5
    2 : turd = 8
    ELSE turd = lv * 2 + 4
  ENDCASE
  TurdC = turd

  tsim = 1
  IF lv > 4 THEN tsim = 2
  IF lv > 9 THEN tsim = 3
RETURN

UpperClear:
  FOR i=1 TO 12
    CALL HCHAR(i,1,0,26)
  NEXT i
RETURN

ScoreTab:
  CALL DISPLY(1,28,"Score")
  CALL DISVAL(2,28,4, Score)
  CALL DISPLY(4,28,"High")
  CALL DISVAL(5,28,4,hsc)
  CALL DISPLY(7,28,"Wave")
  CALL DISVAL(8,29,2,lv)
  CALL DISPLY(10,28,"Fail")
  CALL DISPLY(11,29,"ooo")
  CALL HCHAR(11,29,120,MI)
  CALL bucket(bf)
  CALL HCHAR(24,1,0,27)
RETURN


SPRITE00:
  CALL CHAR2( 1,"00000000011F3E3A625C808083878787474020386778BC9E87838180406060383F3F3F3E1010101010100808080804040201000F344282FF")
  CALL CHAR2( 8,"00000070880404040C0402FFE0F8F090382F4841C06021B25CC4830303070F1FF8F080000708101020202020101008080402CEFCE20262DE")
  CALL CHAR2(15,"0000000000000000000000FF0047A0E060B058CC47C100000000FFFCFEFEFFFF7F1E0000C020101008080808081010202040733F4740467B")
  CALL CHAR2(22,"0000000000000000000000FF01FF02020D111D1109EE3C181010E0000000000080C04040402020202020202020204040808000F02C4241FF")
RETURN

SPRITE01:
  CALL CHAR2( 1,"0000000000070F0E18172020202121211110080E191E2F27212020201018180E0F0F0F0F0404040404040202020202010101000F344282FF")
  CALL CHAR2( 8,"0000001C62C181818301003FF8FEFCE4CE0B1210F01808ACD7F1600000010307FEFCE08000000306040C080808040404020282FCE20262DE")
  CALL CHAR2(15,"0000000000000000000080FF0011283818EC1673113040800000FFFFFFFFFFFF0F01000000F8060101000000000101020203040404070000")
  CALL CHAR2(22,"0000000000000000000000FF00FF000003040704C27B0F060404F8008080C0C0E090100808040402828282828204040408FF720464BF0000")
  CALL CHAR2(29,"0000000000000000000000C040C0808040404040408000000000000000000000000000000000000000000000000000000000C02010F00000")
RETURN

SPRITE02:
  CALL CHAR2( 1,"00000000000001030306050808080808080404020306070B0908080808040606030303030301010202020202020202010101000F344282FF")
  CALL CHAR2( 8,"000000000718F0E0A020C0000F3E7F7F79730204847C86C2EB753C180000000081FFFFF8E00003040408080808040406020282FCE20262DE")
  CALL CHAR2(15,"000000000080404040C04020FF00840A0E86FB851C040C1020C0403F3F3F7FFFFF83000000F8070000000000000000000000000000000000")
  CALL CHAR2(22,"000000000000000000000000FF007F0000000181C1701E03010101FEC0E0E0F0F0F8640201018141404040414181C63F4740467B00000000")
  CALL CHAR2(29,"000000000000000000000000F010F02020D010D01090E0C08000000000000000000000000000000080808000000000F02C4241FF00000000")
RETURN

SPRITE03:
  CALL CHAR2( 2,"000001010202020202020101000001010202020202020101000000000000000000000000000000000000000F344282FF")
  CALL CHAR2( 8,"000000000001067CF8E8887000030F1F1F1E1C0081E19FE1F07A1D0F0600008080E0FFFFFEF840404040808081818282828282FCE20262DE")
  CALL CHAR2(15,"0000000000C020101010301008FF80E1C243E1BE2107018384C870100F0F0F1F3F7FE1C0000000001F608080000000000000000000000000")
  CALL CHAR2(23,"0000000000FF001F808080C060301C0700000000FFF0F8F8FCFCFE1E0100000000E01008080404040403040404070000")
  CALL CHAR2(30,"0000000000FC04FC08083444744424B8F0604040800000000000000000808040202010101010080810FF720464BF0000")
  CALL CHAR2(42,"0000C02010F00000")
RETURN

SPRITE04:
  CALL CHAR2( 7,"0000000F344282FF")
  CALL CHAR2( 8,"00000000000000011F3E3A625C808083878787474020386778BC9E87838180406060383F3F3F3E1010202040408181818282CEFCE20262DE")
  CALL CHAR2(15,"00000000000070880404040C0402FFE0F8F090382F4841C06021B25CC4830303070F1FF8F080000708106080800000000000000000000000")
  CALL CHAR2(23,"000000000000FF0047A0E060B058CC47C100000000FFFCFEFEFFFF7F1E0000C030080402010100000000000000000000")
  CALL CHAR2(30,"000000000000FF01FF02020D111D1109EE3C181010E0000000000080C04020101008080402028281C141733F4740467B")
  CALL CHAR2(42,"000000F02C4241FF")
RETURN

SPRITE05:
  CALL CHAR2( 7,"00000304080F0000")
  CALL CHAR2( 8,"00000000000000070F0E18172020202121211110080E191E2F27212020201018180E0F0F0F0F1010202040404020203018FF4E2026FD0000")
  CALL CHAR2(15,"00000000001C62C181818301003FF8FEFCE4CE0B1210F01808ACD7F1600000010307FEFCE0800007186080804040602040C0202020E00000")
  CALL CHAR2(23,"0000000080FF0011283818EC1673113040800000FFFFFFFFFFFF1F07000000E018040201010000000000000000000000")
  CALL CHAR2(30,"0000000000FF00FF000003040704C27B0F060404F8008080C0C0E0A01018080804040402828242414141733F4740467B")
  CALL CHAR2(37,"0000000000C040C08080404040404080000000000000000000000000000000000000000000000000000000F02C4241FF")
RETURN

SPRITE06:
  CALL CHAR2( 8,"00000000000001030306050808080808080404020306070B09080808080406060303030307080810101008080403000F344282FF00000000")
  CALL CHAR2(15,"000000000718F0E0A020C0000F3E7F7F79730204847C86C2EB753C180000000081FFFFF8E00106081010080C0301C2FCE20262DE00000000")
  CALL CHAR2(22,"000000000080404040C04020FF00840A0E86FB851C040C1020C0403F3F3F7FFFFF87010000F8040201010000000000000000000000000000")
  CALL CHAR2(30,"00000000FF007F0000000181C1701E03010101FEC0E0E0F0F0F8E8040402020201018181404040404040213F4740467B")
  CALL CHAR2(37,"00000000F010F02020D010D01090E0C0800000000000000000000000000000000000000080808080808000F02C4241FF")
RETURN

SPRITE07:
  CALL CHAR2( 9,"0101020202020202010100000101020202020202010101000000000000000000000000000000000000000304080F0000")
  CALL CHAR2(15,"00000001067CF8E8887000030F1F1F1E1C0081E19FE1F07A1D0F0600008080E0FFFFFEF840408080808181814040203018FF4E2026FD0000")
  CALL CHAR2(22,"000000C020101010301008FF80E1C243E1BE2107018384C870100F0F0F1F3F7FE1C0000006394080800000008080406020C0202020E00000")
  CALL CHAR2(30,"000000FF001F808080C060301C0700000000FFF0F8F8FCFCFE7A02010101804040402020202020204040733F4740467B")
  CALL CHAR2(37,"000000FC04FC08083444744424B8F060404080000000000000000000000080808080404040404040808000F02C4241FF")
RETURN


// Frames for dumping to toilet
SPRITE08:
  CALL CHAR2( 1,"000000000001070908172020202121211110081E3F27614040404060787F7F3F3F3F3F3E1010101010100808080804040201000F344282FF")
  CALL CHAR2( 8,"0000001E21C000C0C183003FFEFECF98E0000103CDB0E37C000000000007FFFFFCF0C0000708101020202020101008080402CEFCE20262DE")
  CALL CHAR2(15,"0000000000808081820382840404098A8C9C9810D0F8860101030E3EFEFEFFFF7F1E0000C020101008080808081010202040733F4740467B")
  CALL CHAR2(22,"0000000000000080403088342B10109190F01008681C34C60301C2241800000080C04040402020202020202020204040C08000F02C4241FF")
  CALL CHAR2(29,"FFFFFFFFFFFFFFFFFFFFFFFFFFFF7F9F4F33090403071F3F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")
RETURN

SPRITE09:
  CALL CHAR2( 1,"00000000000001030604080808080808040402070F0818103020303C3F3F3F3F3F3F3F3F1010101010100808080804040201000F344282FF")
  CALL CHAR2( 8,"000000010678C030F830000F3F7F7361621C0080F3EC3F0000000000C0FFFFFFFCF8C0000708101020202020101008080402CEFCE20262DE")
  CALL CHAR2(15,"0000008060101010106020E08080C020202040F13E7880000000030F3FFFFFFF3F0E0000C020101008080808081010202040733F4740467B")
  CALL CHAR2(22,"00000000000000000000000102041820509F908380414324386090101F80808080C04040402020202020202020204040C08000F02C4241FF")
  CALL CHAR2(29,"FFFFFFFFFFFFFFFFEFC7A703132B11111130A0A2A221212120301010FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000")
  CALL CHAR2(36,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F3FBFBF9F5FFFFFFFFF000000FF00000000808080C0C0E0F8FE0708102040601F00")
RETURN

SPRITE10:
  CALL CHAR2( 1,"0000000000000000000001010101010100000000010306040C0C0F0F1F1F1F1F1F3F3F3E1010101010100808080804040201000F344282FF")
  CALL CHAR2( 8,"00000000001F3046C38E0001070F0F0F8C8C43E0FE1D0300000000E0FEFFFFFFFFFCE0000708101020202020101008080402CEFCE20262DE")
  CALL CHAR2(15,"000000003CC2010181020CC4FCF0E8141422C60F37C3FF00000000001FFFFFFF1F070100C020101008080808081010202040733F4740467B")
  CALL CHAR2(22,"0000000000000000000000000000000000010107098AF02020201013FCE4E3E0E0C0C040402020202020202020204040C08000F02C4241FF")
  CALL CHAR2(29,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000C02070101021C10302020684E4F4FEFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000")
  CALL CHAR2(36,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF909030363A3478787072F2F2F5F5F000000FF00000000808080C0C0E0F8FE0708102040601F00")
RETURN


// Frame screaming
SPRITE11:
  CALL CHAR2( 1,"00000000000000000001010202020202010102060F17234141C183838783838182424221110F081010202010100808040201000F344282FF")
  CALL CHAR2( 8,"0000000F10202060D000030F1F3F3F3C180080601F0284C8F8FF00C28587C37D420E02060890E0203F204040201008080402CEFCE20262DE")
  CALL CHAR2(15,"0000008040202020500804C4E4F2F2F264040E33E387472F1FFF003F00000081C160380F01000000FF080404080810202040733F4740467B")
  CALL CHAR2(22,"000000000000000000000000000000000000000080C0A09008FC0CFA1211E909C989E98AFCD090880808101010204040808000F02C4241FF")
  CALL CHAR2(35,"",42,"")
RETURN


RoomChar:
DATA 128,"FFFF00000000FFFF",129,"C0C0C0C0C0C0C0C0",130,"0303030303030303",131,"1F18181818181F00"
DATA 132,"F81818181818F800",133,"FF0000000000FF00",134,"FF0000180000FF00",135,"E72424242424E700"
DATA 136,"0808080808080808",137,"1010101010101010",138,"91CBC3BD99FF0000",139,"99999999BDC3D389"
DATA 140,"C3C3C3C3C3C3C3C3",141,"9999999999999999",142,"0000FF9999999999",143,"88888486818080FF"
DATA 144,"00000000FF0000FF",145,"11112161810101FF",146,"9090909090909090",147,"3F40808186848888"
DATA 148,"FF0000FF00000000",149,"FC02018161211191",150,"0909090909090909",151,"03060C181C0E0600"
DATA 152,"88888486818080FF",153,"FF80809F90909090",154,"FF0101F909090909",155,"09090909F90101FF"
DATA 156,"909090909F8080FF",157,"00FC848C848C8484",158,"000E3860C0033620",159,"FFFFFFFFFFFFFFFF"
DATA 160,"4242420404C43800",161,"3C4080800007F800",162,"000000000000FF00",163,"0708102040601F00"
DATA 165,"808080C0C0E0F8FE",166,"000000FF00000000",167,"020402042854AA00",168,"8141414143434303"
DATA 169,"F3F3F9F9F9F9F9FF",170,"E7E7F3F3F3F3F3F3",171,"FFFFE7E7E7E7E7E7",172,"0000FF001C14141C"
DATA 173,"8989898989898989",174,"9191919191919191",175,"89F98F818181F18F",176,"939DF18181838DF1"
DATA 177,"2424242424242424",178,"8080808080808080",179,"0101010101010101",180,"3C76CDA589A589A5"
DATA 181,"F7DCBAACE8B8F0B0",182,"EF7B5D35171D0F0D",183,"20FFFBFB763C3C7E",184,"2020101008040300"
DATA 185,"A41448289020C000",186,"06090605027F407F",187,"18996A9C5DFF00FF",188,"60B05090A0FE02FE"
DATA 189,"102A64AA56341818",190,"FFFF3F3F3F9F9F9F",191,"CFCFCFE7E7E7F0F0",192,"FFFFFCFCFCF9F9F9"
DATA 193,"F3F3F3E7E7E70F0F",0,"00",124,"00",125,"006C007C4444447C"



RoomMap:
DATA 0,147,148,149,0,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,159,159,159,159,159,159
DATA 0,146,151,150,0,0,0,0,0,153,148,148,154,0,0,0
DATA 180,180,180,180,180,180,180,0,0,0,159,159,159,159,159,159
DATA 0,143,144,145,0,0,0,0,0,146,158,158,150,0,0,0
DATA 173,181,0,177,0,182,174,0,0,0,159,159,190,192,159,159
DATA 0,136,142,137,0,0,0,0,0,156,144,144,155,0,0,0
DATA 173,129,0,177,0,130,174,0,0,0,159,159,191,193,159,159
DATA 0,136,141,137,0,0,153,154,0,0,0,0,0,0,0,0
DATA 173,178,0,177,0,179,174,0,0,0,159,159,159,159,159,159
DATA 0,136,139,137,0,0,146,150,0,0,0,0,0,0,0,0
DATA 175,0,162,177,169,0,176,0,0,0,159,159,159,159,159,159
DATA 0,136,138,137,0,0,156,155,0,0,157,0,183,0,0,0
DATA 173,0,138,177,169,0,174,0,0,0,159,159,159,171,172,159
DATA 130,128,128,128,140,128,128,128,128,128,128,128,128,128,129,0
DATA 173,148,148,148,148,148,174,0,0,0,159,159,159,170,0,159
DATA 130,0,0,0,140,131,133,134,133,135,133,134,133,132,129,0
DATA 173,0,0,0,0,0,174,0,189,0,159,159,159,169,0,159
DATA 130,135,135,135,140,131,133,134,133,135,133,134,133,132,129,0
DATA 173,0,0,0,0,0,174,186,187,188,159,166,166,166,0,159
DATA 130,128,128,128,140,128,128,128,128,128,128,128,128,128,129,0
DATA 173,0,0,0,0,0,174,184,162,185,159,165,0,167,168,159
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,163,162,161,160,0

SUB turn(x)
  CALL freeze
  CALL MOTION(#1,0,x,#2,0,x,#3,0,x,#4,0,x)
  CALL thaw
SUBEND

SUB DRCOL(P,C)
  FOR i=0 TO 5
    CALL HCHAR(18+i,p+c,1+i+c*7)
  NEXT i
SUBEND

SUB REMCOL(P,C,SC(,))
  FOR i=0 TO 5
    CALL HCHAR(18+i,p+c,SC(I,P+C-1))
  NEXT i
SUBEND

SUB Bucket(v)
  CALL CHAR(120,rpt$("00",13-v*2)&seg$("0F1F1F1F0F0F0F070707030303000000",25-v*4,v*4))
  CALL CHAR(122,rpt$("00",13-v*2)&seg$("F0F8F8F8F0F0F0E0E0E0C0C0C0000000",25-v*4,v*4))
SUBEND

SUB DISVAL(y,x,l,v)
  a$=STR$(v) :: a$=RPT$("0",l-LEN(a$))&a$
  CALL disply(y,x,a$)
SUBEND

SUB Poop(a,sh(),bx)
  sh(a)=1 :: CALL SPRITE(#5+a,116,2,16,bx+32,6,0):: CALL SOUND(150,-5,3)
SUBEND

SUB UnShit(sh(),t)
  CALL DELSPRITE(#5,#6,#7)
  FOR i=0 TO 2
    IF sh(i)>0 THEN t=t+1
    sh(i)=0
  NEXT i
SUBEND

 

 

  • Like 17

Share this post


Link to post
Share on other sites

More Buttvasion. . .next will be a horde of flying space arses bombarding the Earth for fun and destruction. Of course, the space plunger launchers will foil their dirty plans. . .and thinking more on this abomination, a successful plunger strike plugs the evil arse, causing it to swell up and explode due to arse biscuit buildup with nowhere to go.

  • Haha 2

Share this post


Link to post
Share on other sites

That’s awfully similar to my metaphor for what our job was like when I ran a call center. 

  • Like 1

Share this post


Link to post
Share on other sites

Youtube video of my gameplay.  Gets awfully difficult in later stages.  The brain has to quickly decide when to empty the bucket in accordance to the distance of the nearest botty-bomb.  Lovely port of the Spectrum game.  :)
 

 

  • Like 2

Share this post


Link to post
Share on other sites

Interesting gameplay (it seems a "Game & Watch" console game). 🙂 

 

There is a bug in the anim if you move on left part of the screen (a character non removed) as indicated in red in the image below.

 

While adding the joystick support I've noticed that there is no more memory left, so I've moved the runtime in low memory while compiling the code.

 

A suggestion for a couple of improvements (in addition to joystick...) for a V1.1 update:
- using sprites for the anim of the hero to not destroy the background;
- adding a "splash" anim when you finally grab the object in your bucket (as in the Spectrum / C64 versions).

 

Maybe moving the compiler runtime in low memory would free the needed space for this two improvements. ;-) 

 

 

In attachment the SSS with joystick addition (in GROM format) and the modified source with the change.

 

Bug.png

SB SCUTTLE.G

  • Like 3

Share this post


Link to post
Share on other sites

I'll bet that you just can't imagine my esteem, for being associated with this...

:grin:

16 hours ago, SteveB said:

This posting by Alex @HOME AUTOMATION in the thread of @Retrospect hilarious "Deluxe Butt-Plug Simulator" brought the 2018 Sinclair Spectrum game of Scuttlebutt to my attention. I liked the video so much that I thought about a possible port to the TI-99/4a. I contacted the author Karl Hörnell and he was so kind to send me the original artwork of the game.

ScuttleButt.png.5aeb9054aaad77f95b2d58fd669a6cfd.png 

 

39 minutes ago, tmop69 said:

Interesting gameplay (it seems a "Game & Watch" console game). 🙂 

Yep! This is the one I'm reminded of...
 

isavedbabies.thumb.jpg.6d5b4bd39a59de8855296bf1444a4dd6.jpg

|:)

Share this post


Link to post
Share on other sites
7 hours ago, HOME AUTOMATION said:

Yep! This is the one I'm reminded of...
 

isavedbabies.thumb.jpg.6d5b4bd39a59de8855296bf1444a4dd6.jpg

|:)

You, my friend, are in luck.

 

 

7 hours ago, Willsy said:

This is... shit.

 

IN A GOOD WAY :rolling:

We need a special awards section just for these kinds of games.  Bonus points if it depicts someone running around catching falling turds with their mouth wide open.

  • Thanks 1
  • Haha 1

Share this post


Link to post
Share on other sites
7 hours ago, tmop69 said:

A suggestion for a couple of improvements (in addition to joystick...) for a V1.1 update:
- using sprites for the anim of the hero to not destroy the background;
- adding a "splash" anim when you finally grab the object in your bucket (as in the Spectrum / C64 versions).

Using sprites does not work, as our hero has plenty of white areas which would be transparent. Using a black and white sprite would not work due to the 4-sprite limit .. the player is six chars wide, means 2 x 3 sprites in Magnify(3).

 

The cartrige already uses the low memory and it is still tight, I had to limit the character definitions cached for VREAD/VWRITE. I found the index-error leading to the unremoved character ... didn't see it in all the shit-testing...

 

    IF P=1 THEN CALL Disply(24,1,seg$(FT$,3,8)) ELSE

 

Scuttlebut.bin

Share this post


Link to post
Share on other sites

Isn't there a thread somewhere on here for "crap games" or something similar to that? I mean, this is literally a crap game, seems to me it would fit right in ;-) lol.

  • Like 2

Share this post


Link to post
Share on other sites
3 hours ago, SteveB said:

I found the index-error leading to the unremoved character ... didn't see it in all the shit-testing...

Would this be a problem with shit code, or with shit unit testing?

  • Like 1
  • Haha 3

Share this post


Link to post
Share on other sites

Been playing this and Buttplug Simulator today.  I rather enjoy taking a break from the seriousness of Exchange and Outlook oddities to play such assinine games.

  • Like 2
  • Haha 2

Share this post


Link to post
Share on other sites
14 hours ago, SteveB said:

Using sprites does not work, as our hero has plenty of white areas which would be transparent. Using a black and white sprite would not work due to the 4-sprite limit .. the player is six chars wide, means 2 x 3 sprites in Magnify(3).

 

The cartrige already uses the low memory and it is still tight, I had to limit the character definitions cached for VREAD/VWRITE. I found the index-error leading to the unremoved character ... didn't see it in all the shit-testing...

 

    IF P=1 THEN CALL Disply(24,1,seg$(FT$,3,8)) ELSE

 

Scuttlebut.bin 32 kB · 7 downloads

 

 

ok, thanks. I've updated also the joystick version with the fix.

 

I've just noticed another minor glitch. If you continue to move to the right direction, the nose of the hero is showed for few ms on the position of the bucket, then is cleaned.

 

 

SCUTTLE.G

  • Like 2

Share this post


Link to post
Share on other sites
On 2/24/2022 at 2:12 AM, tmop69 said:

 

 the nose of the hero is showed for few ms on the position of the bucket

 

That explains the lingering odor I detected! :woozy:

Share this post


Link to post
Share on other sites
On 2/24/2022 at 10:12 AM, tmop69 said:

I've just noticed another minor glitch. If you continue to move to the right direction, the nose of the hero is showed for few ms on the position of the bucket, then is cleaned.

This more a visible proof that the CALL VWRITE is much faster than the CALL CHAR. For the main eight pictures of the player I buffer the characters in an array of strings with CALL VREAD, but went out of memory for the remaining 4 images, where I still need to use CALL CHAR, being much slower, leading to this visual artefacts. The player is 6x7 charactes big, leading to 42 characters to be redefined on every single move. 

Share this post


Link to post
Share on other sites
On 2/23/2022 at 11:38 PM, OLD CS1 said:

Would this be a problem with shit code, or with shit unit testing?

Well, I never thought I woul have a program with routines like:

 

  SUB Poop(a,sh(),bx)
  SUB UnShit(sh(),t)

 

It's a dirty job ... but someone gotta test it. 

  • Like 1
  • Haha 6

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...