'$DYNAMIC 'current library-allmodex.qlb DEFINT A-Z DECLARE FUNCTION ifpos% (word%) DECLARE SUB menu (item$(), args%(), script%(), ptr%, top%, offset%) DECLARE SUB setmodex () DECLARE SUB stosprite (pic(), BYVAL x, BYVAL y, BYVAL page) DECLARE SUB drawsprite (pic(), pal(), BYVAL po, BYVAL x, BYVAL y, BYVAL page) DECLARE SUB loadsprite (pic(), BYVAL x, BYVAL y, BYVAL w, BYVAL h, BYVAL page) DECLARE SUB copypage (BYVAL page1, BYVAL page2) DECLARE SUB setvispage (BYVAL page) DECLARE SUB fadeto (palbuff(), BYVAL red, BYVAL green, BYVAL blue) DECLARE SUB fadetopal (pal(), palbuff()) DECLARE SUB setpal (pal()) DECLARE SUB clearpage (BYVAL page) DECLARE SUB setdiskpages (buf(), BYVAL h, BYVAL l) DECLARE SUB loadpage (fil$, BYVAL i, BYVAL p) DECLARE SUB storepage (fil$, BYVAL i, BYVAL p) DECLARE SUB drawpage (map(), BYVAL l, BYVAL p) DECLARE SUB setkeys () DECLARE SUB setwait (t(), BYVAL t) DECLARE SUB dowait () DECLARE SUB setfont (F()) DECLARE SUB printstr (s$, BYVAL x, BYVAL y, BYVAL p) DECLARE SUB textcolor (BYVAL F, BYVAL b) DECLARE FUNCTION Keyseg () DECLARE FUNCTION keyoff () DECLARE FUNCTION keyval (BYVAL a) DECLARE FUNCTION getkey () TYPE Regtype ax AS INTEGER bx AS INTEGER cx AS INTEGER dx AS INTEGER bp AS INTEGER si AS INTEGER di AS INTEGER flags AS INTEGER ds AS INTEGER es AS INTEGER END TYPE DIM SHARED regs AS Regtype regs.ax = &H3509: CALL interruptx(&H21, regs, regs) off9 = regs.bx: seg9 = regs.es regs.ax = &H2509: regs.ds = Keyseg: regs.dx = keyoff CALL interruptx(&H21, regs, regs) DIM map(8000), tmp(8000), master(767), fade(1584), font(1024), script(5, 4601), names$(9), args(9), help$(9), kp(9) setmodex setpal master(): DEF SEG = VARSEG(master(0)): BLOAD "palette.sto", VARPTR(master(0)) fadetopal master(), fade() DEF SEG = VARSEG(font(0)): BLOAD "gungnir.fnt", VARPTR(font(0)): setfont font() setdiskpages tmp(), 200, 0 nil$ = " " FOR i = 0 TO 9 READ names$(i) NEXT i FOR i = 0 TO 9 READ args(i) NEXT i FOR i = 0 TO 9 READ help$(i) NEXT i FOR i = 0 TO 9 READ kp(i) NEXT i FOR i = 0 TO 4 READ fmenu$(i) NEXT offset = 1 textcolor 15, 0 setkeys DO: setkeys IF keyval(1) > 1 THEN GOSUB filemenu: setkeys IF keyval(88) > 1 THEN storepage "c:\install\future.mxs" + CHR$(0), 3, 0 IF keyval(72) > 1 THEN ptr = ptr - 1: IF ptr < 0 THEN ptr = 0: IF top > 0 THEN top = top - 1 IF keyval(80) > 1 THEN ptr = ptr + 1: IF ptr > 17 THEN ptr = 17: IF top + ptr < 4600 THEN top = top + 1 IF keyval(73) > 1 THEN top = top - 18: IF top < 0 THEN top = 0 IF keyval(81) > 1 THEN top = top + 18: IF top > 4582 THEN top = 4582 IF keyval(51) > 1 THEN script(0, ptr + top) = script(0, ptr + top) - 1: IF script(0, ptr + top) < 0 THEN script(0, ptr + top) = 9 IF keyval(52) > 1 THEN script(0, ptr + top) = script(0, ptr + top) + 1: IF script(0, ptr + top) > 9 THEN script(0, ptr + top) = 0 IF keyval(28) > 1 THEN GOSUB easyedit IF keyval(77) > 1 THEN GOSUB arguments IF keyval(59) > 1 THEN GOSUB loadmap: textcolor 15, 0 IF keyval(60) > 1 THEN GOSUB save: textcolor 15, 0 IF keyval(61) > 1 THEN GOSUB load: textcolor 15, 0 IF keyval(82) > 1 THEN GOSUB insert IF keyval(83) > 1 THEN GOSUB delete FOR i = 0 TO 9 IF keyval(kp(i)) > 1 THEN script(0, ptr + top) = i NEXT GOSUB updatel drawpage map(), l, 1 CALL menu(names$(), args(), script(), ptr, top, offset) textcolor 1 + tog, 0: ii = ii + 1: IF ii > 2 THEN ii = 0: tog = tog XOR 8 printstr names$(script(0, ptr + top)), 0, ptr * 8, 1 textcolor 15, 0 printstr help$(script(0, ptr + top)), 0, 8 * 20, 1 printstr STR$(ptr + top), 0, 8 * 19, 1 copypage 1, 0 LOOP arguments: csr = 1 setkeys DO: setkeys IF keyval(1) > 1 THEN RETURN IF keyval(72) > 1 THEN ptr = ptr - 1: IF ptr < 0 THEN ptr = 0: IF top > 0 THEN top = top - 1 IF keyval(80) > 1 THEN ptr = ptr + 1: IF ptr > 17 THEN ptr = 17: IF top + ptr < 4600 THEN top = top + 1 IF keyval(73) > 1 THEN top = top - 18: IF top < 0 THEN top = 0 IF keyval(81) > 1 THEN top = top + 18: IF top > 4582 THEN top = 4582 IF keyval(75) > 1 THEN csr = csr - 1: IF csr < 1 THEN RETURN IF keyval(77) > 1 THEN csr = csr + 1: IF csr > args(script(0, ptr + top)) THEN csr = 1 IF keyval(11) > 1 AND ABS(VAL(STR$(script(csr, ptr + top)) + "0")) <= 9999 THEN script(csr, ptr + top) = VAL(STR$(script(csr, ptr + top)) + "0") FOR i = 1 TO 9 IF keyval(i + 1) > 1 AND ABS(VAL(STR$(script(csr, ptr + top)) + STR$(i))) <= 9999 THEN script(csr, ptr + top) = VAL(STR$(script(csr, ptr + top)) + STR$(i)) NEXT IF keyval(14) > 1 THEN script(csr, ptr + top) = VAL(LEFT$(STR$(script(csr, ptr + top)), LEN(STR$(script(csr, ptr + top))) - 1)) IF keyval(74) > 1 OR keyval(78) > 1 OR keyval(12) > 1 OR keyval(13) > 1 THEN script(csr, ptr + top) = script(csr, ptr + top) * -1 IF keyval(59) > 1 THEN GOSUB loadmap: textcolor 15, 0 IF keyval(60) > 1 THEN GOSUB save: textcolor 15, 0 IF keyval(61) > 1 THEN GOSUB load: textcolor 15, 0 IF keyval(82) > 1 THEN GOSUB insert IF keyval(83) > 1 THEN GOSUB delete IF csr > args(script(0, ptr + top)) THEN csr = args(script(0, ptr + top)) IF csr = 0 THEN RETURN GOSUB updatel drawpage map(), l, 1 CALL menu(names$(), args(), script(), ptr, top, offset) textcolor 1 + tog, 0: ii = ii + 1: IF ii > 2 THEN ii = 0: tog = tog XOR 8 IF csr <= args(script(0, ptr + top)) THEN printstr STR$(script(csr, ptr + top)), 40 + (csr * 48), ptr * 8, 1 END IF textcolor 15, 0 printstr help$(script(0, ptr + top)), 0, 8 * 20, 1 printstr STR$(ptr + top), 0, 8 * 19, 1 copypage 1, 0 LOOP save: setkeys DO: setkeys IF keyval(1) > 1 THEN textcolor 17, 4: printstr "SAVE CANCELLED ", 0, 8 * 21, 0: t# = TIMER: WHILE TIMER < t# + 2: WEND: RETURN IF keyval(28) > 1 THEN textcolor 17, 2: printstr "WRITING script." + RIGHT$(STR$(n), LEN(STR$(n)) - 1) + " AND mushcode." + RIGHT$(STR$(n), LEN(STR$(n)) - 1), 0, 8 * 21, 0: GOSUB savenow: RETURN IF keyval(11) > 1 AND VAL(STR$(n) + "0") <= 999 THEN n = VAL(STR$(n) + "0") FOR i = 1 TO 9 IF keyval(i + 1) > 1 AND VAL(STR$(n) + STR$(i)) <= 999 THEN n = VAL(STR$(n) + STR$(i)) NEXT IF keyval(14) > 1 THEN n = VAL(LEFT$(STR$(n), LEN(STR$(n)) - 1)) textcolor 14 + stog, 6 + stog: stog = stog XOR 1 printstr "SAVE AS SCRIPT NUMBER" + STR$(n) + " ", 0, 8 * 21, 0 LOOP savenow: unfile$ = "script." + RIGHT$(STR$(n), LEN(STR$(n)) - 1) file$ = "mushcode." + RIGHT$(STR$(n), LEN(STR$(n)) - 1) textcolor 0, 12 OPEN unfile$ FOR BINARY AS #1 FOR i = 0 TO 2600 FOR o = 0 TO 5 PUT #1, 1 + ((6 * i) + o) * 2, script(o, i) NEXT printstr LEFT$(nil$, INT(i / 65)), 0, 180, 0 NEXT: CLOSE #1 textcolor 0, 13 OPEN file$ FOR BINARY AS #1 IF LOF(1) > 1 THEN CLOSE #1: KILL file$: OPEN file$ FOR BINARY AS #1 i = -1 sptr = -1 DO i = i + 1 FOR o = 0 TO args(script(0, i)) sptr = sptr + 2 word = script(o, i) IF (script(0, i) = 5 AND o = 3) OR (script(0, i) = 4 AND o = 2) THEN GOSUB jumptrans PUT #1, sptr, word NEXT LOOP UNTIL script(0, i) = 0 AND script(0, i + 1) = 0 CLOSE #1 RETURN jumptrans: 'MAKE SURE THIS IS RIGHT!!! word = 1 FOR j = 0 TO script(o, i) - 1 word = word + (args(script(0, j)) + 1) * 2 NEXT RETURN load: setkeys DO: setkeys IF keyval(1) > 1 THEN textcolor 17, 4: printstr "RESUMING WITHOUT LOAD ", 0, 8 * 21, 0: t# = TIMER: WHILE TIMER < t# + 2: WEND: RETURN IF keyval(28) > 1 THEN textcolor 17, 2: printstr "LOADING script." + RIGHT$(STR$(n), LEN(STR$(n)) - 1) + " ", 0, 8 * 21, 0: GOSUB loadnow: RETURN IF keyval(11) > 1 AND VAL(STR$(n) + "0") <= 999 THEN n = VAL(STR$(n) + "0") FOR i = 1 TO 9 IF keyval(i + 1) > 1 AND VAL(STR$(n) + STR$(i)) <= 999 THEN n = VAL(STR$(n) + STR$(i)) NEXT IF keyval(14) > 1 THEN n = VAL(LEFT$(STR$(n), LEN(STR$(n)) - 1)) textcolor 14 + stog, 6 + stog: stog = stog XOR 1 printstr "LOAD SCRIPT NUMBER" + STR$(n) + " ", 0, 8 * 21, 0 LOOP loadnow: unfile$ = "script." + RIGHT$(STR$(n), LEN(STR$(n)) - 1) textcolor 0, 12 OPEN unfile$ FOR BINARY AS #1 FOR i = 0 TO 2600 FOR o = 0 TO 5 GET #1, 1 + ((6 * i) + o) * 2, script(o, i) NEXT printstr LEFT$(nil$, INT(i / 65)), 0, 180, 0 NEXT: CLOSE #1 RETURN loadmap: setkeys DO: setkeys IF keyval(1) > 1 THEN textcolor 17, 4: printstr "KEEPING CURRENT MAP ", 0, 8 * 21, 0: t# = TIMER: WHILE TIMER < t# + 2: WEND: RETURN IF keyval(28) > 1 THEN textcolor 17, 2: printstr "LOADING map." + RIGHT$(STR$(n), LEN(STR$(n)) - 1) + " ", 0, 8 * 21, 0: GOSUB loadmapnow: RETURN IF keyval(11) > 1 AND VAL(STR$(n) + "0") <= 999 THEN n = VAL(STR$(n) + "0") FOR i = 1 TO 9 IF keyval(i + 1) > 1 AND VAL(STR$(n) + STR$(i)) <= 999 THEN n = VAL(STR$(n) + STR$(i)) NEXT IF keyval(14) > 1 THEN n = VAL(LEFT$(STR$(n), LEN(STR$(n)) - 1)) textcolor 14 + stog, 6 + stog: stog = stog XOR 1 printstr "LOAD MAP NUMBER" + STR$(n) + " ", 0, 8 * 21, 0 LOOP loadmapnow: lfile$ = "level." + RIGHT$(STR$(n), LEN(STR$(n)) - 1) bfile$ = "backdrop." + RIGHT$(STR$(n), LEN(STR$(n)) - 1) DEF SEG = VARSEG(map(0)): BLOAD lfile$, VARPTR(map(0)) loadpage bfile$ + CHR$(0), 0, 3 RETURN insert: textcolor 1, 15: printstr "inserting...", 0, 8 * 21, 0 FOR i = 4600 TO ptr + top + 1 STEP -1 FOR o = 0 TO 5 script(o, i) = script(o, i - 1) NEXT: NEXT FOR i = 0 TO 5 script(i, ptr + top) = 0 NEXT FOR i = 0 TO 4600 IF script(0, i) = 5 AND script(3, i) >= ptr + top THEN script(3, i) = script(3, i) + 1 IF script(0, i) = 4 AND script(2, i) >= ptr + top THEN script(2, i) = script(2, i) + 1 NEXT textcolor 15, 0: setkeys: RETURN delete: textcolor 1, 15: printstr "deleting...", 0, 8 * 21, 0 FOR i = ptr + top TO 4599 FOR o = 0 TO 5 script(o, i) = script(o, i + 1) NEXT: NEXT FOR i = 0 TO 5 script(i, 4600) = 0 NEXT FOR i = 0 TO 4600 IF script(0, i) = 5 AND script(3, i) >= ptr + top THEN script(3, i) = script(3, i) - 1 IF script(0, i) = 4 AND script(2, i) >= ptr + top THEN script(2, i) = script(2, i) - 1 NEXT textcolor 15, 0: setkeys: RETURN updatel: l = 0 FOR i = 0 TO ptr + top IF script(0, i) = 2 THEN IF script(1, i) > 5118 THEN script(1, i) = 5118 l = script(1, i) + 1 END IF IF script(0, i) = 1 THEN lspeed = script(1, i) IF script(0, i) = 8 THEN l = l - (lspeed * script(1, i)) NEXT IF l < 0 THEN l = 0 RETURN easyedit: IF script(0, ptr + top) = 1 THEN GOSUB setscroll IF script(0, ptr + top) = 2 THEN GOSUB setmaploc IF script(0, ptr + top) = 3 THEN GOSUB makeenemy IF script(0, ptr + top) = 6 THEN GOSUB setmaptile IF script(0, ptr + top) = 8 THEN GOSUB advance setkeys: RETURN setscroll: center = l nspeed = script(1, ptr + top) newl = center setkeys DO: setkeys IF keyval(1) > 1 THEN RETURN IF keyval(72) > 1 THEN nspeed = nspeed + 1 IF keyval(80) > 1 THEN nspeed = nspeed - 1 IF keyval(57) > 1 THEN newl = center newl = newl - nspeed: edge = 0 IF newl < 0 THEN newl = 0: edge = 1 IF newl > 5118 THEN newl = 5118: edge = 2 drawpage map(), newl + 1, 1 printstr "scrolling at:" + STR$(nspeed), 0, 20 * 8, 1 printstr "Use ^ and | to change the scroll rate", 0, 21 * 8, 1 printstr "SPACE resets the screen", 0, 22 * 8, 1 IF edge = 1 THEN printstr "TOP OF MAP", 0, 0, 1 IF edge = 2 THEN printstr "BOTTOM OF MAP", 0, 0, 1 copypage 1, 0 LOOP UNTIL keyval(28) > 1 script(1, ptr + top) = nspeed RETURN setmaploc: newl = script(1, ptr + top) setkeys DO: setkeys IF keyval(1) > 1 THEN RETURN IF keyval(72) > 1 AND newl > 0 THEN newl = newl - (1 + 10 * keyval(29)) IF keyval(80) > 1 AND newl < 5118 THEN newl = newl + (1 + 10 * keyval(29)) IF keyval(73) > 1 THEN newl = newl - 200: IF newl < 0 THEN newl = 0 IF keyval(81) > 1 THEN newl = newl + 200: IF newl > 5118 THEN newl = 5118 drawpage map(), newl + 1, 1 printstr "map row:" + STR$(newl), 0, 20 * 8, 1 printstr "Use ^ | PgUp and PgDn", 0, 21 * 8, 1 printstr "to change the map row.", 0, 22 * 8, 1 copypage 1, 0 LOOP UNTIL keyval(28) > 1 script(1, ptr + top) = newl RETURN makeenemy: ex = script(4, ptr + top) ey = script(5, ptr + top) IF ex < 0 THEN ex = 0 IF ex > 319 THEN ex = 319 IF ey < 0 THEN ey = 0 IF ey > 199 THEN ey = 199 offset = (((l - 1) / 20) - INT((l - 1) / 20)) * 20 setkeys DO: setkeys IF keyval(1) > 1 THEN RETURN IF keyval(72) > 1 THEN ey = ey - (1 + SGN(keyval(29)) * 20): IF ey < 0 THEN ey = 0 IF keyval(80) > 1 THEN ey = ey + (1 + SGN(keyval(29)) * 20): IF ey > 199 THEN ey = 199 IF keyval(75) > 1 THEN ex = ex - (1 + SGN(keyval(29)) * 20): IF ex < 0 THEN ex = 0 IF keyval(77) > 1 THEN ex = ex + (1 + SGN(keyval(29)) * 20): IF ex > 319 THEN ex = 319 IF keyval(29) > 0 THEN ex = INT((ex + 1) / 20) * 20: ey = INT((ey + offset) / 20) * 20 - offset: IF ey < 0 THEN ey = ey + 20 drawpage map(), l, 1 textcolor 38 + ABS(rot), 0: rot = rot + 1: IF rot > 10 THEN rot = -10 printstr "*", ex, ey, 1: textcolor 15, 0 printstr "X =" + STR$(ex) + " Y =" + STR$(ey), 0, 0, 1 printstr "Use ^ | < > to position enemy.", 0, 20 * 8, 1 printstr "* indicates enemy's top left corner.", 0, 21 * 8, 1 copypage 1, 0 LOOP UNTIL keyval(28) > 1 script(4, ptr + top) = ex script(5, ptr + top) = ey RETURN setmaptile: IF ty < 1 THEN ty = 1 newb = script(2, ptr + top) IF newb < 0 THEN newb = 0 IF newb > 159 THEN newb = 159 offset = (((l - 1) / 20) - INT((l - 1) / 20)) * 20 soff = INT((l - 1) / 20) * 16 setkeys DO: setkeys IF keyval(1) > 1 THEN RETURN IF keyval(72) > 1 AND ty > 0 + SGN(offset) THEN ty = ty - 1 IF keyval(80) > 1 AND ty < 8 THEN ty = ty + 1 IF keyval(75) > 1 AND tx > 0 THEN tx = tx - 1 IF keyval(77) > 1 AND tx < 15 THEN tx = tx + 1 IF keyval(57) > 1 THEN GOSUB blockpal: setkeys drawpage map(), l, 1 printstr "Number:" + STR$(soff + (ty * 16) + tx) + " Picture" + STR$(newb), 0, 0, 1 printstr "X", (tx * 20) + 6, ((ty * 20) + 6) - offset, 1 printstr "Use ^ | < > to select block", 0, 20 * 8, 1 printstr "Press SPACE to toggle mapblock palette", 0, 21 * 8, 1 copypage 1, 0 LOOP UNTIL keyval(28) > 1 script(1, ptr + top) = soff + (ty * 16) + tx script(2, ptr + top) = newb RETURN blockpal: setkeys DO: setkeys IF keyval(1) > 1 THEN RETURN IF keyval(72) > 1 AND newb > 15 THEN newb = newb - 16 IF keyval(80) > 1 AND newb < 144 THEN newb = newb + 16 IF keyval(75) > 1 AND newb > 0 THEN newb = newb - 1 IF keyval(77) > 1 AND newb < 159 THEN newb = newb + 1 printstr "X", ((newb / 16 - INT(newb / 16)) * 16) * 20 + 6, INT(newb / 16) * 20 + 6, 1 printstr "Use ^ | < > to select picture", 0, 20 * 8, 1 printstr "Press SPACE to toggle mapblock palette", 0, 21 * 8, 1 copypage 1, 0: copypage 3, 1 LOOP UNTIL keyval(57) > 1 RETURN advance: setkeys DO: setkeys IF keyval(72) > 1 THEN script(1, ptr + top) = script(1, ptr + top) + 1 IF keyval(80) > 1 AND script(1, ptr + top) > 0 THEN script(1, ptr + top) = script(1, ptr + top) - 1 GOSUB updatel drawpage map(), l, 1 printstr "Delay:" + STR$(script(1, ptr + top)), 0, 0, 1 printstr "Use ^ | to fine tune advance.", 0, 20 * 8, 1 copypage 1, 0 LOOP UNTIL keyval(28) > 1 RETURN filemenu: setkeys DO: setkeys IF keyval(72) > 1 AND mptr > 0 THEN mptr = mptr - 1 IF keyval(80) > 1 AND mptr < 4 THEN mptr = mptr + 1 IF keyval(28) > 1 AND mptr = 0 THEN RETURN IF keyval(28) > 1 AND mptr = 1 THEN GOSUB save: mptr = 0 IF keyval(28) > 1 AND mptr = 2 THEN GOSUB load: mptr = 0: GOSUB updatel IF keyval(28) > 1 AND mptr = 3 THEN GOSUB loadmap: mptr = 0 IF keyval(28) > 1 AND mptr = 4 THEN GOTO fini drawpage map(), l, 1 FOR i = 0 TO 4 IF mptr = i THEN textcolor 22 + ABS(rot), 0: rot = rot + 1: IF rot > 10 THEN rot = -10 printstr fmenu$(i), 160 - (LEN(fmenu$(i)) * 4), 48 + (10 * i), 1 textcolor 15, 0 NEXT copypage 1, 0 LOOP UNTIL keyval(1) > 1 mptr = 0 RETURN fini: fadeto fade(), 0, 0, 0: SCREEN 13 regs.ax = &H2509: regs.ds = seg9: regs.dx = off9 CALL interruptx(&H21, regs, regs) SCREEN 13: SYSTEM DATA "Terminate ","SetScroll ","SetMapLoc ","MakeEnemy ","RunScript ","IfJumpTo ","SetMapTile ","SetCounter ","Advance ","Incriment " DATA 0,1,1,5,2,3,2,2,1,2 DATA (),(Speed),(Location),"(Type,Move,Counter,Xpos,Ypos)","(Number,Position)","(Counter,Value,Position)","(Number,Picture)","(Counter,Value)","(Frames)","(Counter,Value)" DATA 45,31,50,18,19,36,20,46,30,23 DATA "RESUME SCRIPTING","SAVE SCRIPT","LOAD SCRIPT","LOAD MAP AND BACKDROP","QUIT" REM $STATIC FUNCTION ifpos (word) ifword = INT(word / 32767) + 1 END FUNCTION SUB menu (item$(), args(), script(), ptr, top, offset) nul$ = " " FOR i = top TO top + 17 IF i = ptr + top THEN textcolor 12, 0 a$ = "" FOR o = 1 TO args(script(0, i)) a$ = a$ + STR$(script(o, i)) + RIGHT$(nul$, 6 - (LEN(STR$(script(o, i))))) NEXT printstr item$(script(0, i)) + a$, 0, (i - top) * 8, 1 textcolor 15, 0 NEXT END SUB