====== MARIO´S CEMENT FACTORY ====== {{:otros:Mario_Cement_Factory_p1.jpg?690|}} ===== Info ===== ^ Author | ??????? | ^ Computer | Amstrad PCW 8256 / 8512 / 9512 | ^ Year | ???? | ^ Gender | Arcade | ^ Controls | Keyboard | ^ Languages | English | ^ Status | [[preserved|Preserved]] | ===== Screenshots ===== {{:otros:Mario_Cement_Factory_screenshot01.png?220}} {{:otros:Mario_Cement_Factory_screenshot02.png?220}} {{:otros:Mario_Cement_Factory_screenshot03.png?220}} {{:otros:Mario_Cement_Factory_screenshot04.png?220}} ===== Description ===== An incredible game based on one of the machines of the famous character Mario Bros, the "Mario's Cement Factory". Our mission will be that our character named Mario must empty the cement hoppers into the trucks that are at the bottom of the screen. We will have to use the elevators that go up and down to move around the factory. To empty the hoppers we must be next to them and then press the space bar to empty them, making us add points. To move to the left or right we will use the cursor keys. We will have to be careful when going up or down an elevator, we will have to do it at the right moment or we will fall down the hole, causing us to lose a life. We can only move from one elevator to another at the exact moment it happens. The game starts with five lives indicated at the top left of the screen. We will lose a life if we fall down the elevator shaft or get crushed by the top or bottom of the elevator. If any of the four hoppers is full (three layers of cement), a warning indicator will appear. If the hopper is overfilled, then Mario will be fired on the spot and the game is over. We can leave the game at any time during the game by pressing the EXIT key. ===== Listing ===== * **__Listing - MARIO.BAS__** 10 OPTION RUN:DEFINT a-z:DEFSNG e:hi!=HIMEM:MEMORY &HBFFF,1000:GOSUB 1510:DIM a%(22,65),sz(4),LX(4),b(8,17) 20 RESTORE 30:FOR x=&HC070 TO &HC098:READ pk:POKE x,pk:NEXT x 30 DATA 243,62,129,211,241,62,130,211,242,175,95,103,22,184,58,153,192,111,41,41 40 DATA 41,25,17,154,192,235,1,8,0,237,176,62,133,211,241,62,134,211,242,251,201 50 char=200:lives=5 60 count=17:ch=char:WHILE char0 THEN GOTO 420 ELSE X$=INKEY$:IF X$="" THEN cnt=cnt+1 350 IF X$=CHR$(27) THEN MEMORY hi!:END 360 IF X$=" " THEN cnt=1:GOSUB 790 370 IF X$=CHR$(1) AND MY>23 THEN cnt=1:GOSUB 610 380 IF X$=CHR$(6) AND MY<60 THEN cnt=1:GOSUB 630 390 ON cnt GOSUB 650,1020,650,1130,1080,650,1180 400 IF cnt=7 THEN cnt=0 410 GOTO 340 420 IF (ml=1 AND LX(1)<6) OR (ml=2 AND LX(2)<6) THEN mx=lx(ml)-2:my=42:ml=0:GOTO 1370 430 IF (ml=3 AND LX(3)>20) OR (ml=4 AND LX(4)>20) THEN mx=(lx(ml)-2):my=39:ml=0:GOTO 1370 440 ON ml GOTO 450,490,530,570 450 X$=INKEY$:IF X$="" THEN cnt=cnt+1:GOTO 390 460 IF X$=CHR$(6) THEN IF lx(1)=9 OR lx(1)=14 THEN MX=(LX(1)-2):MY=45:PRINT FNat$(MX,MY)man$(1):ml=0:PRINT FNat$(LX(1)-2,42)blank$:GOTO 340 470 IF X$=CHR$(1) THEN IF lx(3)=lx(1) THEN ml=3 :PRINT FNat$(lx(1)-2,42)blank$ ELSE IF lx(4)=lx(1) THEN ml=4:PRINT FNat$(lx(1)-2,42)Blank$:GOTO 390 480 GOTO 340 490 X$=INKEY$:IF X$="" THEN cnt=cnt+1:GOTO 390 500 IF X$=CHR$(6) THEN IF lx(2)=9 OR lx(2)=14 THEN MX=(LX(2)-2):MY=45:PRINT FNat$(MX,MY)man$(1):PRINT FNat$(LX(2)-2,42)blank$:ml=0:GOTO 340 510 IF X$=CHR$(1) THEN IF lx(3)=lx(2) THEN ml=3 :PRINT FNat$(lx(2)-2,42)blank$ ELSE IF lx(4)=lx(2) THEN ml=4:PRINT FNat$(lx(2)-2,42)blank$:GOTO 390 520 GOTO 340 530 X$=INKEY$:IF X$="" THEN cnt=cnt+1:GOTO 390 540 IF X$=CHR$(1) THEN IF lx(3)=10 OR lx(3)=15 OR LX(3)=20 THEN MX=(LX(3)-3):MY=37:PRINT FNat$(MX,MY)man$(1):ml=0:PRINT FNat$(LX(3)-3,39)blank$:LX(3)=LX(3)-1:GOTO 340 550 IF X$=CHR$(6) THEN IF lx(1)=lx(3)-2 THEN ml=1:LX(3)=LX(3)-1:LX(1)=LX(1)+1:PRINT FNat$(lx(3)-2,39)blank$ ELSE IF lx(2)=lx(3)-2 THEN ml=2:PRINT FNat$(lx(3)-3,39)blank$:LX(3)=LX(3)-1:LX(2)=LX(2)+1:GOTO 390 560 GOTO 340 570 X$=INKEY$:IF X$="" THEN cnt=cnt+1:GOTO 390 580 IF X$=CHR$(1) THEN IF lx(4)=10 OR lx(4)=15 OR lx(4)=20 THEN MX=(LX(4)-3):MY=37:PRINT FNat$(MX,MY)man$(1):ml=0:PRINT FNat$(LX(4)-3,39)blank$:LX(4)=LX(4)-1:GOTO 340 590 IF X$=CHR$(6) THEN IF lx(1)=lx(4)-3 THEN ml=1:LX(4)=LX(4)-1:LX(1)=LX(1)+1:PRINT FNat$(lx(4)-2,39)blank$ ELSE IF lx(2)=lx(4)-3 THEN ml=2:PRINT FNat$(lx(4)-3,39)blank$:LX(4)=LX(4)-1:LX(2)=LX(2)+1:GOTO 390 600 GOTO 340 610 IF my=45 THEN IF lx(1)=(mx+1) THEN ML=1 ELSE IF lx(2)=mx+1 THEN ML=2 ELSE IF MY=45 THEN GOTO 1370 620 LX(ml)=LX(ml)+1:MY1=MY:MY=MY-2:PRINT FNat$(MX,MY)MAN$(1) FNat$(MX,MY1)blank$:RETURN 630 IF my=37 THEN IF lx(4)=(mx+2) THEN ML=4 ELSE IF lx(3)=(mx+2) THEN ML=3 ELSE IF MY=37 THEN GOTO 1370 640 MY1=MY:MY=MY+2:PRINT FNat$(MX,MY)MAN$(1) FNat$(MX,MY1)blank$:RETURN 650 REM MOVE CARTS 660 PRINT FNat$(2,cy)cart$(c):cy=cy+1 670 PRINT FNat$(2,ccy)Cart$(c1):ccy=ccy+1 680 IF cy=20 AND (c=1 AND cc=1) THEN c=2:h=1:GOSUB 940 690 IF ccy=20 AND (c1=1 AND ccc=1) THEN c1=2 :h=1:GOSUB 960 700 IF cy=64 AND (c=1 AND cc=2) THEN c=2 :h=2:GOSUB 950 710 IF ccy=64 AND (c1=1 AND ccc=2) THEN c1=2 :h=2:GOSUB 970 720 IF cy=82 AND cc=1 THEN PRINT FNAT$(2,cy)" "+STRING$(3,8)+CHR$(10)+" ":cy=2:c=1:cc=2 730 IF cy=82 AND cc=2 THEN PRINT FNAT$(2,cy)" "+STRING$(3,8)+CHR$(10)+" ":cy=2:c=1:cc=1 740 IF ccy=82 AND ccc=1 THEN PRINT FNAT$(2,ccy)" "+STRING$(3,8)+CHR$(10)+" ":ccy=2:c1=1:ccc=2 750 IF ccy=82 AND ccc=2 THEN PRINT FNAT$(2,ccy)" "+STRING$(3,8)+CHR$(10)+" ":ccy=2:c1=1:ccc=1 760 IF sz(1)=-3 THEN PRINT FNat$(6,23)"WARNING" ELSE PRINT FNat$(6,23)" " 770 IF sz(2)=-3 THEN PRINT FNat$(6,56)"WARNING" ELSE PRINT FNat$(6,56)" " 780 RETURN 790 REM WORK HOPPERS 800 h=0:IF MX=7 AND MY=23 THEN h=1 810 IF MX=12 AND MY=23 THEN h=3 820 IF MX=7 AND MY=61 THEN h=2 830 IF MX=12 AND MY=61 THEN h=4 840 IF h=0 THEN RETURN 850 ON h GOTO 860,880,900,920 860 IF sz(1)=0 THEN GOTO 330 ELSE sz(1)=sz(1)+1:PRINT FNat$((8+sz(1)),20)" " 870 IF sz(3)=-3 THEN GOSUB 1000 ELSE FOR sx=9 TO (12+sz(3)):PRINT FNat$(sx,20)sand$:NEXT sx:sz(3)=sz(3)-1:SCORE=SCORE+1:PRINT FNat$(0,42)rev$"SCORE: "SCORE rof$ CHR$(7):GOTO 330 880 IF sz(2)=0 THEN GOTO 330 ELSE sz(2)=sz(2)+1:PRINT FNat$((8+sz(2)),64)" " 890 IF sz(4)=-3 THEN GOSUB 1010 ELSE FOR sx=9 TO (12+sz(4)):PRINT FNat$(sx,64)sand$:NEXT sx:sz(4)=sz(4)-1:SCORE=SCORE+1:PRINT FNat$(0,42)rev$"SCORE: "SCORE rof$ CHR$(7):GOTO 330 900 IF sz(3)=0 THEN GOTO 330 ELSE sz(3)=sz(3)+1:PRINT FNat$((13+sz(3)),20)" " 910 FOR sx=14 TO 20:PRINT FNat$(sx,20)sand$:NEXT sx:FOR i=1 TO 5:SCORE=SCORE+1:PRINT FNat$(0,42)rev$"SCORE: "SCORE rof$ CHR$(7):NEXT:GOSUB 1420:GOTO 330 920 IF sz(4)=0 THEN GOTO 330 ELSE sz(4)=sz(4)+1:PRINT FNat$((13+sz(4)),64)" " 930 FOR sx=14 TO 20:PRINT FNat$(sx,64)sand$:NEXT sx:FOR i=1 TO 5:SCORE=SCORE+1:PRINT FNat$(0,42)rev$"SCORE: "SCORE rof$ CHR$(7):NEXT:GOSUB 1430:GOTO 330 940 IF sz(1)=-3 THEN GOSUB 980 ELSE FOR sx=4 TO (7+sz(1)):PRINT FNat$(sx,cy)sand$:NEXT sx:sz(1)=sz(1)-1:RETURN 950 IF sz(2)=-3 THEN GOSUB 980 ELSE FOR sx=4 TO (7+sz(2)):PRINT FNat$(sx,cy)sand$:NEXT sx:sz(2)=sz(2)-1:RETURN 960 IF sz(1)=-3 THEN GOSUB 980 ELSE FOR sx=4 TO (7+sz(1)):PRINT FNat$(sx,ccy)sand$:NEXT sx:sz(1)=sz(1)-1:RETURN 970 IF sz(2)=-3 THEN GOSUB 980 ELSE FOR sx=4 TO (7+sz(2)):PRINT FNat$(sx,ccy)sand$:NEXT sx:sz(2)=sz(2)-1:RETURN 980 FOR sx=4 TO 22:PRINT FNat$(sx,(cy-2))CHR$(7)+" "+STRING$(6,8)+CHR$(10)+rev$+" "+rof$:NEXT sx 990 PRINT STRING$(5,7):LIVES=1:GOTO 1370 1000 FOR sx=11 TO 22:PRINT FNat$(sx,18)CHR$(7)+" "+STRING$(6,8)+CHR$(10)+rev$+" "+rof$:NEXT sx:GOTO 990 1010 FOR sx=11 TO 22:PRINT FNat$(sx,62)CHR$(7)+" "+STRING$(6,8)+CHR$(10)+rev$+" "+rof$:NEXT sx:GOTO 990 1020 REM MOVE LIFTS 1030 IF ml=1 AND lx(1)<>3 THEN PRINT FNat$(LX(1)-3,42)liftman$+STRING$(3,8)+CHR$(10)+" ":GOTO 1050 1040 IF LX(1)=3 THEN GOTO 1070 ELSE PRINT FNat$(LX(1),42)CHR$(200)+CHR$(201)+CHR$(200)+STRING$(3,8)+CHR$(10)+" " 1050 IF LX(1)>4 THEN LX(1)=LX(1)-1 1060 IF LX(1)=4 THEN PRINT FNat$(5,42)" ":LX(1)=MIN((LX(2)+8),22) 1070 RETURN 1080 IF ml=3 AND lx(3)<23 THEN PRINT FNat$(LX(3)-3,39)" "+STRING$(3,8)+CHR$(10)+liftman$:GOTO 1100 1090 IF LX(3)=23 THEN GOTO 1120 ELSE PRINT FNAT$(LX(3),39)" "+STRING$(3,8)+CHR$(10)+CHR$(200)+CHR$(201)+CHR$(200) 1100 IF LX(3)<23 THEN LX(3)=LX(3)+1 1110 IF LX(3)=22 THEN PRINT FNat$(LX(3),39)" ":LX(3)=(LX(4)-8) 1120 RETURN 1130 IF ml=2 AND lx(2)<>3 THEN PRINT FNat$(LX(2)-3,42)liftman$+STRING$(3,8)+CHR$(10)+" ":GOTO 1150 1140 IF LX(2)=3 THEN GOTO 1170 ELSE PRINT FNat$(LX(2),42)CHR$(200)+CHR$(201)+CHR$(200)+STRING$(3,8)+CHR$(10)+" " 1150 IF LX(2)>4 THEN LX(2)=LX(2)-1 1160 IF LX(2)=4 THEN PRINT FNat$(5,42)" " :LX(2)=MIN((LX(1)+8),22) 1170 RETURN 1180 IF ml=4 AND lx(4)<22 THEN PRINT FNat$(LX(4)-3,39)" "+STRING$(3,8)+CHR$(10)+liftman$:GOTO 1200 1190 IF LX(4)=23 THEN GOTO 1220 ELSE PRINT FNAT$(LX(4),39)" "+STRING$(3,8)+CHR$(10)+CHR$(200)+CHR$(201)+CHR$(200) 1200 IF LX(4)<22 THEN LX(4)=LX(4)+1 1210 IF LX(4)=22 THEN PRINT FNat$(LX(4),39)" ":LX(4)=(LX(3)-8) 1220 RETURN 1230 REM SCREEN 1240 PRINT FNat$(4,3)GIRD$+GIRD$+" "+GIRD$+GIRD$+GIRD$+GIRD$+GIRD$+" "+GIRD$+GIRD$ 1250 PRINT FNat$(6,19)hop$ FNat$(6,63)hop$ FNat$(11,19)hop$ FNat$(11,63)hop$ 1260 j=201:FOR y=3 TO 82 STEP 79:FOR x=4 TO 22:j=1-j:PRINT FNat$(x,y)CHR$(ABS(j)):NEXT x:NEXT y 1270 PRINT FNat$(9,23)GIRD$+GIRD$+" "+GIRD$+GIRD$+CHR$(200)+CHR$(201) 1280 PRINT FNat$(14,23)GIRD$+GIRD$+" "+GIRD$+GIRD$+CHR$(200)+CHR$(201):PRINT FNat$(19,23)GIRD$+GIRD$ 1290 j=201:FOR x=15 TO 19:j=1-j:PRINT FNat$(x,23)CHR$(ABS(j)):NEXT x 1300 j=201:FOR x=19 TO 22:j=1-j:PRINT FNat$(x,38)CHR$(ABS(j)):NEXT x 1310 j=201:FOR x=15 TO 22:j=1-j:PRINT FNat$(x,45)CHR$(ABS(j)):NEXT x 1320 PRINT FNat$(22,1)rev$ SPACE$(88) Rof$ 1330 PRINT FNat$(21,11)train$(1) FNat$(22,11)TRain$(2):PRINT FNat$(21,55)train$(1)FNat$(22,55)train$(2) 1331 FOR y=0 TO 64 STEP 8:t=1:FOR x=1 TO 2:t=1-t:PRINT FNat$(24+x,y)train$(t+1):NEXT:NEXT 1332 FOR y=0 TO 80 STEP 8:t=1:FOR x=3 TO 4:PRINT FNat$(24+x,y)gird$:NEXT:NEXT 1333 PRINT FNat$(27,18)rev$" M A R I O ' S C E M E N T F A C T O R Y "rof$ 1335 FOR y=0 TO 64 STEP 8:t=1:FOR x=1 TO 2:t=1-t:PRINT FNat$(28+x,y)train$(t+1):NEXT:NEXT 1340 RETURN 1350 PRINT FNat$(0,0)"LIVES:":FOR i= 2 TO 6:PRINT FNat$(0,(i*3))man$(1):NEXT i:RETURN 1360 IF LIVES<>5 THEN FOR i=2 TO (6-LIVES):PRINT FNat$(0,24-(i*3))crump$:NEXT i:RETURN ELSE RETURN 1370 PRINT FNat$(mx,my)" "+CHR$(8)+CHR$(8)+CHR$(10)+" ":my=41:FOR mx=mx TO 21:FOR i=1 TO 20:NEXT i:PRINT FNat$(mx,my)CHR$(7)+downman$ FNat$((mx-1),my)" ":NEXT mx 1375 PRINT FNat$(4,38) GIRD$ FNat$(23,38)REV$" "rof$ 1380 PRINT FNat$(mx-1,my)crump$:lives=lives-1:MX=7:MY=23:GOSUB 1360:GOSUB 1570:IF LIVES=0 THEN GOTO 1390 ELSE GOTO 330 1390 IF INKEY$<>"" THEN PRINT CHR$(7) 1400 PRINT FNat$(23,25)rev$" DO YOU WANT ANOTHER GO? "rof$:x$=INKEY$:IF x$="" THEN GOTO 1390 1410 IF UPPER$(x$)="Y" THEN MEMORY hi!:RUN ELSE MEMORY hi!:END 1420 ok=FRE(""):FOR ty=1 TO 4:FOR i=1 TO 80:NEXT i:PRINT FNat$(21,7)SPACE$(ty)+train$(1) FNat$(22,7)SPACE$(ty)+train$(2):NEXT ty:RETURN 1430 ok=FRE(""):FOR ty=1 TO 4:FOR i=1 TO 80:NEXT i:PRINT FNat$(21,51)SPACE$(ty)+train$(1) FNat$(22,51)SPACE$(ty)+train$(2):NEXT ty:RETURN 1440 REM "Music" 1450 DATA 229,213,197,221,229,42,27,192,237,91,25,192,205,29,192,62 1460 DATA 12,211,248,221,225,193,209,225,201,0,0,0,0,243,125,203 1470 DATA 61,203,61,47,230,3,79,6,0,221,33,49,192,221,9,62 1480 DATA 11,0,0,0,4,12,13,32,253,14,63,5,32,248,60,254 1490 DATA 13,32,2,61,61,211,248,68,79,254,11,32,9,122,179,40 1500 DATA 9,121,77,27,221,233,77,12,221,233,251,201 1510 RESTORE 1450:FOR nn=&HC000 TO &HC05B:READ dd:POKE nn,dd:NEXT 1520 AZ=&HC000:BZ=&HC019:CZ=&HC01B 1530 RESTORE 1540:FOR NN=0 TO 9:READ E(NN):NEXT 1540 DATA 189.8765,210,234.4015,254.612,284,318,351,372,1740,6000 1550 time$="22224648" 1560 note$="77445467":RETURN 1570 FOR i=1 TO LEN(time$):dd=VAL(MID$(time$,i,1)):ff=VAL(MID$(note$,i,1)) 1580 f2=E(FF):tt=3500000!/(f2*2):tt=INT(tt/4-30.125) 1600 f2=INT(f2*(dd/12)) 1610 POKE BZ,f2-256*INT(f2/256):POKE BZ+1,INT(f2/256) 1620 POKE CZ,tt-256*INT(tt/256):POKE CZ+1,INT(tt/256):CALL AZ 1630 NEXT:RETURN ===== Controls ===== ↑ = UP ↓ = DOWN → = RIGHT ← = LEFT SPACE = DOWNLOAD EXIT = ABANDON ===== Loading the program ===== 1.- Insert the CP/M disc on side 2 2.- Write BASIC and wait for it to load 3.- Remove the CP/M disk and insert the disk containing the game Mario's Cement Factory 4.- Type run "Mario" and press the "ENTER" key ===== Download ===== * {{:otros:Mario´s Cement Factory (Basic).zip|Mario´s Cement Factory }}(game in dsk format, compressed with zip)