'GAMEPAD 1 TOUCHSCREEN PAUSE OFF DIM GLOBAL VIEWING_CARDS(2,2) GLOBAL MSG1$,MSG2$,MESSAGE_TIMER,VOICE_VALUE GLOBAL SKILL_COUNT SKILL_COUNT = 0 CALL COUNT_SKILLS(SKILL_COUNT) DIM GLOBAL SKILL_INFO(SKILL_COUNT,3) DIM GLOBAL SKILL_DESCRIPTION$(SKILL_COUNT,1) '0 ATTACK, 1 FIREBALL,2 BLOCK,3 CLAIRVOYANCE, 4 TAUNT,5 DETECT LIFE,6 TRUE STRIKE,7 MAGNET,8 SCOUT,9 DEAD SIGHT,10 RESISTANCE,11 CONFUSED DIM GLOBAL SKILLS(3,1) GLOBAL SKILL_LEVEL,SKILL_SELECTION,SKILL_SELECTED SKILL_LEVEL = 0 SKILL_SELECTION = 0 SKILL_SELECTED = 0 GLOBAL CURSOR_X,CURSOR_Y,GRID_X_POS,GRID_Y_POS,MAX_STAGE CURSOR_X = 0 CURSOR_Y = 0 GRID_X_POS = 0 GRID_Y_POS = 0 MAX_STAGE = 15 GLOBAL STAGE,W_LIMIT,H_LIMIT,CURRENT_W,CURRENT_H W_LIMIT = 6 H_LIMIT = 6 STAGE = 0 'CARD THINGS GLOBAL CARD_TYPE_COUNT,CRD_IMG_IDX,CRD_TYPE_IDX,CRD_NAME_IDX,CRD_INFO_IDX,CRD_STAGE_IDX,EMY_CRD_TYPE,CARD_COUNT CARD_TYPE_COUNT = 0 CALL COUNT_CARD_TYPE(CARD_TYPE_COUNT) CRD_TYPE_IDX = 0 CRD_IMG_IDX = 1 CRD_STAGE_IDX = 2 CRD_NAME_IDX = 0 CRD_INFO_IDX = 1 EMY_CRD_TYPE = 1 DIM GLOBAL CARD_STATS(CARD_TYPE_COUNT - 1,3) DIM GLOBAL CARD_DESCRIPTION$(CARD_TYPE_COUNT - 1,3) 'MAP THINGS GLOBAL MAP_CRD_IDX,MAP_CRD_STATE,CRD_STATE_NA,CRD_STATE_ACT,CRD_STATE_DTH DIM GLOBAL MAP(W_LIMIT - 1,H_LIMIT - 1,2) MAP_CRD_IDX = 0 MAP_CRD_STATE = 1 CRD_STATE_NA = 0 CRD_STATE_ACT = 1 CRD_STATE_DTH = 2 GLOBAL CLASS,MAX_HP,HP,VENOM,START,AMPLITUDE,START_INC,VENOM_WAS_USED,SCORE,SCORE_MULTIPLIER CLASS = 0 VENOM = 0 START = 0 START_INC = 0.1 AMPLITUDE = 1.3 VENOM_WAS_USED = 0 CALL MAIN_LOOP 'GAME LOOPS ################################################################################################## SUB MAIN_LOOP ON RASTER CALL H_DRAW DO CALL TITLE_SCREEN CALL CLASS_SELECT_SCREEN 'REPEAT LEVEL->VICTORY SCREEN REPEAT CALL STAGE_SCREEN IF HP > 0 AND STAGE <= MAX_STAGE THEN CALL XP_INCREASE_SCREEN UNTIL HP = 0 OR STAGE > MAX_STAGE CALL END_SCREEN LOOP END SUB SUB TITLE_SCREEN CALL INIT_TITLE_DRAW REPEAT WAIT VBL UNTIL TAP END SUB SUB CLASS_SELECT_SCREEN TRACK 0,VOICE_VALUE WAIT VBL 'X,Y,CLASS CURSOR_X = -1 CURSOR_Y = -1 DIM BUTTONS(2,3) BUTTONS(0,0) = 3 BUTTONS(0,1) = 2 BUTTONS(0,3) = 78 BUTTONS(1,0) = 5 BUTTONS(1,1) = 2 BUTTONS(1,2) = 1 BUTTONS(1,3) = 76 CALL INIT_CLASS_DRAW(BUTTONS()) SELECTION = -1 CONFIRMED = 0 REPEAT 'IF LEFT TAP(0) OR RIGHT TAP(0) THEN SELECTION = (SELECTION + 1) MOD 2 'CURSOR_X = 3 + SELECTION IF TAP THEN X = TOUCH.X \16 Y = TOUCH.Y \16 IF X = CURSOR_X AND Y = CURSOR_Y THEN CONFIRMED = 1 ELSE FOR B = 0 TO 1 IF X = BUTTONS(B,0) AND Y = BUTTONS(B,1) THEN CURSOR_X = X CURSOR_Y = Y SELECTION = BUTTONS(B,2) END IF NEXT B BG 1 RESTORE CLASS_INFO LINE = 7 CLS 1 REPEAT READ KEY,INFO$ IF KEY = SELECTION THEN TEXT 0,LINE,INFO$ INC LINE END IF UNTIL KEY = -1 BG 0 END IF END IF WAIT VBL UNTIL CONFIRMED TRACK 0,VOICE_VALUE MAX_HP = 20 HP = MAX_HP CALL LOAD_SKILL_INFO(SKILL_COUNT) SPRITE OFF 0 CLASS = SELECTION RANDOMIZE TIMER CALL INIT_VALUES END SUB SUB STAGE_SCREEN CLS 'GET CENTER CURRENT FLOOR LOW_LIMIT_X = W_LIMIT\2 - CURRENT_W\2 LOW_LIMIT_Y = H_LIMIT\2 - CURRENT_H\2 UP_LIMIT_X = LOW_LIMIT_X + CURRENT_W - 1 UP_LIMIT_Y = LOW_LIMIT_Y + CURRENT_H - 1 CALL RESET_VIEWING_CARDS CALL GENERATE_STAGE(LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y) CALL DRAW_MESSAGE("FLOOR:"+STR$(STAGE)) WAIT 30 CALL INIT_MAP_SCREEN(LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y) CURSOR_X = LOW_LIMIT_X CURSOR_Y = LOW_LIMIT_Y WAIT VBL CARD_COUNT = (CURRENT_H * CURRENT_W)\2 REPEAT SELECTED_PRESSED = 0 OLD_SKILL = SKILL_SELECTION 'CALL PAD_INPUT(LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y,SELECTED_PRESSED) CALL TOUCH_INPUT(LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y,SELECTED_PRESSED) IF SELECTED_PRESSED = 1 AND CURSOR_X = VIEWING_CARDS(0,0) AND CURSOR_Y = VIEWING_CARDS(0,1) THEN CALL DRAW_MESSAGE(CARD_DESCRIPTION$(MAP(VIEWING_CARDS(0,0),VIEWING_CARDS(0,1),MAP_CRD_IDX),CRD_INFO_IDX )) ELSE IF SELECTED_PRESSED = 1 THEN CALL DRAW_MESSAGE(CARD_DESCRIPTION$(MAP(CURSOR_X,CURSOR_Y,MAP_CRD_IDX),CRD_NAME_IDX )) IF VIEWING_CARDS(0,0) = -1 THEN MOVE_ON = 1 CALL USE_SKILL_1(LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y,MOVE_ON) IF MOVE_ON AND MAP(CURSOR_X,CURSOR_Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN CALL VIEW_CARD(CURSOR_X,CURSOR_Y) CALL FLIP_CARD(CURSOR_X,CURSOR_Y,1) END IF ELSE IF VIEWING_CARDS(1,0) = -1 AND MAP(CURSOR_X,CURSOR_Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN CALL VENOM_EFFECT(CURSOR_X,CURSOR_Y,VIEWING_CARDS(0,0),VIEWING_CARDS(0,1),LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y) IF CURSOR_X <> VIEWING_CARDS(0,0) OR CURSOR_Y <> VIEWING_CARDS(0,1) THEN MOVE_ON = 1 CALL USE_SKILL_2(LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y,MOVE_ON) IF MOVE_ON THEN CALL VIEW_CARD(CURSOR_X,CURSOR_Y) CALL FLIP_CARD(CURSOR_X,CURSOR_Y,1) SAME_TYPE = 0 CALL COMPARE_TYPE(VIEWING_CARDS(0,0),VIEWING_CARDS(0,1),VIEWING_CARDS(1,0),VIEWING_CARDS(1,1),SAME_TYPE) IF SAME_TYPE THEN CARD_TYPE = CARD_STATS(MAP(VIEWING_CARDS(0,0),VIEWING_CARDS(0,1),MAP_CRD_IDX),CRD_TYPE_IDX) IF CARD_TYPE = EMY_CRD_TYPE THEN CALL DRAW_ATTACK(VIEWING_CARDS(0,0) * 16,VIEWING_CARDS(0,1) * 16,VIEWING_CARDS(1,0) * 16,VIEWING_CARDS(1,1) * 16) CALL DRAW_MESSAGE("YOU KILLED A "+ CARD_DESCRIPTION$(MAP(VIEWING_CARDS(0,0),VIEWING_CARDS(0,1),MAP_CRD_IDX),CRD_NAME_IDX)) CALL INCREASE_MP(1) ADD SCORE,SCORE_MULTIPLIER INC SCORE_MULTIPLIER CALL USE_SKILL_SAME(LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y) WAIT 30 ELSE IF CARD_TYPE = 2 THEN IF CARD_DESCRIPTION$(MAP(VIEWING_CARDS(0,0),VIEWING_CARDS(0,1),MAP_CRD_IDX),0) = "HEAL POTION" THEN HEAL_VALUE = 1 CALL HEAL(HEAL_VALUE) ELSE CALL INCREASE_MP(3) CALL UPDATE_SKILL_DRAWING CALL DRAW_MESSAGE("SKILL POINTS INCREASED") CALL DRAW_POTION_HEAL END IF END IF CALL DISABLE_VIEW_CARDS CALL DRAW_DISABLE_CARD(VIEWING_CARDS(0,0),VIEWING_CARDS(0,1)) CALL DRAW_DISABLE_CARD(VIEWING_CARDS(1,0),VIEWING_CARDS(1,1)) ELSE SCORE_MULTIPLIER = 1 IF CARD_STATS(MAP(VIEWING_CARDS(0,0),VIEWING_CARDS(0,1),MAP_CRD_IDX),CRD_TYPE_IDX) = 2 THEN IF CARD_STATS(MAP(VIEWING_CARDS(1,0),VIEWING_CARDS(1,1),MAP_CRD_IDX),CRD_TYPE_IDX) = EMY_CRD_TYPE THEN SWAP VIEWING_CARDS(0,0),VIEWING_CARDS(1,0) SWAP VIEWING_CARDS(0,1),VIEWING_CARDS(1,1) END IF END IF FOR C = 0 TO 1 X = VIEWING_CARDS(C,0) Y = VIEWING_CARDS(C,1) IF X = -1 OR Y = -1 THEN GOTO SKIP TYPE = CARD_STATS(MAP(X,Y,MAP_CRD_IDX),CRD_TYPE_IDX) IF MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN IF TYPE = EMY_CRD_TYPE THEN IF SKILL_SELECTED AND SKILLS(SKILL_SELECTION,0) = 4 AND CARD_DESCRIPTION$(MAP(X,Y,MAP_CRD_IDX),CRD_NAME_IDX) <> "ORC" THEN OTHER_X = 0 OTHER_Y = 0 CALL TAUNT(LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y,X,Y,MAP(X,Y,MAP_CRD_IDX),OTHER_X,OTHER_Y) CALL FLIP_CARD(OTHER_X,OTHER_Y,1) CALL ATTACK(MAP(X,Y,MAP_CRD_IDX),X,Y) CALL FLIP_CARD(OTHER_X,OTHER_Y,0) ELSE CALL ATTACK(MAP(X,Y,MAP_CRD_IDX),X,Y) END IF IF HP = 0 THEN BG 0 CELL 7,2,0 WAIT VBL CELL 7,3,0 END IF END IF IF C THEN WAIT 15 CALL FLIP_CARD(X,Y,0) END IF SKIP: NEXT C END IF CALL TURN_OFF_SKILL END IF IF VENOM_WAS_USED = 0 THEN DEC VENOM VENOM = MAX(0,VENOM) END IF VENOM_WAS_USED = 0 CALL RESET_VIEWING_CARDS END IF END IF ELSE IF SELECTED_PRESSED = 2 THEN MSG$ = SKILL_DESCRIPTION$(SKILLS(SKILL_SELECTION,0),0)+": " MSG$ = MSG$ + SKILL_DESCRIPTION$(SKILLS(SKILL_SELECTION,0),1) CALL DRAW_MESSAGE(MSG$) SKILL_SELECTED = 1 CALL USE_SKILL_0(LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y) END IF CALL UPDATE_SKILL_DRAWING WAIT VBL CALL COUNT_LIVE_CARDS(LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y,CARD_COUNT) UNTIL CARD_COUNT = 0 OR HP <= 0 VENOM = 0 MSG$ = "YOU DIED!" IF HP THEN MSG$ = "FLOOR CLEARED!" TRACK 0,VOICE_VALUE END IF CALL DRAW_MESSAGE(MSG$) WAIT 60 CALL INC_STAGE END SUB SUB RESET_VALUES(BUTTONS(),HP_DIFF,MP_DIFF,SKILL_TO_UPGRADE,SKILL_INDEX,FINISHED) HP_DIFF = 0 MP_DIFF = 0 SKILL_TO_UPGRADE = 0 SKILL_INDEX = 0 FINISHED = 0 END SUB SUB XP_INCREASE_SCREEN DIM BUTTONS(10,3) DIM STORE_SKILLS(3,1) HP_DIFF = 0 MP_DIFF = 0 SKILL_TO_UPGRADE = 0 FINISHED = 0 'KEEP TRAC OF SKILLS PLACED IN THE STORE DIM PLACED_SKILLS(SKILL_COUNT) FOR ROUND = 0 TO 3 PLACED = 0 REPEAT S = RND(SKILL_COUNT) IF S THEN IF PLACED_SKILLS(S) = 0 THEN IF SKILL_INFO(S,3) = CLASS AND SKILL_DESCRIPTION$(S,0) <>"" THEN STORE_SKILLS(ROUND,0) = S STORE_SKILLS(ROUND,1) = SKILL_INFO(S,2) PLACED_SKILLS(S) = 1 PLACED = 1 END IF END IF END IF UNTIL PLACED NEXT ROUND Y = 2 FOR X = 0 TO 10 IF X < 4 THEN CALL SET_BUTTON(BUTTONS(),X,X,2,SKILL_INFO(STORE_SKILLS(X,0),0),1) ELSE IF X = 4 THEN CALL SET_BUTTON(BUTTONS(),X,X,2,166,ABS( HP < MAX_HP)) ELSE IF X = 5 THEN CALL SET_BUTTON(BUTTONS(),X,X,2,160,1) ELSE IF X = 6 THEN CALL SET_BUTTON(BUTTONS(),X,0,5,168,1) ELSE IF X = 7 THEN CALL SET_BUTTON(BUTTONS(),X,5,5,170,0) ELSE IMG = 2 S_INDEX = X - 7 IF SKILLS(S_INDEX,0) THEN IMG = SKILL_INFO(SKILLS(S_INDEX,0),0) CALL SET_BUTTON(BUTTONS(),X,7 + (X-8),5,IMG,0) END IF NEXT X CALL INIT_STAGE_FIN_DRAW(BUTTONS()) DIM ANIM_FRAMES(7) REPEAT IF TAP THEN FOUND = 0 B = -1 REPEAT INC B FOUND = ((BUTTONS(B,0) = TOUCH.X\16) AND (BUTTONS(B,1) = TOUCH.Y\16)) AND BUTTONS(B,3) = 1 UNTIL B = 10 OR FOUND IF FOUND THEN CURSOR_X = BUTTONS(B,0) CURSOR_Y = BUTTONS(B,1) END IF IF B = 6 THEN INC FINISHED ELSE IF B = 4 THEN 'RESTORE HP HP_DIFF = 2 BG 1 NUMBER 15,8,MIN(MAX_HP,HP + HP_DIFF),02 BG 0 CALL DRAW_MESSAGE("HP HEALED") CALL DRAW_POTION_HEAL INC FINISHED ELSE IF B = 5 THEN 'RESTORE MP MP_DIFF = 3 CALL DRAW_MESSAGE("SKILL POINTS INCREASED") CALL DRAW_POTION_HEAL SPR = 19 X = 7 FOR I = 1 TO 3 IF SKILLS(I,0) THEN MAX_V = SKILL_INFO(SKILLS(I,0),1) CUR_V = SKILLS(I,1) CALL DRAW_BAR(MIN(MAX_V,CUR_V + MP_DIFF),MAX_V,SPR + I,X * 16 + 4,5 * 16 + 12) END IF ADD X,I NEXT I INC FINISHED ELSE IF B = 7 THEN MP_DIFF = 0 HP_DIFF = 0 SKILL_TO_UPGRADE = 0 S = 0 FOUND = 0 FINISHED = 0 FOR B = 0 TO 10 X = BUTTONS(B,0) Y = BUTTONS(B,1) IMG = BUTTONS(B,2) ACTIVE = BUTTONS(B,3) XOR 1 IF B = 6 THEN ACTIVE = 1 ELSE IF B = 4 THEN ACTIVE = ABS(HP < MAX_HP) ELSE IF B > 7 THEN ACTIVE = 0 CELL X,Y,IMG END IF CALL SET_BUTTON(BUTTONS(),B,X,Y,IMG,ACTIVE) TINT X,Y PAL ACTIVE XOR 1 NEXT B CALL GEN_HIDE_FRAMES(BUTTONS(6,2),ANIM_FRAMES()) CALL PLAY_FLIP_ANIMATION(BUTTONS(6,0),BUTTONS(6,1),ANIM_FRAMES(),3) CALL UPDATE_SKILL_DRAWING BG 1 NUMBER 15,8,HP,02 BG 0 ELSE IF B < 4 THEN 'SELECT STORE SKILL S = STORE_SKILLS(B,0) CALL DRAW_MESSAGE(SKILL_DESCRIPTION$(S,0)+": "+SKILL_DESCRIPTION$(S,1)) FOR R = 8 TO 10 CALL SET_BUTTON(BUTTONS(),R,BUTTONS(R,0),BUTTONS(R,1),2,1) TINT BUTTONS(R,0),BUTTONS(R,1) PAL 0 NEXT R ELSE IF B > 7 AND FOUND THEN 'ASSIGN STORE SKILL TO SKILL SKILL_TO_UPGRADE = B-8+1 CALL GEN_SHOW_FRAMES( SKILL_INFO(S,0) ,ANIM_FRAMES()) CALL PLAY_SOUND(14,60,3) CALL PLAY_FLIP_ANIMATION(BUTTONS(B,0),BUTTONS(B,1),ANIM_FRAMES(),3) CALL DRAW_BAR(0,SKILL_INFO(S,1),19 + SKILL_TO_UPGRADE,(B - 1) * 16 + 4,5 * 16 + 12) INC FINISHED WAIT 15 CALL DRAW_MESSAGE("") END IF IF FINISHED = 1 AND FOUND THEN CURSOR_X = -1 CURSOR_Y = -1 FOR B = 0 TO 10 IF B < 6 OR B > 7 THEN BUTTONS(B,3) = 0 TINT BUTTONS(B,0),BUTTONS(B,1) PAL 1 END IF NEXT B CALL GEN_SHOW_FRAMES(BUTTONS(6,2),ANIM_FRAMES()) CALL PLAY_SOUND(14,60,3) CALL PLAY_FLIP_ANIMATION(BUTTONS(6,0),BUTTONS(6,1),ANIM_FRAMES(),3) CALL SET_BUTTON(BUTTONS(),7,5,5,170,1) TINT BUTTONS(7,0),BUTTONS(7,1) PAL 0 END IF WAIT VBL END IF UNTIL FINISHED = 2 HP = MIN(MAX_HP,HP + HP_DIFF) CALL INCREASE_MP(MP_DIFF) IF S THEN SKILLS( SKILL_TO_UPGRADE,0) = S SKILLS( SKILL_TO_UPGRADE,1) = 0 END IF SPRITE OFF 0 TO 63 CURSOR_X = -1 CURSOR_Y = -1 CALL PLAY_SOUND(13,60,7) WAIT 60 END SUB SUB SET_BUTTON(BUTTONS(),B,X,Y,IMG,ACTIVE) BUTTONS(B,0) = X BUTTONS(B,1) = Y BUTTONS(B,2) = IMG BUTTONS(B,3) = ACTIVE END SUB SUB END_SCREEN CALL INIT_GAME_OVER_DRAW FOR SKILL = 1 TO 3 SKILLS(SKILL,0) = 0 SKILLS(SKILL,1) = -1 NEXT SKILL REPEAT WAIT VBL UNTIL TAP END SUB SUB RESET_VIEWING_CARDS FOR C = 0 TO 1 VIEWING_CARDS(C,0) = -1 NEXT C END SUB SUB VIEW_CARD(X,Y) INDEX = 0 IF VIEWING_CARDS(INDEX,0) <> -1 THEN INDEX = 1 VIEWING_CARDS(INDEX,0) = X VIEWING_CARDS(INDEX,1) = Y END SUB 'DRAW FUNCTIONS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SUB H_DRAW IF VENOM THEN CALL VENOM_OFF_CAL IF RASTER = 112 THEN CALL INC_START END IF ELSE SCROLL 0,0,0 END IF END SUB SUB INIT_TITLE_DRAW PAL 0 BG FILL 0,0 TO 19,15 CHAR 0 SPRITE OFF 0 TO 63 BG COPY 0,0,20,16 TO 0,0 TEXT 3,2,"MEMORY ROGUE" ON VBL CALL TITLE_DRAW END SUB SUB TITLE_DRAW IF TIMER MOD 60 <> 0 THEN EXIT SUB TEXT_1$ = "TAP TO START" TEXT_2$ = " " IF TIMER MOD 120 THEN TEXT 3,13,TEXT_2$ ELSE TEXT 3,13,TEXT_1$ END IF END SUB SUB INIT_CLASS_DRAW(BUTTONS()) CLS CELL SIZE 0,1 BG 0 FOR B = 0 TO 1 CELL BUTTONS(B,0),BUTTONS(B,1),BUTTONS(B,3) NEXT B ON VBL CALL DRAW_CLASS_SCREEN END SUB SUB DRAW_CLASS_SCREEN CUR_PXL_POS_X = CURSOR_X * 16 CUR_PXL_POS_Y = CURSOR_Y * 16 CALL DRAW_CURSOR(CUR_PXL_POS_X,CUR_PXL_POS_Y,8,8,0) END SUB SUB DRAW_HIDDEN_CARDS(LOW_X,LOW_Y,UPPER_X,UPPER_Y) ON VBL OFF CELL SIZE 0,1 CLS SPRITE OFF 0 FOR X = LOW_X TO UPPER_X FOR Y = LOW_Y TO UPPER_Y CELL GRID_X_POS + X , GRID_Y_POS + Y , 2 NEXT Y NEXT X END SUB SUB INIT_MAP_SCREEN(LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y) BG 0 PRIO 0 CLS PAL 0 NUM_OF_TILES = CURRENT_W * CURRENT_H NUM_OF_CARDS = NUM_OF_TILES \ 2 CALL DRAW_HIDDEN_CARDS(LOW_LIMIT_X,LOW_LIMIT_Y,UP_LIMIT_X,UP_LIMIT_Y) IF NUM_OF_TILES MOD 2 THEN X = (LOW_LIMIT_X + UP_LIMIT_X)\2 Y = (LOW_LIMIT_Y + UP_LIMIT_Y)\2 CELL X,Y,14 CALL DRAW_DISABLE_CARD(X,Y) END IF CALL DRAW_STATS_SECTION ON VBL CALL DRAW_MAP_SCREEN END SUB SUB DRAW_MAP_SCREEN CUR_PXL_POS_X = (CURSOR_X + GRID_X_POS) * 16 CUR_PXL_POS_Y = (CURSOR_Y + GRID_Y_POS ) * 16 CALL DRAW_CURSOR(CUR_PXL_POS_X,CUR_PXL_POS_Y,8,8,0) BG 1 PRIO 1 NUMBER 15,8,HP,2 TEXT 17,1,STR$(SCORE) IF VENOM THEN CELL 16,4,205 CALL DRAW_BAR(VENOM,3,25,16 * 8,4 * 8 + 4) ELSE CELL 16,4,0 SPRITE OFF 25 END IF PRIO 0 BG 0 IF SKILL_SELECTION THEN CALL DRAW_CURSOR((6 + SKILL_SELECTION) * 16 ,5 * 16 ,8,8,5) FOR X = 7 TO 9 TINT X,5 PAL 1 NEXT X ELSE CALL DRAW_CURSOR(-16 ,-16 ,8,8,5) END IF IF MESSAGE_TIMER THEN DEC MESSAGE_TIMER IF MESSAGE_TIMER = 0 THEN CALL DRAW_MESSAGE("") MESSAGE_TIMER = 0 END IF END IF END SUB SUB DRAW_STATS_SECTION BG 0 CELL SIZE 0,1 PORTRAIT = 78 IF CLASS THEN PORTRAIT = 76 CELL 7,2,PORTRAIT CELL 7,3,(PORTRAIT + 32) BG 1 PRIO 1 TEXT 15,1,"S:"+STR$(SCORE) CELL 14,8,196 NUMBER 15,8,HP,2 FOR X = 0 TO 19 CELL X,12,255 NEXT X PRIO 0 BG 0 'DRAW SKILL SELECTION S_INDEX = 1 Y = 5 FOR X = 7 TO 9 IF S_INDEX < 4 THEN IF S_INDEX > 0 AND SKILLS(S_INDEX,0) > 0 THEN CELL X,Y, SKILL_INFO(SKILLS(S_INDEX,0),0) ELSE CELL X,Y,002 END IF INC S_INDEX END IF NEXT X END SUB SUB UPDATE_SKILL_DRAWING SPR = 19 X = 6 Y = 5 BG 0 FOR S = 1 TO 3 IF SKILLS(S,0) THEN MAX_V = SKILL_INFO(SKILLS(S,0),1) CUR_V = SKILLS(S,1) CALL DRAW_BAR(CUR_V,MAX_V,SPR + S,(X + S) * 16 + 4,Y * 16 + 12) IF (MAX_V > CUR_V) OR SKILL_SELECTION THEN TINT X + S, Y PAL 1 ELSE TINT X + S, Y PAL 0 END IF ELSE TINT X + S, Y PAL 1 END IF NEXT S IF SPRITE.C(63-36) = 194 OR SPRITE.C(63-36) = 195 THEN FOR SPR = 63 - 36 TO 63 CALL DRAW_SWIRL(SPR,SPRITE.X(SPR),SPRITE.Y(SPR)) NEXT SPR END IF END SUB SUB DRAW_BAR(V,MAX_V,SPR,X,Y) IF MAX_V = 0 THEN SPRITE OFF SPR EXIT SUB END IF VALUE = (6/MAX_V) * V IMG = 251 IF VALUE > 0 THEN INC IMG IF VALUE > 3 THEN INC IMG SPRITE SPR,X,Y,IMG P = 2 IF VALUE = 2 OR VALUE = 5 THEN P = 3 IF VALUE = 3 OR VALUE = 6 THEN P = 4 SPRITE SPR PAL P END SUB SUB DRAW_CURSOR(X,Y,W,H,SPR) IMG = 202 IF TIMER\20 MOD 2 THEN INC IMG SPRITE SPR, X,Y,IMG SPRITE SPR + 1, X + W,Y,IMG SPRITE SPR + 2, X,Y + H,IMG SPRITE SPR + 3, X + W,Y + H,IMG SPRITE SPR + 1 FLIP 1,0 SPRITE SPR + 2 FLIP 0,1 SPRITE SPR + 3 FLIP 1,1 END SUB SUB INIT_STAGE_FIN_DRAW(BUTTONS()) CLS CURSOR_X = -1 CURSOR_Y = -1 BG 1 TEXT 0,2,"UPGRADES" FOR X = 0 TO CURRENT_W -1 FOR Y = 11 TO 11 - CURRENT_H + 1 STEP -1 CELL X,Y,219 TINT X,Y PAL 1 NEXT Y NEXT X BG 0 CALL DRAW_STATS_SECTION FOR B = 0 TO 10 IMG = 2 IF B > 3 THEN IMG = BUTTONS(B,2) CELL BUTTONS(B,0),BUTTONS(B,1),IMG TINT BUTTONS(B,0),BUTTONS(B,1) PAL ABS(BUTTONS(B,3) = 0) NEXT B WAIT VBL DIM ANIM_FRAMES(7) FOR B = 0 TO 3 CALL GEN_SHOW_FRAMES(BUTTONS(B,2),ANIM_FRAMES()) CALL PLAY_SOUND(14,60,3) CALL PLAY_FLIP_ANIMATION(BUTTONS(B,0),BUTTONS(B,1),ANIM_FRAMES(),3) WAIT 5 NEXT B CALL GEN_HIDE_FRAMES(BUTTONS(6,2),ANIM_FRAMES()) CALL PLAY_SOUND(14,60,3) CALL PLAY_FLIP_ANIMATION(BUTTONS(6,0),BUTTONS(6,1),ANIM_FRAMES(),3) ON VBL CALL DRAW_STAGE_FIN END SUB SUB DRAW_STAGE_FIN CUR_PXL_POS_X = CURSOR_X * 16 CUR_PXL_POS_Y = CURSOR_Y * 16 CALL DRAW_CURSOR(CUR_PXL_POS_X,CUR_PXL_POS_Y,8,8,0) END SUB SUB DRAW_ATTACK(X1,Y1,X2,Y2) SPR1 = 63-36 SPR2 = SPR1 + 1 IMG = 198 FLIP_X = 0 FLIP_Y = 0 WAIT_TIME = 5 CALL PLAY_SOUND(60,20,1) FOR F = 1 TO 3 CALL DRAW_ATT_SPRITE(X1,Y1,SPR1,IMG,FLIP_X,FLIP_Y) CALL DRAW_ATT_SPRITE(X2,Y2,SPR2,IMG,FLIP_X,FLIP_Y) IF F = 1 THEN FLIP_X = 1 ELSE IF F = 2 THEN FLIP_Y = 1 END IF WAIT WAIT_TIME NEXT F WAIT WAIT_TIME * 3 SPRITE OFF SPR1 TO SPR2 END SUB SUB DRAW_ATT_SPRITE(X,Y,SPR,IMG,FLIP_X,FLIP_Y) SPRITE SPR,X,Y,IMG SPRITE SPR FLIP FLIP_X,FLIP_Y END SUB SUB INIT_GAME_OVER_DRAW CELL SIZE 0,0 CLS ON VBL OFF SPRITE OFF 0 TO 63 MESSAGE$ = "GAMEOVER" IF HP > 0 THEN MESSAGE$ = "CONGRATULATIONS" TEXT 3,5,MESSAGE$ END SUB SUB FLIP_CARD(X,Y,TO_SHOW) IMG = 0 CALL GET_CELL_IMAGE(X,Y,IMG) DIM ANIM_FRAMES(7) IF TO_SHOW THEN CALL GEN_SHOW_FRAMES(IMG,ANIM_FRAMES()) ELSE CALL GEN_HIDE_FRAMES(IMG,ANIM_FRAMES()) END IF CALL PLAY_SOUND(14,60,3) CALL PLAY_FLIP_ANIMATION(X,Y,ANIM_FRAMES(),3) END SUB SUB PLAY_FLIP_ANIMATION(X,Y,ANIM_FRAMES(),WAITT) FRAME = 0 REPEAT CELL X + GRID_X_POS,Y + GRID_Y_POS,ANIM_FRAMES(FRAME) INC FRAME IF WAITT THEN WAIT WAITT UNTIL FRAME > 7 END SUB SUB DRAW_DISABLE_CARD(X,Y) TINT X + GRID_X_POS,Y + GRID_Y_POS PAL 1 END SUB SUB DRAW_MESSAGE(MSG$) LINE$ = MSG$ CLEAR$ = " " BG 1 TEXT 0,13,CLEAR$ TEXT 0,14,CLEAR$ TEXT 0,15,CLEAR$ FOR L = 0 TO 2 DISP$ = "" NEXT_LINE$ = "" CALL SPLIT_TEXT(LINE$,DISP$,NEXT_LINE$) TEXT 0,13 + L,DISP$ LINE$ = NEXT_LINE$ NEXT L MESSAGE_TIMER = 300 BG 0 END SUB SUB DRAW_VENOM_WAVE(A,S,RASTER_LINE) IF RASTER > 96 THEN EXIT SUB STRENGTH = VAL(LEFT$("100",VENOM)) ' (2 * PI / 120) FO_X = ( 0.05233) * (RASTER * STRENGTH) + S OFFSET = A * SIN( FO_X) SCROLL 0,OFFSET,0 END SUB SUB DRAW_HIT BG 0 CHAR1 = CELL.C(7,2) CHAR2 = CELL.C(7,3) BLANK_CHAR = 0 FOR FRAME = 0 TO 29 IF FRAME AND 1 THEN CELL 7,2,CHAR1 CELL 7,3,CHAR2 ELSE CELL 7,2,BLANK_CHAR CELL 7,3,BLANK_CHAR END IF WAIT VBL NEXT FRAME WAIT VBL END SUB SUB DRAW_POTION_HEAL CALL PLAY_SOUND(72,70,6) X = (7 * 16) Y = (4 * 16) - CLASS * 4 DIM SPRITES(9,2) FOR SPR = 0 TO 9 SPEED = (5 + RND(5)) /10 SPRITES(SPR,0) = X + RND(16) SPRITES(SPR,1) = Y + RND(1) SPRITES(SPR,2) = -SPEED NEXT SPR FRAME = 0 REPEAT FOR SPR = 0 TO 9 SPRITE 10 + SPR,SPRITES(SPR,0),SPRITES(SPR,1),254 SPRITE 10 + SPR PRIO SPR AND 1 ADD SPRITES(SPR,1),SPRITES(SPR,2) NEXT SPR INC FRAME WAIT VBL UNTIL FRAME = 60 SPRITE OFF 10 TO 19 WAIT 30 END SUB SUB DRAW_SWIRL(SPR,X,Y) SPD = TIMER\8 MOD 4 IMG = 194 + (SPD MOD 2) FLIP_IMG = SPD > 1 SPRITE SPR,X,Y,IMG SPRITE SPR FLIP FLIP_IMG,FLIP_IMG END SUB SUB ANIMATE_ATTACK(X,Y,BLOCKED) BG 0 IMG = CELL.C(X,Y) SPR = 9 SPRITE SPR,X * 16,Y *16,IMG SPRITE SPR SIZE 1 CELL X,Y,0 FOR FRAME = 1 TO 5 SPRITE SPR,SPRITE.X(SPR) + FRAME,SPRITE.Y(SPR),IMG WAIT 5\FRAME NEXT FRAME SPRITE OFF SPR IF BLOCKED = 0 THEN CALL PLAY_SOUND(30,20,1) CALL DRAW_HIT ELSE CALL PLAY_SOUND(63,20,4) END IF CELL X,Y,IMG END SUB SUB DRAW_ASSIN_HIDE(OFFSET,IS_ROW,X,Y) 'GET ROW OR COLUMN DIM SET(3,2) SET(0,0) = X SET(0,1) = Y CY = Y + OFFSET CX = X + OFFSET FOR S = 1 TO 3 IF IS_ROW THEN '-1,0,1 CX = X + S - 2 ELSE CY = Y + S - 2 END IF SET(S,0) = CX SET(S,1) = CY IF CELL.C(SET(S,0),SET(S,1)) = 2 OR S = 0 THEN SET(S,2) = 1 NEXT S CALL PLAY_SOUND(14,60,3) FOR R = 0 TO 1 FOR FRAME = 8 TO 2 STEP -2 FOR S = 0 TO 3 IF SET(S,0) >= 0 AND SET(S,0) < W_LIMIT THEN IF SET(S,1) >= 0 AND SET(S,1) < H_LIMIT THEN IF MAP(SET(S,0),SET(S,1),MAP_CRD_STATE) = CRD_STATE_ACT THEN IF SET(S,2) THEN CELL SET(S,0),SET(S,1),FRAME END IF END IF END IF END IF NEXT S WAIT 5 NEXT FRAME NEXT R END SUB SUB CARD_MAGIC(X,Y) DIM PALS(1) PALS(0) = CELL.A(X,Y) MOD 8 PALS(1) = 5 FOR FRAME = 0 TO 10 TINT X,Y PAL PALS(FRAME MOD 2) WAIT 2 NEXT FRAME END SUB SUB DRAW_EXPLOSION(X,Y) IMG = 197 FOR FRAME = 0 TO 10 P = 3 + FRAME MOD 2 PX = X + -2 + RND(4) PY = Y + -2 + RND(4) FOR S = 0 TO 3 FLIP_X = ABS (S MOD 2) FLIP_Y = ABS (S > 1) OFF_X = ABS (S MOD 2) * 8 OFF_Y = ABS (S > 1) * 8 SPRITE 20 + S,PX + OFF_X,PY + OFF_Y,IMG SPRITE 20 + S PAL P FLIP FLIP_X,FLIP_Y NEXT S WAIT VBL NEXT FRAME WAIT 15 FOR S = 0 TO 3 SPRITE OFF 20 + S SPRITE 20 + S FLIP 0,0 NEXT S END SUB SUB ANIMATE_CONF_ATT(X1,Y1,X2,Y2) BG 0 IMG = CELL.C(X1,Y1) SPR = 9 SPRITE SPR,X1 * 16,Y1 *16,IMG SPRITE SPR SIZE 1 CELL X1,Y1,0 DX = X2 - X1 DY = Y2 - Y1 N = SQR(DX * DX + DY * DY) DX = (DX/N) DY = (DY/N) X = X1 * 16 Y = Y1 * 16 FOR FRAME = 1 TO 5 ADD X,DX * FRAME ADD Y,DY * FRAME SPRITE SPR,X,Y,IMG WAIT 5\FRAME NEXT FRAME SPRITE OFF SPR CELL X1,Y1,IMG END SUB 'HELPER FUNCTIONS&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& SUB GENERATE_STAGE(LOW_X,LOW_Y,UPPER_X,UPPER_Y) NUM_OF_TILES = CURRENT_W * CURRENT_H 'DISABLE MIDDLE CARD IF NUM_OF_TILES MOD 2 THEN X = (LOW_X + UPPER_X)\2 Y = (LOW_Y + UPPER_Y)\2 MAP(X,Y,MAP_CRD_IDX) = 0 MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_DTH DEC NUM_OF_TILES END IF NUM_OF_CARDS = NUM_OF_TILES \ 2 DIM TILES(NUM_OF_TILES - 1) NUM_OF_ENEMIES = NUM_OF_CARDS \ 2 + RND(NUM_OF_CARDS \ 2) 'MAKE A LINEAR LIST OF THE TILES TO ADD I = 0 FOR N = 1 TO NUM_OF_CARDS CARD_INDEX = 0 TYPE = 0 IF N <= NUM_OF_ENEMIES THEN TYPE = EMY_CRD_TYPE ELSE TYPE = ABS(RND(3) = 3) * 2 END IF CALL GET_RANDOM_CARD_TYPE(TYPE,CARD_INDEX,STAGE) TILES(I) = CARD_INDEX TILES(I + 1) = CARD_INDEX ADD I,2 NEXT N 'REORGANISE THE LIST BY GOING THROUGH THE LIST AND SWAP THE TILE WITH A RANDOM ONE FOR I = 0 TO NUM_OF_TILES-1 SWAP TILES(I),TILES(RND(NUM_OF_TILES -1)) NEXT I 'APPLY THE LIST TO THE MAP I = 0 FOR X = LOW_X TO UPPER_X FOR Y = LOW_Y TO UPPER_Y IF MAP(X,Y,MAP_CRD_STATE) <> CRD_STATE_DTH THEN MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_ACT MAP(X,Y,MAP_CRD_IDX) = TILES(I) INC I END IF NEXT Y NEXT X END SUB SUB GET_RANDOM_CARD_TYPE(TYPE,CARD_INDEX,CURRENT_STAGE) REPEAT CARD_INDEX = RND(CARD_TYPE_COUNT-1) UNTIL (TYPE = CARD_STATS(CARD_INDEX,CRD_TYPE_IDX)) AND ( CARD_STATS(CARD_INDEX,CRD_STAGE_IDX) <= CURRENT_STAGE) END SUB SUB INC_STAGE INC STAGE 'INCREASE W THEN H EVERY OTHER STAGE IF CURRENT_W = CURRENT_H THEN INC CURRENT_W ELSE INC CURRENT_H END IF CURRENT_W = MIN(CURRENT_W,W_LIMIT) CURRENT_H = MIN(CURRENT_H,H_LIMIT) CALL RESET_MAP END SUB SUB INC_START ADD START,START_INC IF ABS(START) = AMPLITUDE THEN START_INC = START_INC * -1 END IF END SUB SUB VENOM_OFF_CAL CALL DRAW_VENOM_WAVE(AMPLITUDE,START,RASTER) END SUB SUB INIT_VALUES CURRENT_H = 2 CURRENT_W = 2 STAGE = 1 SCORE = 0 MSG1$ = "" MSG2$ = "" VENOM = 0 VOICE_VALUE = 0 CALL LOAD_CARDS_TO_ARRY CALL RESET_MAP END SUB SUB RESET_MAP FOR X = 0 TO W_LIMIT - 1 FOR Y = 0 TO H_LIMIT - 1 MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_NA NEXT Y NEXT X END SUB SUB COUNT_CARD_TYPE(COUNT) COUNT = 0 RESTORE CARDS REPEAT READ D,D1 READ D2,D3$ READ D4$,D5$ IF D <> -1 THEN INC COUNT UNTIL D = -1 END SUB SUB GET_CELL_IMAGE(X,Y,IMG) IMG = CARD_STATS(MAP(X,Y,MAP_CRD_IDX),CRD_IMG_IDX ) END SUB SUB GET_CELL_TYPE(X,Y,TYPE) TYPE = MAP(X,Y,MAP_CRD_IDX) END SUB SUB COMPARE_TYPE(X1,Y1,X2,Y2,SAME_TYPE) CARD1_TYPE = 0 CARD2_TYPE = 0 CALL GET_CELL_TYPE(X1,Y1,CARD1_TYPE) CALL GET_CELL_TYPE(X2,Y2,CARD2_TYPE) SAME_TYPE = CARD1_TYPE = CARD2_TYPE END SUB SUB DISABLE_VIEW_CARDS FOR C = 0 TO 1 MAP(VIEWING_CARDS(C,0),VIEWING_CARDS(C,1),MAP_CRD_STATE) = CRD_STATE_DTH NEXT C END SUB SUB TOUCH_INPUT(LOW_X,LOW_Y,UPPER_X,UPPER_Y,SELECTED) IF TAP THEN MAP_X = TOUCH.X \ 16 MAP_Y = TOUCH.Y \ 16 IF TOUCH.X <= 96 THEN IF MAP_X < LOW_X OR MAP_X > UPPER_X OR MAP_Y < LOW_Y OR MAP_Y > UPPER_Y THEN EXIT SUB CURSOR_X = MAP_X CURSOR_Y = MAP_Y SELECTED = 1 ELSE IF TOUCH.Y >= 5 * 16 AND SKILL_SELECTION = 0 THEN DIM BUTTONS(2,1) FOR B = 0 TO 2 BUTTONS(B,0) = 7 + B BUTTONS(B,1) = 5 NEXT B FOR B = 0 TO 2 S = B + 1 IF BUTTONS(B,0) = MAP_X AND BUTTONS(B,1) = MAP_Y AND VIEWING_CARDS(0,0) = -1 AND SKILLS(S,1) >= SKILL_INFO(SKILLS(S,0),1) THEN SKILL_SELECTION = S SELECTED = 2 END IF NEXT B END IF END IF END SUB SUB USE(CARD_INDEX) NAME$ = CARD_DESCRIPTION$(CARD_INDEX,CRD_NAME_IDX) IF NAME$ = "HEAL" THEN ADD HP,2 ELSE ADD HP,-1 END IF END SUB SUB ENEMY_ATTACK(X,Y) OLD_HP = HP CALL CHECK_BLOCK BLOCKED = ABS (OLD_HP = HP) CALL ANIMATE_ATTACK(X,Y,BLOCKED) END SUB SUB ATTACK(CARD_INDEX,CARD_X,CARD_Y) NAME$ = CARD_DESCRIPTION$(CARD_INDEX,CRD_NAME_IDX) IF HP <= 0 THEN EXIT SUB IF NAME$ = "IMP" THEN '1/2 CHANCE TO ATTACK PLAYER DMG = RND(1) IF DMG THEN CALL DRAW_MESSAGE("IMP ATTACKS") CALL ENEMY_ATTACK(CARD_X,CARD_Y) ELSE CALL ANIMATE_ATTACK(CARD_X,CARD_Y,1) CALL DRAW_MESSAGE("IMP MISSED") END IF ELSE IF NAME$ = "GOBLIN" THEN 'REMOVE 1 HP CALL DRAW_MESSAGE("GOBLIN ATTACKS") CALL ENEMY_ATTACK(CARD_X,CARD_Y) ELSE IF NAME$ = "ORC" THEN CALL BARBARIAN_ATTACK(CARD_X,CARD_Y) ELSE IF NAME$ = "SERPENT" THEN CALL DRAW_MESSAGE("SERPENT ATTACKS") CALL ANIMATE_ATTACK(CARD_X,CARD_Y,0) IF SKILLS(SKILL_SELECTION,0) = 10 THEN CALL DRAW_MESSAGE("RESISTED VENOM") EXIT SUB END IF DOSSAGE = 1 + RND(1) VENOM = MIN(VENOM + DOSSAGE,3) VENOM_WAS_USED = 1 IF DOSSAGE THEN CALL PLAY_SOUND(61,30,6) CALL DRAW_MESSAGE("BITTEN BY SERPENT. POISONED!") END IF ELSE IF NAME$ = "THIEF" THEN 'TAKE ITEMS??? OTHER_X = VIEWING_CARDS(0,0) OTHER_Y = VIEWING_CARDS(0,1) IF CARD_X = VIEWING_CARDS(0,0) AND CARD_Y = VIEWING_CARDS(0,1) THEN OTHER_X = VIEWING_CARDS(1,0) OTHER_Y = VIEWING_CARDS(1,1) END IF OTHER_TYPE = CARD_STATS(MAP(OTHER_X,OTHER_Y,MAP_CRD_IDX),CRD_TYPE_IDX) CALL THIEF_ATTACK(CARD_X,CARD_Y,OTHER_X,OTHER_Y,OTHER_TYPE) ELSE IF NAME$ = "ASSASSIN" THEN 'MOVE TO NEIGHBOURING CARD OR ATTACK OR VENOM CALL ASSASSIN_ATTACK(CARD_X,CARD_Y) ELSE IF NAME$ = "MAGE" THEN 'REARRANGE CARDS CALL MAGE_ATTACK(CARD_X,CARD_Y) ELSE IF NAME$ = "NECROMANCER" THEN CALL NECROMANCER_ATT(CARD_X,CARD_Y) ELSE END IF IF HP < 0 THEN HP = 0 END SUB SUB THIEF_ATTACK(MY_X,MY_Y,OTHER_X,OTHER_Y,OTHER_TYPE) 'X,Y,TYPE DIM ITEM_TILES(W_LIMIT * H_LIMIT,3) INDEX = 0 FOR X = 0 TO W_LIMIT - 1 FOR Y = 0 TO H_LIMIT - 1 IF CARD_STATS(MAP(X,Y,MAP_CRD_IDX),CRD_TYPE_IDX) = 2 THEN IF MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN ITEM_TILES(INDEX,0) = X ITEM_TILES(INDEX,1) = Y ITEM_TILES(INDEX,2) = MAP(X,Y,MAP_CRD_IDX) INC INDEX END IF END IF NEXT Y NEXT X IF INDEX = 0 THEN EXIT SUB END IF DEC INDEX CARD_INDEX = 0 IF OTHER_TYPE = 2 THEN CARD_INDEX = MAP(OTHER_X,OTHER_Y,MAP_CRD_IDX) CALL ANIMATE_CONF_ATT(MY_X,MY_Y,OTHER_X,OTHER_Y) ELSE '1/5 CHANCE TO FIND AN ITEM AND STEAL IT IF RND(4) <> 4 THEN EXIT SUB RAN_INDEX = RND(INDEX) OTHER_X = ITEM_TILES(RAN_INDEX,0) OTHER_Y = ITEM_TILES(RAN_INDEX,1) CARD_INDEX = ITEM_TILES(RAN_INDEX,2) CALL ANIMATE_CONF_ATT(MY_X,MY_Y,OTHER_X,OTHER_Y) CALL FLIP_CARD(OTHER_X,OTHER_Y,1) END IF REPEAT RAN_INDEX = RND(INDEX) X = ITEM_TILES(RAN_INDEX,0) Y = ITEM_TILES(RAN_INDEX,1) CARD_INDEX_2 = ITEM_TILES(RAN_INDEX,2) UNTIL (X <> OTHER_X OR Y <> OTHER_Y) AND (CARD_INDEX = CARD_INDEX_2) CALL DRAW_MESSAGE("THIEF STOLE A "+ CARD_DESCRIPTION$(MAP(X,Y,MAP_CRD_IDX),CRD_NAME_IDX)) CALL FLIP_CARD(X,Y,1) MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_DTH MAP(OTHER_X,OTHER_Y,MAP_CRD_STATE) = CRD_STATE_DTH CALL DRAW_DISABLE_CARD(X,Y) CALL DRAW_DISABLE_CARD(OTHER_X,OTHER_Y) END SUB SUB NECROMANCER_ATT(MY_X,MY_Y) DIM USED(H_LIMIT * W_LIMIT) TOTAL = 8 SUCCESS_CHANCE = 8 IF MAP(MY_X,MY_Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN FOR OFF_X = -1 TO 1 FOR OFF_Y = -1 TO 1 IF HP <= 0 THEN EXIT SUB X = MY_X + OFF_X Y = MY_Y + OFF_Y 'SHOULD BE WITHIN LIMIT IF X >= 0 AND X < W_LIMIT AND Y >= 0 AND Y < H_LIMIT THEN 'CARDS SHOULD BE DEAD IF MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_DTH THEN IF CARD_STATS(MAP(X,Y,MAP_CRD_IDX),CRD_TYPE_IDX) = EMY_CRD_TYPE THEN IF SUCCESS_CHANCE >= RND(TOTAL) THEN CALL PLAY_SOUND(16,40,0) CALL CARD_MAGIC(MY_X,MY_Y) CALL DRAW_MESSAGE("NECROMANCER USES A "+ CARD_DESCRIPTION$(MAP(X,Y,MAP_CRD_IDX),CRD_NAME_IDX)) CALL ATTACK(MAP(X,Y,MAP_CRD_IDX),X,Y) CALL DRAW_DISABLE_CARD(X,Y) WAIT 30 END IF DEC SUCCESS_CHANCE END IF END IF END IF NEXT OFF_Y NEXT OFF_X END IF 'ATT BY SELF IF DID NOT USE CREATURE IF SUCCESS_CHANCE = 8 THEN SUCCESS_CHANCE = 3 IF (SUCCESS_CHANCE >= RND(TOTAL)) OR (MAP(MY_X,MY_Y,MAP_CRD_STATE) = CRD_STATE_DTH) THEN CALL DRAW_MESSAGE("NECROMANCER ATTACKS") CALL ENEMY_ATTACK(MY_X,MY_Y) ELSE WAIT 30 END IF END IF END SUB SUB MAGE_ATTACK(MY_X,MY_Y) 'DECIDE ON HOW MANY CARDS TO MOVE PAIRS_TO_MOVE = 2 'MAKE POTENTIAL LIST SWITCH CARDS DIM POTENTIAL(W_LIMIT * H_LIMIT,2) POTENTIAL_INDEX = 0 FOR X = 0 TO W_LIMIT -1 FOR Y = 0 TO H_LIMIT -1 IF MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN IF X <> VIEWING_CARDS(0,0) OR Y <> VIEWING_CARDS(0,1) THEN IF X <> VIEWING_CARDS(1,0) OR Y <> VIEWING_CARDS(1,1) THEN POTENTIAL(POTENTIAL_INDEX,0) = X POTENTIAL(POTENTIAL_INDEX,1) = Y INC POTENTIAL_INDEX END IF END IF END IF NEXT Y NEXT X IF POTENTIAL_INDEX < (PAIRS_TO_MOVE * 2) THEN EXIT SUB CALL PLAY_SOUND(16,40,0) DEC POTENTIAL_INDEX CALL DRAW_MESSAGE("MAGE ALTERS THE FIELD") CALL CARD_MAGIC(MY_X,MY_Y) DIM ANIM_FRAMES(7) CALL GEN_HIDE_FRAMES(2,ANIM_FRAMES()) CARD_1 = RND(POTENTIAL_INDEX) REPEAT CARD_2 = RND(POTENTIAL_INDEX) UNTIL CARD_2 <> CARD_1 'SWAP THE CARD TYPES SWAP MAP(POTENTIAL(CARD_1,0),POTENTIAL(CARD_1,1),MAP_CRD_IDX),MAP(POTENTIAL(CARD_2,0),POTENTIAL(CARD_2,1),MAP_CRD_IDX) CALL PLAY_FLIP_ANIMATION(POTENTIAL(CARD_1,0),POTENTIAL(CARD_1,1),ANIM_FRAMES(),3) CALL PLAY_FLIP_ANIMATION(POTENTIAL(CARD_2,0),POTENTIAL(CARD_2,1),ANIM_FRAMES(),3) WAIT 15 END SUB SUB ASSASSIN_ATTACK(MY_X,MY_Y) DIM POTENTIAL(W_LIMIT * H_LIMIT,2) POTENTIAL_INDEX = 0 IF MAP(MY_X,MY_Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN FOR OFF_X = -1 TO 1 FOR OFF_Y = -1 TO 1 IF OFF_X OR OFF_Y THEN CRD_X = MY_X + OFF_X CRD_Y = MY_Y + OFF_Y IF CRD_X >= 0 AND CRD_Y >= 0 AND CRD_X < W_LIMIT AND CRD_Y < H_LIMIT THEN IF MAP(CRD_X,CRD_Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN IF CRD_X <> VIEWING_CARDS(0,0) OR CRD_Y <> VIEWING_CARDS(0,1) THEN IF CRD_X <> VIEWING_CARDS(1,0) OR CRD_Y <> VIEWING_CARDS(1,1) THEN POTENTIAL(POTENTIAL_INDEX,0) = CRD_X POTENTIAL(POTENTIAL_INDEX,1) = CRD_Y INC POTENTIAL_INDEX END IF END IF END IF END IF END IF NEXT OFF_Y NEXT OFF_X END IF DEC POTENTIAL_INDEX OPTIONS = POTENTIAL_INDEX 'ATTACK INC OPTIONS 'VENOM IF VENOM < 2 THEN INC OPTIONS END IF OPTION = RND(OPTIONS) IF OPTION <= POTENTIAL_INDEX THEN 'HIDE SWAP MAP(MY_X,MY_Y,MAP_CRD_IDX),MAP(POTENTIAL(OPTION,0),POTENTIAL(OPTION,1),MAP_CRD_IDX) POSITION = 0 IF MY_X > POTENTIAL(OPTION,0) THEN ADD POSITION,1 IF MY_X < POTENTIAL(OPTION,0) THEN ADD POSITION,2 IF MY_Y > POTENTIAL(OPTION,1) THEN ADD POSITION,4 IF MY_Y < POTENTIAL(OPTION,1) THEN ADD POSITION,8 REPEAT P = RND(3) + 1 OFFSET = VAL(MID$(BIN$(POSITION,4),P,1)) UNTIL OFFSET IF P MOD 2 = 0 THEN OFFSET = OFFSET * -1 CALL DRAW_ASSIN_HIDE( OFFSET, P < 3 , MY_X , MY_Y ) ELSE IF OPTION = POTENTIAL_INDEX + 1 THEN 'ATTACK IF SKILLS(SKILL_SELECTION,0) = 2 THEN CALL DRAW_MESSAGE("BLOCKED") ELSE CALL ENEMY_ATTACK(MY_X,MY_Y) END IF ELSE CALL ANIMATE_ATTACK(MY_X,MY_Y,0) IF SKILLS(SKILL_SELECTION,0) = 10 THEN CALL DRAW_MESSAGE("RESISTED VENOM") EXIT SUB END IF CALL PLAY_SOUND(61,30,6) INC VENOM VENOM = MIN(3,VENOM) VENOM_WAS_USED = 1 END IF END SUB SUB BARBARIAN_ATTACK(BX,BY) CALL ENEMY_ATTACK(BX,BY) CALL DRAW_MESSAGE("ORC ATTACKS") IF HP <= 0 THEN EXIT SUB BX2 = -1 BY2 = -1 CALL GET_RANDOM_SIMILAR(0,0,W_LIMIT-1,H_LIMIT-1,BX,BY,CRD_STATE_ACT,BX2,BY2) IF BX2 = -1 THEN EXIT SUB CALL FLIP_CARD(BX2,BY2,1) CALL ENEMY_ATTACK(BX2,BY2) CALL DRAW_MESSAGE("ORC ATTACKS AGAIN") CALL FLIP_CARD(BX2,BY2,0) END SUB SUB GEN_SHOW_FRAMES(CRD_IMG,FRAMES()) CALL GEN_FRAMES(CRD_IMG,1,FRAMES()) END SUB SUB GEN_HIDE_FRAMES(CRD_IMG,FRAMES()) CALL GEN_FRAMES(CRD_IMG,0,FRAMES()) END SUB SUB GEN_FRAMES(CRD_IMG,IS_SHOW,FRAMES()) INDEX = 0 IF IS_SHOW THEN FRAMES(7) = CRD_IMG START = 2 ENDF = 12 STP = 2 ELSE FRAMES(INDEX) = CRD_IMG START = 14 ENDF = 2 STP = -2 INC INDEX END IF FOR F = START TO ENDF STEP STP FRAMES(INDEX) = F INC INDEX NEXT F END SUB SUB VENOM_EFFECT(POS_X,POS_Y,OTHER_X,OTHER_Y,LOW_X,LOW_Y,UPPER_X,UPPER_Y) IF VENOM = 0 THEN EXIT SUB END IF ARR_SIZE = CURRENT_W * CURRENT_H DIM POTENTIAL(ARR_SIZE,2) POTENTIAL_INDEX = 0 FOR X = -1 TO 1 FOR Y = -1 TO 1 CRD_X = POS_X + X CRD_Y = POS_Y + Y IF CRD_X >= 0 AND CRD_Y >= 0 AND CRD_X < W_LIMIT AND CRD_Y< H_LIMIT THEN IF MAP(CRD_X,CRD_Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN IF CRD_X <> OTHER_X OR CRD_Y <> OTHER_Y THEN IF CRD_X >= LOW_X AND CRD_Y >= LOW_Y AND CRD_X <= UPPER_X AND CRD_Y <= UPPER_Y THEN POTENTIAL(POTENTIAL_INDEX,0) = CRD_X POTENTIAL(POTENTIAL_INDEX,1) = CRD_Y INC POTENTIAL_INDEX END IF END IF END IF END IF NEXT Y NEXT X IF POTENTIAL_INDEX THEN DEC POTENTIAL_INDEX I = RND(POTENTIAL_INDEX) POS_X = POTENTIAL(I,0) POS_Y = POTENTIAL(I,1) END IF END SUB SUB SPLIT_TEXT(TXT$,TXT1$,TXT2$) IF LEN(TXT$) < 19 THEN TXT1$ = TXT$ TXT2$ = "" EXIT SUB END IF I = 19 WHILE MID$(TXT$,I,1) <> " " DEC I WEND TXT1$ = LEFT$(TXT$,I - 1) TXT2$ = RIGHT$(TXT$, LEN(TXT$) - I ) END SUB SUB GET_RANDOM_SIMILAR(LOW_X,LOW_Y,UPPER_X,UPPER_Y,TARGET_X,TARGET_Y,STATE,RESULT_X,RESULT_Y) DIM POTENTIAL((UPPER_X - LOW_X) * (UPPER_Y - LOW_Y),1) POTENTIAL_INDEX = 0 FOR X =LOW_X TO UPPER_X FOR Y = LOW_Y TO UPPER_Y IF X <> TARGET_X OR Y <> TARGET_Y THEN IF MAP(X,Y,MAP_CRD_IDX) = MAP(TARGET_X,TARGET_Y,MAP_CRD_IDX) THEN IF MAP(X,Y,MAP_CRD_STATE) = STATE THEN POTENTIAL(POTENTIAL_INDEX,0) = X POTENTIAL(POTENTIAL_INDEX,1) = Y INC POTENTIAL_INDEX END IF END IF END IF NEXT Y NEXT X IF POTENTIAL_INDEX = 0 THEN RESULT_X = -1 EXIT SUB END IF POTENTIAL_INDEX = RND(POTENTIAL_INDEX - 1) RESULT_X = POTENTIAL(POTENTIAL_INDEX,0) RESULT_Y = POTENTIAL(POTENTIAL_INDEX,1) END SUB SUB COUNT_LIVE_CARDS(LOW_X,LOW_Y,UPPER_X,UPPER_Y,CARD_COUNT) CARD_COUNT = 0 FOR X = LOW_X TO UPPER_X FOR Y = LOW_Y TO UPPER_Y IF MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN INC CARD_COUNT NEXT Y NEXT X END SUB SUB INCREASE_MP(VALUE) FOR S_INDEX = 1 TO 3 IF SKILLS(S_INDEX,0) THEN ADD SKILLS(S_INDEX,1),VALUE SKILLS(S_INDEX,1) = MIN(SKILLS(S_INDEX,1), SKILL_INFO(SKILLS(S_INDEX,0),1)) END IF NEXT S_INDEX END SUB 'SKILLS<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< '0 ATTACK, 1 FIREBALL,2 BLOCK,3 CLAIRVOYANCE, 4 TAUNT,5 DETECT LIFE,6 TRUE STRIKE,7 MAGNET,8 SCOUT,9 DEAD SIGHT,10 RESISTANCE,11 CONFUSED, 12 HEAL SUB USE_SKILL_0(LOW_X,LOW_Y,UPPER_X,UPPER_Y) IF SKILL_SELECTED = 0 THEN EXIT SUB SKILL_NUM = SKILLS(SKILL_SELECTION,0) IF SKILL_NUM = 5 THEN CALL DETECT_LIFE(LOW_X,LOW_Y,UPPER_X,UPPER_Y) EXIT SUB END IF IF SKILL_NUM = 10 THEN VENOM = 0 CALL DRAW_MESSAGE("VENOM REMOVED") WAIT 30 EXIT SUB END IF IF SKILL_NUM = 12 THEN CALL HEAL(3) CALL RESET_SKILL_SELECT EXIT SUB END IF IF SKILL_NUM = 20 THEN CALL WILL CALL RESET_SKILL_SELECT EXIT SUB END IF IF SKILL_NUM = 21 THEN CALL DRAW CALL RESET_SKILL_SELECT EXIT SUB END IF IF SKILL_NUM = 23 THEN CALL FIGHT_SKILL CALL RESET_SKILL_SELECT EXIT SUB END IF IF SKILL_NUM = 24 THEN CALL CAMP CALL RESET_SKILL_SELECT EXIT SUB END IF END SUB SUB USE_SKILL_1(LOW_X,LOW_Y,UPPER_X,UPPER_Y,MOVE_ON) IF SKILL_SELECTED = 0 THEN EXIT SUB S = SKILLS(SKILL_SELECTION,0) FIRST_CARD = MAP(CURSOR_X,CURSOR_Y,MAP_CRD_IDX) IF S = 3 THEN CALL CLAIRVOYANCE(LOW_X,LOW_Y,UPPER_X,UPPER_Y,CURSOR_X,CURSOR_Y,FIRST_CARD) ELSE IF S = 6 THEN CALL TRUE_STRIKE(LOW_X,LOW_Y,UPPER_X,UPPER_Y,CURSOR_X,CURSOR_Y) CALL RESET_SKILL_SELECT ELSE IF S = 7 THEN TARGET_X = CURSOR_X TARGET_Y = CURSOR_Y CALL MAGNET(LOW_X,LOW_Y,UPPER_X,UPPER_Y,TARGET_X,TARGET_Y) MOVE_ON = 0 CALL RESET_SKILL_SELECT ELSE IF S = 8 THEN CALL FLIP_CARD(CURSOR_X,CURSOR_Y,1) WAIT 20 CALL FLIP_CARD(CURSOR_X,CURSOR_Y,0) MOVE_ON = 0 CALL RESET_SKILL_SELECT ELSE IF S = 9 THEN CALL DEAD_SIGHT(LOW_X,LOW_Y,UPPER_X,UPPER_Y,CURSOR_X,CURSOR_Y) MOVE_ON = 0 CALL RESET_SKILL_SELECT ELSE IF S = 14 THEN CALL H_RUSH(CURSOR_Y) CALL RESET_SKILL_SELECT MOVE_ON = 0 ELSE IF S = 15 THEN CALL V_RUSH(CURSOR_X) CALL RESET_SKILL_SELECT MOVE_ON = 0 ELSE IF S = 17 THEN CALL ZOMBIE_STRIKE(LOW_X,LOW_Y,UPPER_X,UPPER_Y) CALL RESET_SKILL_SELECT MOVE_ON = 0 ELSE IF S = 22 THEN CALL DRAIN(CURSOR_X,CURSOR_Y,MOVE_ON) CALL RESET_SKILL_SELECT END IF END SUB SUB USE_SKILL_2(LOW_X,LOW_Y,UPPER_X,UPPER_Y,MOVE_ON) IF SKILL_SELECTED = 0 THEN EXIT SUB S = SKILLS(SKILL_SELECTION,0) FIRST_CARD = MAP(VIEWING_CARDS(0,0),VIEWING_CARDS(0,1),MAP_CRD_IDX) SECOND_CARD = MAP(CURSOR_X,CURSOR_Y,MAP_CRD_IDX) IF S = 1 THEN CALL FIREBALL_ATTACK(CURSOR_X,CURSOR_Y,LOW_X,LOW_Y,UPPER_X,UPPER_Y,FIRST_CARD) CALL RESET_SKILL_SELECT ELSE IF S = 3 THEN SPRITE OFF 30 CALL RESET_SKILL_SELECT ELSE IF S = 5 THEN FOR SPR = 63 - 36 TO 63 SPRITE SPR,0,0,0 NEXT SPR SPRITE OFF 63 - 36 TO 63 CALL RESET_SKILL_SELECT ELSE IF S = 11 THEN ATTACKER_X = VIEWING_CARDS(0,0) ATTACKER_Y = VIEWING_CARDS(0,1) ATTACKER2_X = CURSOR_X ATTACKER2_Y = CURSOR_Y CALL CONFUSE(LOW_X,LOW_Y,UPPER_X,UPPER_Y,ATTACKER_X,ATTACKER_Y,ATTACKER2_X,ATTACKER2_Y,MOVE_ON) ELSE IF S = 18 THEN CALL FOCUS ELSE IF S = 19 THEN CALL MIASMA(VIEWING_CARDS(0,0),VIEWING_CARDS(0,1),CURSOR_X,CURSOR_Y,MOVE_ON) CALL RESET_SKILL_SELECT END IF END SUB SUB USE_SKILL_SAME(LOW_X,LOW_Y,UPPER_X,UPPER_Y) IF SKILLS(SKILL_SELECTION,0) = 13 THEN CALL SPOILS(LOW_X,LOW_Y,UPPER_X,UPPER_Y) CALL RESET_SKILL_SELECT EXIT SUB END IF IF SKILLS(SKILL_SELECTION,0) = 16 THEN CALL DOUBLE_TAKEDOWN(LOW_X,LOW_Y,UPPER_X,UPPER_Y) CALL RESET_SKILL_SELECT EXIT SUB END IF END SUB SUB TURN_OFF_SKILL IF SKILL_SELECTED = 0 THEN EXIT SUB S = SKILLS(SKILL_SELECTION,0) IF S = 2 THEN CALL RESET_SKILL_SELECT EXIT SUB END IF IF S = 4 THEN CALL RESET_SKILL_SELECT EXIT SUB END IF IF S = 10 THEN CALL RESET_SKILL_SELECT EXIT SUB END IF IF S = 11 THEN CALL RESET_SKILL_SELECT EXIT SUB END IF IF S = 13 THEN CALL RESET_SKILL_SELECT EXIT SUB END IF IF SKILLS(SKILL_SELECTION,0) = 16 THEN CALL RESET_SKILL_SELECT EXIT SUB END IF END SUB SUB RESET_SKILL_SELECT SKILLS(SKILL_SELECTION,1) = 0 SKILL_TO_USE = 0 SKILL_SELECTION = 0 SKILL_SELECTED = 0 END SUB SUB FIREBALL_ATTACK(X,Y,LOW_X,LOW_Y,UPPER_X,UPPER_Y,TRG_CARD) ' NOT AN ENEMY THEN EXIT IF CARD_STATS(TRG_CARD,CRD_TYPE_IDX) <> EMY_CRD_TYPE THEN EXIT SUB END IF 'DECIDE WETHER UP/DOWN, LEFT/RIGHT DIM DIR(3) DIR(0) = -1 DIR(1) = 1 DIR(2) = -1 DIR(3) = 1 IF X = LOW_X THEN DIR(0) = 1 ELSE IF X = UPPER_X THEN DIR(1) = -1 END IF IF Y = LOW_Y THEN DIR(2) = 1 ELSE IF Y = UPPER_Y THEN DIR(3) = -1 END IF X_DIR = DIR(RND(1)) Y_DIR = DIR(RND(1) + 2) CALL DRAW_MESSAGE("YOU CAST EXPLOSION") CALL PLAY_SOUND(13,40,2) 'DRAW EXPLOSION CALL DRAW_EXPLOSION(16 * X + X_DIR * 4,16 * Y + Y_DIR * 4) FOR OFF_X = 0 TO X_DIR STEP X_DIR FOR OFF_Y = 0 TO Y_DIR STEP Y_DIR IF X + OFF_X <> VIEWING_CARDS(0,0) OR Y + OFF_Y <> VIEWING_CARDS(0,1) THEN IF MAP(X+OFF_X,Y+OFF_Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN IF MAP(X+OFF_X,Y+OFF_Y,MAP_CRD_IDX) = TRG_CARD THEN ADD X,OFF_X ADD Y,OFF_Y END IF END IF END IF NEXT OFF_Y NEXT OFF_X END SUB SUB CHECK_BLOCK IF SKILLS(SKILL_SELECTION,0) = 2 THEN CALL DRAW_MESSAGE("YOU BLOCKED THE ATTACK") ELSE DEC HP END IF END SUB SUB CLAIRVOYANCE(LOW_X,LOW_Y,UPPER_X,UPPER_Y,TARGET_X,TARGET_Y,TRG_CARD) CALL DRAW_MESSAGE("YOU SEEK GUIDANCE") TARGET_X1 = -1 TARGET_Y1 = -1 CALL GET_RANDOM_SIMILAR(LOW_X,LOW_Y,UPPER_X,UPPER_Y,TARGET_X,TARGET_Y,CRD_STATE_ACT,TARGET_X1,TARGET_Y1) X_DIFF = TARGET_X1 - TARGET_X Y_DIFF = TARGET_Y1 - TARGET_Y FLIP_X = 0 FLIP_Y = 0 X = TARGET_X Y = TARGET_Y IF X_DIFF = 0 THEN IMG = 201 FLIP_Y = ABS(Y_DIFF > 0) ELSE IF Y_DIFF = 0 THEN IMG = 200 FLIP_X = ABS(X_DIFF < 0) ELSE IF RND(1) THEN IMG = 201 FLIP_Y = ABS(Y_DIFF > 0) ADD X,X_DIFF ELSE IMG = 200 FLIP_X = ABS(X_DIFF < 0) ADD Y,Y_DIFF END IF END IF SPRITE 30,X * 16,Y * 16 -2,IMG SPRITE 30 FLIP FLIP_X,FLIP_Y END SUB SUB TAUNT(LOW_X,LOW_Y,UPPER_X,UPPER_Y,TARGET_X,TARGET_Y,TRG_CARD,OTHER_X,OTHER_Y) 'CAUSES CARD TO REVEAL BEFORE ATTACK IF CARD_STATS(TRG_CARD,CRD_TYPE_IDX) <> EMY_CRD_TYPE OR CARD_DESCRIPTION$(TRG_CARD,CRD_NAME_IDX) = "ORC" THEN EXIT SUB TAUNT_NUM = 4 DIM TAUNTS$(TAUNT_NUM) TAUNTS$(0) = "MAKE A WAR CRY" TAUNTS$(1) = "SAY UNFLATTERING REMARKS" TAUNTS$(2) = "YAWN" TAUNTS$(3) = "MENTION THEIR BIRTH GIVER" TAUNTS$(4) = "QUESTION THER FIGHTING SKILLS" CALL DRAW_MESSAGE("YOU "+TAUNTS$(RND(TAUNT_NUM))) WAIT 60 MESSAGE_TIMER = 30 CALL GET_RANDOM_SIMILAR(LOW_X,LOW_Y,UPPER_X,UPPER_Y,TARGET_X,TARGET_Y,CRD_STATE_ACT,OTHER_X,OTHER_Y) END SUB SUB DETECT_LIFE(LOW_X,LOW_Y,UPPER_X,UPPER_Y) CALL DRAW_MESSAGE("YOU SEE THE FLOW OF LIFE") SPR = 63 - 36 FOR X = LOW_X TO UPPER_X FOR Y = LOW_Y TO UPPER_Y IF MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_ACT AND CARD_STATS(MAP(X,Y,MAP_CRD_IDX),CRD_TYPE_IDX) = EMY_CRD_TYPE THEN IF X <> VIEWING_CARDS(0,0) OR Y <> VIEWING_CARDS(0,1) THEN IF X <> VIEWING_CARDS(1,0) OR Y <> VIEWING_CARDS(1,1) THEN CALL DRAW_SWIRL(SPR,X * 16,Y * 16) INC SPR END IF END IF END IF NEXT Y NEXT X 'SPRITE OFF SPR TO 63 END SUB SUB HEAL(HEAL_VALUE) ADD HP,HEAL_VALUE HP = MIN(HP,MAX_HP) CALL DRAW_MESSAGE("HP RESTORED") CALL DRAW_POTION_HEAL END SUB SUB TRUE_STRIKE(LOW_X,LOW_Y,UPPER_X,UPPER_Y,TARGET_X,TARGET_Y) CALL DRAW_MESSAGE("YOUR BLADE FINDS ITS MARK") IF CARD_STATS(MAP(TARGET_X,TARGET_Y,MAP_CRD_IDX),CRD_TYPE_IDX) <> EMY_CRD_TYPE THEN EXIT SUB CALL FLIP_CARD(CURSOR_X,CURSOR_Y,1) X = -1 Y = -1 CALL GET_RANDOM_SIMILAR(LOW_X,LOW_Y,UPPER_X,UPPER_Y,TARGET_X,TARGET_Y,CRD_STATE_ACT,X,Y) IF X = -1 THEN EXIT SUB CALL FLIP_CARD(X,Y,1) CALL DRAW_ATTACK(TARGET_X * 16 ,TARGET_Y * 16,X * 16,Y * 16) CALL DRAW_DISABLE_CARD(TARGET_X,TARGET_Y) MAP(TARGET_X,TARGET_Y,MAP_CRD_STATE) = CRD_STATE_DTH CALL DRAW_DISABLE_CARD(X,Y) MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_DTH END SUB SUB MAGNET(LOW_X,LOW_Y,UPPER_X,UPPER_Y,TARGET_X,TARGET_Y) X = -1 Y = -1 CALL GET_RANDOM_SIMILAR(LOW_X,LOW_Y,UPPER_X,UPPER_Y,TARGET_X,TARGET_Y,CRD_STATE_ACT,X,Y) IF X = -1 THEN EXIT SUB REPEAT OFF_X = RND(2) -1 OFF_Y = RND(2) -1 UNTIL ABS(OFF_X) XOR ABS(OFF_Y) IF MAP(TARGET_X + OFF_X,TARGET_Y + OFF_Y,MAP_CRD_STATE) = CRD_STATE_NA THEN OFF_X = OFF_X * -1 OFF_Y = OFF_Y * -1 END IF PLACE_X = TARGET_X + OFF_X PLACE_Y = TARGET_Y + OFF_Y SWAP MAP(X,Y,MAP_CRD_IDX),MAP(PLACE_X,PLACE_Y,MAP_CRD_IDX) SWAP MAP(X,Y,MAP_CRD_STATE),MAP(PLACE_X,PLACE_Y,MAP_CRD_STATE) DIM ANIM_FRAMES(7) DIM ANIM_FRAMES_1(7) CALL GEN_HIDE_FRAMES(CARD_STATS(MAP(PLACE_X,PLACE_Y,MAP_CRD_IDX),CRD_IMG_IDX),ANIM_FRAMES()) CALL PLAY_SOUND(14,60,3) IF MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_DTH THEN CALL GEN_SHOW_FRAMES(CARD_STATS(MAP(X,Y,MAP_CRD_IDX),CRD_IMG_IDX),ANIM_FRAMES_1()) CALL PLAY_FLIP_ANIMATION(X,Y,ANIM_FRAMES_1(),3) TINT X,Y PAL 1 ELSE CALL GEN_HIDE_FRAMES(CARD_STATS(MAP(X,Y,MAP_CRD_IDX),CRD_IMG_IDX),ANIM_FRAMES_1()) CALL PLAY_FLIP_ANIMATION(X,Y,ANIM_FRAMES_1(),3) END IF CALL PLAY_SOUND(14,60,3) PLACE_X_2 = PLACE_X + (OFF_X * -2) PLACE_Y_2 = PLACE_Y + (OFF_Y * -2) FRAME = 0 REPEAT CELL PLACE_X,PLACE_Y,ANIM_FRAMES(FRAME) IF MAP(PLACE_X_2,PLACE_Y_2,MAP_CRD_STATE) <> CRD_STATE_NA THEN IF MAP(PLACE_X_2,PLACE_Y_2,MAP_CRD_STATE) = CRD_STATE_DTH THEN CELL PLACE_X_2,PLACE_Y_2,CARD_STATS(MAP(PLACE_X_2,PLACE_Y_2,MAP_CRD_IDX),CRD_IMG_IDX) ELSE CELL PLACE_X_2,PLACE_Y_2,ANIM_FRAMES(FRAME) END IF END IF INC FRAME WAIT 3 UNTIL FRAME > 7 END SUB SUB DEAD_SIGHT(LOW_X,LOW_Y,UPPER_X,UPPER_Y,TARGET_X,TARGET_Y) IF CARD_STATS(MAP(TARGET_X,TARGET_Y,MAP_CRD_IDX),CRD_TYPE_IDX) <> EMY_CRD_TYPE THEN EXIT SUB IF MAP(TARGET_X,TARGET_Y,MAP_CRD_STATE) <> CRD_STATE_DTH THEN EXIT SUB CALL DRAW_MESSAGE("YOU GLANCE THROUGH A FALLEN'S EYES") DIM NEIGHBOURS(7,1) INDEX = 0 FOR X = TARGET_X - 1 TO TARGET_X + 1 FOR Y = TARGET_Y - 1 TO TARGET_Y + 1 IF X >= LOW_X AND X <= UPPER_X AND Y >= LOW_Y AND Y <= UPPER_Y THEN IF X <> TARGET_X OR Y <> TARGET_Y THEN IF MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN 'SHOW AND ADD TO LIST CALL FLIP_CARD(X,Y,1) NEIGHBOURS(INDEX,0) = X NEIGHBOURS(INDEX,1) = Y INC INDEX END IF END IF END IF NEXT Y NEXT X WAIT 10 FOR I = 0 TO INDEX -1 CALL FLIP_CARD( NEIGHBOURS(I,0),NEIGHBOURS(I,1),0 ) NEXT I 'HIDE FROM LIST END SUB SUB CONFUSE(LOW_X,LOW_Y,UPPER_X,UPPER_Y,ATTACKER_X,ATTACKER_Y,ATTACKER2_X,ATTACKER2_Y,MOVE_ON) 'SOILDER,KNIGHT,BARBARIAN,NECROMANCER,ASSASSIN 'NOT SERPENT,THIEF IF MAP(ATTACKER_X,ATTACKER_Y,MAP_CRD_IDX) = MAP(ATTACKER2_X,ATTACKER2_Y,MAP_CRD_IDX) THEN EXIT SUB E1_TYPE = CARD_STATS(MAP(ATTACKER_X,ATTACKER_Y,MAP_CRD_IDX),CRD_TYPE_IDX) E2_TYPE = CARD_STATS(MAP(ATTACKER2_X,ATTACKER2_Y,MAP_CRD_IDX),CRD_TYPE_IDX) E1_NAME$ = CARD_DESCRIPTION$(MAP(ATTACKER_X,ATTACKER_Y,MAP_CRD_IDX),CRD_NAME_IDX) E2_NAME$ = CARD_DESCRIPTION$(MAP(ATTACKER2_X,ATTACKER2_Y,MAP_CRD_IDX),CRD_NAME_IDX) CANNOT_ATTACK$ = " SERPENT THIEF MAGE" X = -1 Y = -1 TARGET_X = -1 TARGET_Y = -1 ATT_X = 0 ATT_Y = 0 IF E1_TYPE = EMY_CRD_TYPE AND INSTR(CANNOT_ATTACK$,E1_NAME$) = 0 THEN IF E2_TYPE <> EMY_CRD_TYPE THEN EXIT SUB TARGET_X = ATTACKER2_X TARGET_Y = ATTACKER2_Y 'STOP THE ATTACKER FOR THAT TURN ATT_X = ATTACKER_X ATT_Y = ATTACKER_Y ATTACKER_X = -1 MOVE_ON = 0 CALL RESET_SKILL_SELECT ELSE IF E2_TYPE = EMY_CRD_TYPE AND INSTR(CANNOT_ATTACK$,E2_NAME$) = 0 THEN IF E1_TYPE <> EMY_CRD_TYPE THEN EXIT SUB TARGET_X = ATTACKER_X TARGET_Y = ATTACKER_Y 'STOP THE ATTACKER FOR THAT TURN ATT_X = ATTACKER2_X ATT_Y = ATTACKER2_Y ATTACKER2_X = -1 MOVE_ON = 0 CALL RESET_SKILL_SELECT ELSE 'NONE ARE ENEMIES THAT CAN ATTACK EXIT SUB END IF CALL GET_RANDOM_SIMILAR(LOW_X,LOW_Y,UPPER_X,UPPER_Y,TARGET_X,TARGET_Y,CRD_STATE_ACT,X,Y) IF X = -1 THEN EXIT SUB CALL DRAW_MESSAGE("THEY CANNOT DISCERN FRIEND OR FOE") CALL FLIP_CARD(TARGET_X,TARGET_Y,1) CALL ANIMATE_CONF_ATT(ATT_X,ATT_Y,TARGET_X,TARGET_Y) CALL FLIP_CARD(X,Y,1) MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_DTH CALL DRAW_DISABLE_CARD(X,Y) MAP(TARGET_X,TARGET_Y,MAP_CRD_STATE) = CRD_STATE_DTH CALL DRAW_DISABLE_CARD(TARGET_X,TARGET_Y) CALL FLIP_CARD(ATT_X,ATT_Y,0) END SUB SUB SPOILS(LOW_X,LOW_Y,UPPER_X,UPPER_Y) X = -1 Y = -1 POTION_INDEX = RND(1) + (CARD_TYPE_COUNT - 2) 'GET LIST OF EMPTY ROOMS DIM ROOMS(18,2) R_INDEX = 0 FOR X = LOW_X TO UPPER_X FOR Y = LOW_Y TO UPPER_Y IF MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_ACT THEN IF MAP(X,Y,MAP_CRD_IDX) = 0 THEN ROOMS(R_INDEX,0) = X ROOMS(R_INDEX,1) = Y ROOMS(R_INDEX,2) = 1 INC R_INDEX END IF END IF NEXT Y NEXT X 'PICK A ROOM IF R_INDEX = 0 THEN EXIT SUB DEC R_INDEX FOR X = 0 TO 1 PLACED = 0 REPEAT I = RND(R_INDEX) IF ROOMS(I,2) = 1 THEN MAP(ROOMS(I,0),ROOMS(I,1),MAP_CRD_IDX) = POTION_INDEX ROOMS(I,2) = 0 PLACED = 1 END IF UNTIL PLACED NEXT X CALL DRAW_MESSAGE("A "+CARD_DESCRIPTION$(POTION_INDEX,CRD_NAME_IDX) + " POTION WAS DROPPED") END SUB SUB H_RUSH(Y) CALL RUSH(1,Y) END SUB SUB V_RUSH(X) CALL RUSH(0,X) END SUB SUB RUSH(IS_ROW,XY) OFF_X = 0 OFF_Y = 0 X = -1 Y = -1 IMG = 198 IF IS_ROW THEN OFF_X = -1 X = W_LIMIT - 1 Y = XY ELSE OFF_Y = 1 X = XY Y = 0 END IF WHILE X >= 0 AND Y < H_LIMIT STATE = MAP(X,Y,MAP_CRD_STATE) IF STATE = CRD_STATE_ACT OR STATE = CRD_STATE_DTH THEN SPRITE 63-36,X * 16,Y * 16,IMG SPRITE 63-36 FLIP 0,0 WAIT 5 FOUND = 0 X2 = X + OFF_X Y2 = Y + OFF_Y WHILE NOT(FOUND) AND X2 >= 0 AND Y2 < H_LIMIT AND MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_ACT TYPE1 = MAP(X,Y,MAP_CRD_IDX) TYPE2 = MAP(X2,Y2,MAP_CRD_IDX) IF CARD_STATS(TYPE1,CRD_TYPE_IDX) = EMY_CRD_TYPE THEN IF TYPE1 = TYPE2 THEN CALL DISABLE_2CRDS(X,Y,X2,Y2) FOUND = 1 END IF END IF ADD X2,OFF_X ADD Y2, OFF_Y WEND END IF ADD X,OFF_X ADD Y,OFF_Y WEND SPRITE OFF 63-36 END SUB SUB DOUBLE_TAKEDOWN(LOW_X,LOW_Y,UPPER_X,UPPER_Y) MAP(VIEWING_CARDS(0,0),VIEWING_CARDS(0,1),MAP_CRD_STATE) = CRD_STATE_DTH MAP(VIEWING_CARDS(1,0),VIEWING_CARDS(1,1),MAP_CRD_STATE) = CRD_STATE_DTH CALL TWO_BIRDS(LOW_X,LOW_Y,UPPER_X,UPPER_Y,VIEWING_CARDS(0,0),VIEWING_CARDS(0,1)) END SUB SUB ZOMBIE_STRIKE(LOW_X,LOW_Y,UPPER_X,UPPER_Y) IF MAP(CURSOR_X,CURSOR_Y,MAP_CRD_STATE) <> CRD_STATE_DTH THEN EXIT SUB CHANCE = 3 REPEAT CALL TWO_BIRDS(LOW_X,LOW_Y,UPPER_X,UPPER_Y,CURSOR_X,CURSOR_Y) CHANCE = MAX(CHANCE - 1,1 ) UNTIL RND(3) > CHANCE END SUB SUB TWO_BIRDS(LOW_X,LOW_Y,UPPER_X,UPPER_Y,X,Y) X1 = -1 X2 = -1 Y1 = -1 Y2 = -1 'CONVERT THE STATE TO DEATH TO AVOID RESELECTING THIS CARD 'TMP_STATE = MAP(X,Y,MAP_CRD_STATE) 'MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_DTH CALL GET_RANDOM_SIMILAR(LOW_X,LOW_Y,UPPER_X,UPPER_Y,X,Y,CRD_STATE_ACT,X1,Y1) IF X1 = -1 THEN EXIT SUB CALL GET_RANDOM_SIMILAR(LOW_X,LOW_Y,UPPER_X,UPPER_Y,X1,Y1,CRD_STATE_ACT,X2,Y2) IF X2 = -1 THEN EXIT SUB CALL DISABLE_2CRDS(X1,Y1,X2,Y2) 'MAP(X,Y,MAP_CRD_STATE) = TMP_STATE END SUB SUB FOCUS COMPLETE = 1 CALL INCREASE_MP(1) CALL UPDATE_SKILL_DRAWING FOR S = 1 TO 3 MAX_V = SKILL_INFO(SKILLS(S,0),1) CUR_V = SKILLS(S,1) IF CUR_V < MAX_V THEN COMPLETE = 0 END IF NEXT S IF COMPLETE THEN CALL RESET_SKILL_SELECT END IF END SUB SUB MIASMA(X1,Y1,X2,Y2,MOVE_ON) CALL FLIP_CARD(X2,Y2,1) CRD_IDX1 = MAP(X1,Y1,CRD_TYPE_IDX) CRD_IDX2 = MAP(X2,Y2,CRD_TYPE_IDX) IS_ENEMY_1 = CARD_STATS(CRD_IDX1,CRD_TYPE_IDX) = EMY_CRD_TYPE IS_ENEMY_2 = CARD_STATS(CRD_IDX2,CRD_TYPE_IDX) = EMY_CRD_TYPE FOR ROW = 0 TO ((H_LIMIT -1) * 2) X = 0 Y = ROW SPR = 63 USED = 0 KILLED = 0 REPEAT IF X < W_LIMIT AND Y < H_LIMIT THEN IF MAP(X,Y,MAP_CRD_STATE) <> CRD_STATE_NA THEN SPRITE SPR,X * 16,Y * 16,205 DEC SPR USED = 1 END IF CUR_IDX = MAP(X,Y,MAP_CRD_IDX) IF (CUR_IDX = CRD_IDX1 OR CUR_IDX = CRD_IDX2) AND CARD_STATS(CUR_IDX,CRD_TYPE_IDX) = EMY_CRD_TYPE THEN CELL X,Y,CARD_STATS(MAP(X,Y,MAP_CRD_IDX),CRD_IMG_IDX) CALL DRAW_DISABLE_CARD(X,Y) MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_DTH IF USED THEN INC KILLED END IF END IF INC X DEC Y UNTIL Y = -1 IF KILLED THEN CALL PLAY_SOUND(60,20,1) IF USED THEN WAIT 30 SPRITE OFF SPR TO 63 NEXT ROW IF MAP(X1,Y1,MAP_CRD_STATE) = CRD_STATE_ACT THEN CALL FLIP_CARD(X1,Y1,0) IF MAP(X2,Y2,MAP_CRD_STATE) = CRD_STATE_ACT THEN CALL FLIP_CARD(X2,Y2,0) MOVE_ON = 0 END SUB SUB DISABLE_2CRDS(X1,Y1,X2,Y2) 'FLIP CALL FLIP_CARD(X1,Y1,1) CALL FLIP_CARD(X2,Y2,1) 'DRAW_ATTACK CALL DRAW_ATTACK(X1 * 16,Y1 * 16,X2 * 16,Y2 * 16) 'DRAW_DISABLE_CARD MAP(X1,Y1,MAP_CRD_STATE) = CRD_STATE_DTH MAP(X2,Y2,MAP_CRD_STATE) = CRD_STATE_DTH CALL DRAW_DISABLE_CARD(X1,Y1) CALL DRAW_DISABLE_CARD(X2,Y2) END SUB SUB WILL 'CONVERT MP INTO HP FOR S = 1 TO 3 IF S <> SKILL_SELECTION THEN HP = MIN(MAX_HP,HP + SKILLS(S,1)) END IF SKILLS(S,0) = 0 SKILLS(S,1) = 1 SPRITE OFF 19 + S NEXT S CALL DRAW_POTION_HEAL END SUB SUB DRAW 'GET 3 RANDOM SKILLS DIM ANIM_FRAMES(7) REPEAT FULL = 1 + RND(2) UNTIL FULL <> SKILL_SELECTION FOR S = 1 TO 3 PLACED = 0 REPEAT S_INDEX = 1 + RND(SKILL_COUNT -1) IF SKILL_INFO(S_INDEX,3) = CLASS THEN SKILLS(S,0) = S_INDEX IF S = FULL THEN SKILLS(S,1) = SKILL_INFO(S_INDEX,1) ELSE SKILLS(S,1) = SKILL_INFO(S_INDEX,1) \ 2 END IF BG 0 CALL GEN_SHOW_FRAMES(SKILL_INFO(S_INDEX,0),ANIM_FRAMES()) 'CALL PLAY_SOUND(14,60,3) CALL PLAY_FLIP_ANIMATION(6 + S, 5,ANIM_FRAMES(),3) PLACED = 1 END IF UNTIL PLACED NEXT S END SUB SUB FIGHT_SKILL REPEAT S_INDEX = 1 + RND(SKILL_COUNT - 1) IF SKILL_INFO(S_INDEX,3) = 0 AND SKILL_DESCRIPTION$(S_INDEX,0) <> "" THEN DIM ANIM_FRAMES(7) SKILLS(SKILL_SELECTION,0) = S_INDEX SKILLS(SKILL_SELECTION,1) = 0 CALL GEN_SHOW_FRAMES(SKILL_INFO(S_INDEX,0),ANIM_FRAMES()) CALL PLAY_FLIP_ANIMATION(6 + SKILL_SELECTION, 5,ANIM_FRAMES(),3) CALL UPDATE_SKILL_DRAWING EXIT SUB END IF UNTIL 1=2 END SUB SUB DRAIN(X,Y,MOVE_ON) 'STEAL MP MOVE_ON = 0 FOR OFF_X = -1 TO 1 FOR OFF_Y = -1 TO 1 CX = X + OFF_X CY = Y + OFF_Y IF CX >= 0 AND CX < W_LIMIT THEN IF CY >= 0 AND CY < H_LIMIT THEN IF MAP(CX,CY,MAP_CRD_STATE) = CRD_STATE_ACT AND CARD_STATS(MAP(CX,CY,MAP_CRD_IDX),CRD_TYPE_IDX) = EMY_CRD_TYPE THEN CALL INCREASE_MP(1) CALL UPDATE_SKILL_DRAWING CALL DRAW_POTION_HEAL END IF END IF END IF NEXT OFF_Y NEXT OFF_X MOVE_ON = 0 END SUB SUB CAMP 'HEAL BASED ON # OF EMPTY ROOMS ROOMS = 0 FOR X = 0 TO W_LIMIT - 1 FOR Y = 0 TO H_LIMIT -1 IF MAP(X,Y,MAP_CRD_IDX) = 0 AND MAP(X,Y,MAP_CRD_STATE) = CRD_STATE_DTH THEN INC ROOMS NEXT Y NEXT X IF ROOMS THEN HP = MIN(MAX_HP,HP + ROOMS) CALL DRAW_POTION_HEAL END IF END SUB 'AUDIO{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} SUB PLAY_SOUND(PITCH,LENGTH,S) INC VOICE_VALUE IF VOICE_VALUE = 4 THEN VOICE_VALUE = 0 PLAY VOICE_VALUE,PITCH,LENGTH SOUND S END SUB 'LOAD FUNCTIONS%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SUB LOAD_CARDS_TO_ARRY RESTORE CARDS I = 0 DESCRIPTION$ = "" REPEAT READ TYPE,ENTRY_STAGE IF TYPE <> -1 THEN READ IMAGE,NAME$ READ F_DESC$,M_DESC$ IF CLASS THEN DESCRIPTION$ = M_DESC$ ELSE DESCRIPTION$ = F_DESC$ CALL LOAD_CARD(I,TYPE,ENTRY_STAGE,IMAGE,NAME$,DESCRIPTION$) INC I END IF UNTIL TYPE = -1 END SUB SUB LOAD_CARD(INDEX,TYPE,FROM_STAGE,IMG,NAME$,DESCRIPTION$) CARD_STATS(INDEX,CRD_TYPE_IDX) = TYPE CARD_STATS(INDEX,CRD_IMG_IDX) = IMG CARD_STATS(INDEX,CRD_STAGE_IDX) = FROM_STAGE CARD_DESCRIPTION$(INDEX,CRD_NAME_IDX) = NAME$ CARD_DESCRIPTION$(INDEX,CRD_INFO_IDX) = DESCRIPTION$ END SUB SUB LOAD_SKILL_INFO(COUNT) RESTORE SKILLS SKILL_NUM = 0 WHILE SKILL_NUM < COUNT READ SKILL_CLASS,MAX_V READ COST,IMG READ N$,D$ SKILL_INFO(SKILL_NUM,0) = IMG SKILL_INFO(SKILL_NUM,1) = MAX_V SKILL_INFO(SKILL_NUM,2) = COST SKILL_INFO(SKILL_NUM,3) = SKILL_CLASS SKILL_DESCRIPTION$(SKILL_NUM,0) = N$ SKILL_DESCRIPTION$(SKILL_NUM,1) = D$ INC SKILL_NUM WEND END SUB SUB COUNT_SKILLS(COUNT) RESTORE SKILLS COUNT = 0 READ SKILL_CLASS,MAX_V RESTORE SKILLS WHILE SKILL_CLASS <> -1 READ SKILL_CLASS,MAX_V READ COST,IMG READ N$,D$ INC COUNT WEND END SUB 'DATA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ CARDS: 'TYPE,STAGE,IMG,NAME,FIGHTER DESCRIPTION,MAGE DESCRIPTION DATA 0,0,14,"ROOM","A CHANCE FOR REST.","A SPACE DEVOID OF ANYTHING." DATA 1,2,32,"IMP","WHIFFS HALF THE TIME.","ONLY DANGEROUS HALF THE TIME." DATA 1,3,38,"GOBLIN","DOES CONSISTENT DAMAGE.","DANGEROUS ALL THE TIME." DATA 1,4,64,"ORC","DOES A FOLLOW UP ATTACK.","MINACIOUS FIGHTER WHO DOES EXTRA DAMAGE." DATA 1,5,70,"SERPENT","VENOM IS NOT DEADLY. ","DIZZYING VENOM. CAUSES ATTACKS TO MISS." DATA 1,6,102,"ASSASSIN","USES TRICKERY TO FIGHT.","COMPOSED. USES VARIOUS TACTICS TO ATTACK." DATA 1,0,128,"THIEF","HARMLESS CRIMINAL.","BANE OF SOCIETY. TAKES ITEMS FROM AREA." DATA 1,3,96,"MAGE","SPELL CASTER WHO DISORIENTS.","INCANTATIONS CAN MANULIPULATE THE AREA." DATA 1,6,134,"NECROMANCER","CASTS ILLEGAL SPELLS.","INCANTATIONS CAN MANULIPULATE THE DEAD." DATA 2,0,166,"HEAL POTION","ENERGY TO CONTINUE FIGHTING","HEALS WOUNDS." DATA 2,0,160,"RESTORE POTION","ENERGY FOR FANCY ATTACKS.","GRANTS MAGICAL STRENGTH." DATA -1,0,0,"END","","" SKILLS: '1 FIREBALL,2 BLOCK,3 CLAIRVOYANCE, 4 TAUNT,5 DETECT LIFE,6 TRUE STRIKE,7 MAGNET,8 SCOUT,9 DEAD SIGHT,10 RESISTANCE,11 CONFUSED,12 HEAL '13 SPOILS, 14 H_RUSH , 15 V_RUSH,16 DOUBLE_TAKEDOWN,17 ZOMBIE_STRIKE, 18 FOCUS,19 MIASMA,20 SK TO STR,21 DRAW 'CLASS,MAX_VALUE,COST,IMG,NAME,DESCRIPTION DATA 10,1,0,198,"SWING","REGULAR ATTACK" DATA 0,2,1,106,"GRENADE","ATTACKS RANDOM AREA AROUND TARGET" DATA 0,2,1,34,"BLOCK","STOPS PHYSICAL ATTACKS" DATA 1,3,1,132,"CLAIRVOYANCE","POINTS OUT THE RIGHT DIRECTION" DATA 0,3,1,098,"TAUNT","CAUSES ENEMY TO REVEAL THEMSELF BEFORE ATTACKING." DATA 1,4,1,44,"LIFESTREAM","SEES ALL LIVING THINGS ON THE FLOOR" DATA 0,4,1,036,"TRUE STRIKE","ATTACKS THE REVEALED ENEMY" DATA 1,3,1,136,"CONNECT","PLACES TARGET NEXT TO ENEMY" DATA 1,5,1,040,"SCOUT","LOOKS FOR ENEMY WHILE STAYING HIDDEN" DATA 1,6,1,130,"DEAD SIGHT","USE DEAD TO SEE NEIGHBOURING AREA" DATA 0,1,1,042,"RESISTANCE","CANNOT GET POISONED" DATA 1,3,1,138,"CONFUSE","CAUSES CONFLICT IN THE ENEMY RANKS" DATA 1,4,1,100,"HEAL","HEALS WOUNDS" DATA 0,2,1,074,"SPOILS","ENEMY DROPS A POTION INTO A ROOM" DATA 0,3,1,066,"H RUSH","ATTACKS A ROW" DATA 0,3,1,068,"V RUSH","ATTACKS A COLUMN" DATA 0,3,1,072,"DOUBLE TAKEDOWN","KILLS ANOTHER ENEMY OF SAME TYPE" DATA 1,4,1,162,"ZOMBIE STRIKE","MAKES DEAD ATTACK SAME TYPE" DATA 1,1,1,104,"FOUCS","FOCUS ON CHARGING MP" DATA 1,4,1,164,"MIASMA","FILLS AREA WITH LIFE ENDING AIR" DATA 0,1,1,046,"SKILL TO STRENGTH","GIVES UP SKILLS FOR HP" DATA 1,1,1,142,"DRAW","RANDOMLY REPLACE ALL SKILL SLOTS" DATA 1,2,1,140,"DRAIN","STEALS SKILL POINTS FROM NEAR BY ENEMIES" DATA 1,2,1,172,"FIGHT SKILL","LEARN A FIGHTER'S SKILL" DATA 0,3,1,174,"CAMP","HEAL BASED ON NUMBER OF FOUND ROOMS" DATA -1,0,0,0,"END","END" CLASS_INFO: ' DATA 3,"TESTING TESTING TEST" DATA 0,"FIGHTER" DATA 0,"SKILLS LEAN MORE TO " DATA 0,"KILLING THEIR" DATA 0,"ENEMIES." DATA 1,"STUDENT MAGE" DATA 1,"SKILLS LEAN MORE TO " DATA 1,"FINDING ENEMIES " DATA 1,"AND MANIPULATION. " DATA -1,"" #1:MAIN PALETTES 003F2F0000153400003F0000003F3F00 003F3F3F00002A3F003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 00000000000000000000000000000000 001F3F3F3F3F3F3F00000A150A150A15 00FCFCFCFCFCFCFC0000A850A850A850 000F1F1F1F1F1F1F00000A050A050A05 00F8F8F8F8F8F8F80000A050A050A050 00030707070707070000020102010201 00E0E0E0E0E0E0E00000A040A040A040 00010101010101010000000000000000 00000000000000000000000000000000 001F1F1F1F1F1F1F00000F0F0F0E0F0E 00F0F8F8F8F8F8F80000F0F070F070F0 001F1F1F1F1F1F1F00000F0E0F0E0D0E 00F0F8F8F8F8F8F80000F0F070B070B0 003F3F3F3F3F3F3F00001F171B1C1D1D 00F8FCFCFCFCFCFC0000F8F8F808F898 00000000000000000000000000000000 00000000000000000000000000000000 3F3F3F3F3F3F3F000A150A150A150000 FCFCFCFCFCFCFC00A850A850A8500000 1F1F1F1F1F1F1F000A050A050A050000 F8F8F8F8F8F8F800A050A050A0500000 07070707070707000201020102010000 E0E0E0E0E0E0E000A040A040A0402000 01010101010101000000000000000000 00000000000000000000000000000000 1F1F1F1F1F1F1F000F0E0F0E0F0F0000 F8F8F8F8F8F8F80070F070F070F00000 1F1F1F1F1F1F1F000D0E0D0E0F0F0000 F8F8F8F8F8F8F80070B070F070F00000 3F3F3F3F3F3F3F001D1D1C1B171F0000 FCFCFCFCFCFCFC00989808F8F8F80000 003F3F3F3F3F3F3F00001F1A16171619 00F8FCFCFCFCFCFC0000F87878F83858 003F3F3F3F3F3F3F00001F1017161717 00F8FCFCFCFCFCFC0000F808E828A8A8 003F3F3F3F3F3F3F00001F1F1E1A161E 00F8FCFCFCFCFCFC0000F87858687858 003F3F3F3F3F3F3F00001F1F1F1F1F1F 00F8FCFCFCFCFCFC0000F838981878C8 003F3F3F3F3F3F3F00001F1E1D1D1D1E 00F8FCFCFCFCFCFC0000F83898D8D838 003F3F3F3F3F3F3F00001F13171C1819 00F8FCFCFCFCFCFC0000F8D888D8F898 003F3F3F3F3F3F3F00001F1A1A1A1B1C 00F8FCFCFCFCFCFC0000F818D858D838 003F3F3F3F3F3F3F00001F1D18181C1A 00F8FCFCFCFCFCFC0000F878B83878D8 3F3F3F3F3F3F3F001B1A1A1A1C1F0000 FCFCFCFCFCFCFC0068A8B8B898F80000 3F3F3F3F3F3F3F0017171B1C1F1F0000 FCFCFCFCFCFCFC00E8E8D838F8F80000 3F3F3F3F3F3F3F001A161C1F1F1F0000 FCFCFCFCFCFCFC006878185838F80000 3F3F3F3F3F3F3F001E1D1B171E1F0000 FCFCFCFCFCFCFC00C838585848F80000 3F3F3F3F3F3F3F001F1F1F1F1F1F0000 FCFCFCFCFCFCFC00F87878F8F8F80000 3F3F3F3F3F3F3F001B19181F1F1F0000 FCFCFCFCFCFCFC00181838E8C8F80000 3F3F3F3F3F3F3F001F1F1F1F1F1F0000 FCFCFCFCFCFCFC00D888D8A8A8F80000 3F3F3F3F3F3F3F00171F1212121F0000 FCFCFCFCFCFCFC0068F8484848F80000 003F3F3F3F3F3F3F00001F1A1A1B111B 00F8FCFCFCFCFCFC0000F858585888D8 003F3F3F3F3F3F3F00001F1913131E19 00F8FCFCFCFCFCFC0000F8F8F8780878 003F3F3F3F3F3F3F00001F1F1F1F1E1D 00F8FCFCFCFCFCFC0000F8D83838F838 003F3F3F3F3F3F3F00001F1E1D1A1817 00F8FCFCFCFCFCFC0000F8387878F878 003F3F3F3F3F3F3F00001F13151B1E15 00F8FCFCFCFCFCFC0000F8C8A858B878 003F3F3F3F3F3F3F00001F1F1F1F1E1C 00F8FCFCFCFCFCFC0000F8F8B8983898 0307070747E7FFFF0103000602442F92 E0F0F0F0F0F0F0F0C0E030F0A060D060 0F1F1F1F1F1F1F1F0B12131212131312 F0F8F8FEFFFFFFFF1008E88E9122EFC0 3F3F3F3F3F3F3F001C1E1D1D191F0000 FCFCFCFCFCFCFC0078B8B8D898F80000 3F3F3F3F3F3F3F00191C1C1B131F0000 FCFCFCFCFCFCFC00F8F87898F8F80000 3F3F3F3F3F3F3F00181D1D1D1D1F0000 FCFCFCFCFCFCFC003838B85858F80000 3F3F3F3F3F3F3F001C181112181F0000 FCFCFCFCFCFCFC0058E8881838F80000 3F3F3F3F3F3F3F001A19161F1F1F0000 FCFCFCFCFCFCFC00A8D89868F8F80000 3F3F3F3F3F3F3F00191A191C1F1F0000 FCFCFCFCFCFCFC0058985838F8F80000 7F7F3F0F0F0F0F0F553A17020F080202 F8F0F0F8FCE0F0F840B02020E8209048 3F7F3F1F1F1F1F1F3F403F12121F1B16 FFFFFFFFFFFFFFFFB6AA94AA94AA94AA 003F3F3F3F3F3F3F00001F1B151A1B19 00F8FCFCFCFCFCFC0000F8B83808F828 003F3F3F3F3F3F3F00001F1812101B1A 00F8FCFCFCFCFCFC0000F818A808F818 003F3F3F3F3F3F3F00001F1F1B111B1F 00F8FCFCFCFCFCFC0000F8D888D8F8B8 003F3F3F3F3F3F3F00001F1C181B191C 00F8FCFCFCFCFCFC0000F8D868686868 003F3F3F3F3F3F3F00001F1D1E1D1F18 00F8FCFCFCFCFCFC0000F878F878F838 003F3F3F3F3F3F3F00001F1E1D1D1F1C 00F8FCFCFCFCFCFC0000F878A8F8D878 0F0F070707030303020F020303010101 F8F8C0C0C0C0808028F8000000000000 1F1F030303010303131F030202010202 FFFFFEFCFCFEFEFE365DE25CC4CA7262 3F3F3F3F3F3F3F001B1A1A1C1D1F0000 FCFCFCFCFCFCFC003818188898F80000 3F3F3F3F3F3F3F001C1D1C1E1F1F0000 FCFCFCFCFCFCFC0008C8889838F80000 3F3F3F3F3F3F3F001F1B1E1F1B1F0000 FCFCFCFCFCFCFC00F8783878E8F80000 3F3F3F3F3F3F3F0019121418181F0000 FCFCFCFCFCFCFC009818387878F80000 3F3F3F3F3F3F3F001714101D181F0000 FCFCFCFCFCFCFC00D8D8589858F80000 3F3F3F3F3F3F3F00191010181C1F0000 FCFCFCFCFCFCFC00B898183878F80000 07070B00000000000702000000000000 80808000000000008000000000000000 0307070F1F1F1F000205040B11101F00 FEFEFCFEFEFE7E00726AE45A8A827E00 003F3F3F3F3F3F3F00001F1F1914161A 00F8FCFCFCFCFCFC0000F8980888A858 003F3F3F3F3F3F3F00001F1F1F1E1D1A 00F8FCFCFCFCFCFC0000F8F8F83898C8 003F3F3F3F3F3F3F00001F1311191E1C 00F8FCFCFCFCFCFC0000F8C888987838 003F3F3F3F3F3F3F00001F1812171A16 00F8FCFCFCFCFCFC0000F8E85848F828 003F3F3F3F3F3F3F00001F1819181819 00F0F8F8F8F8F8F80000F01090101090 003F3F3F3F3F3F3F00001F1B15171B1F 00F8FCFCFCFCFCFC0000F8F8F8B858D8 003F3F3F3F3F3F3F00001F12131F1213 00F8FCFCFCFCFCFC0000F818D8D85858 003F3F3F3F3F3F3F00001F1E1D1F1E1B 00F8FCFCFCFCFCFC0000F8F87878F8D8 3F3F3F3F3F3F3F001D121E1D191F0000 FCFCFCFCFCFCFC00787878B838F80000 3F3F3F3F3F3F3F001A1A1D1E1F1F0000 FCFCFCFCFCFCFC00C8C89838F8F80000 3F3F3F3F3F3F3F001C1E1F1F1F1F0000 FCFCFCFCFCFCFC003858D8F8D8F80000 3F3F3F3F3F3F3F00151B161C181F0000 FCFCFCFCFCFCFC0038A8E8E8E8F80000 3F3F3F3F3F3F3F001A1C1819181F0000 F8F8F8F8F8F8F8005030109010F00000 3F3F3F3F3F3F3F001B1F1C1C1E1F0000 FCFCFCFCFCFCFC00B8F8B8F8F8F80000 3F3F3F3F3F3F3F001F12121E1F1F0000 FCFCFCFCFCFCFC00F8082808F8F80000 3F3F3F3F3F3F3F00161F1212121F0000 FCFCFCFCFCFCFC00E8F8484848F80000 003F3F3F3F3F3F3F00001F181B1D1D1B 00F8FCFCFCFCFCFC0000F818D8B8B8D8 003F3F3F3F3F3F3F00001F19151F1F1F 00F8FCFCFCFCFCFC0000F8F808F89898 003F3F3F3F3F3F3F00001F1F1E18181C 00F8FCFCFCFCFCFC0000F8F8F8381808 003F3F3F3F3F3F3F00001F1F1C1D1E1E 00F8FCFCFCFCFCFC0000F8F818D8B8B8 003F3F3F3F3F3F3F00001F1817141414 00F8FCFCFCFCFCFC0000F818E8E8E8A8 003F3F3F3F3F3F3F00001F1D1913191D 00F8FCFCFCFCFCFC0000F8F8F83898C8 003F3F3F3F3F3F3F00001F1B12131212 00F8FCFCFCFCFCFC0000F81808E88898 003F3F3F3F3F3F3F00001F1F1F1E1C1C 00F8FCFCFCFCFCFC0000F83878783838 3F3F3F3F3F3F3F00191A19181F1F0000 FCFCFCFCFCFCFC0058985818F8F80000 3F3F3F3F3F3F3F001E1F1F1F1F1F0000 FCFCFCFCFCFCFC0058D8C8A868F80000 3F3F3F3F3F3F3F00181C1F13121F0000 FCFCFCFCFCFCFC00181838F8F8F80000 3F3F3F3F3F3F3F001D1A191A1C1F0000 FCFCFCFCFCFCFC00D8A848A818F80000 3F3F3F3F3F3F3F0014141417181F0000 FCFCFCFCFCFCFC00A8A8A8E818F80000 3F3F3F3F3F3F3F001F1B1D1E1F1F0000 FCFCFCFCFCFCFC00E8E8D838F8F80000 3F3F3F3F3F3F3F00131F1212121F0000 FCFCFCFCFCFCFC0038F8484848F80000 3F3F3F3F3F3F3F001818101F1F1F0000 FCFCFCFCFCFCFC001898C8F8F8F80000 00000000000000000000000000000000 00181818180018000000000000000000 FFFFFFFFFFFFFFFF817F475B4B7B87FF FFFFFFFFFFFFFFFFFF7F635D55457D83 00006CFEFE7C38100000000C04000000 071D2A556AD5AAD500071F3F3F7F7F7F FFFFFFFFFFFFFFFFFCFAF5EB57AF9F6F 00181830000000000000000000000000 0C1EFFFFFF1E0C000C16FB8DFB160C00 1C3E7F7F3E1C1C1C1C366B5D3614141C C0800000000000000000000000000000 60400000000000000000000000000000 00000000181830000000000000000000 0F5FFF5F3E7DBBD10950B0592E45AA51 00000000001818000000000000000000 00000000000000000000000000000000 003C666E76663C000000000000000000 0018381818187E000000000000000000 003C660C18307E000000000000000000 003C660C06663C000000000000000000 0066667E060606000000000000000000 007E607C06067C000000000000000000 001C307C66663C000000000000000000 007E060C183030000000000000000000 003C663C66663C000000000000000000 003C663E06663C000000000000000000 00000018001800000000000000000000 3E7E7E7E7E7E7E7E0014281428142800 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 003C660C180018000000000000000000 00000000000000000000000000000000 00183C667E6666000000000000000000 007C667C66667C000000000000000000 003C666060663C000000000000000000 00786C66666C78000000000000000000 007E607860607E000000000000000000 007E6078606060000000000000000000 003C606E66663C000000000000000000 0066667E666666000000000000000000 003C181818183C000000000000000000 001E060606663C000000000000000000 00666C78786C66000000000000000000 0060606060607E000000000000000000 0042667E7E6666000000000000000000 0066767E6E6666000000000000000000 003C666666663C000000000000000000 007C667C606060000000000000000000 003C66666A6C3E000000000000000000 007C667C786C66000000000000000000 003E603C06067C000000000000000000 007E1818181818000000000000000000 0066666666663C000000000000000000 00666666663C18000000000000000000 0066667E7E6642000000000000000000 00663C183C6666000000000000000000 0066663C181818000000000000000000 007E0C1830607E000000000000000000 0000000000FF81FF0000000000000000 0000000000FFD1FF0000000000003000 0000000000FFFBFF0000000000000600 0000107C381000000000004428100000 00000000000000FF0000000000000000 #3:MAIN BG 00001410000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000200030002000300 02000300010000000000000002000300 02000300020003000000010000000000 12001300120013001200130011000000 00000000120013001200130012001300 10001100000000008000810002010301 020003004E004F004D084C0802000300 02010301020003000000010000000000 9000910012011301120013005E005F00 5D085C08120013001201130112001300 10001100000000000200030002000300 020003006E006F006D086C0886008700 02000300020003000000010000000000 1200130012001300120013007E007F00 7D087C08960097001200130012001300 10001100000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000 #15:MAIN SOUND 2800013A00DC00003800306603001000 380010E81EF900003800320001000000 38003200010000000800505005000000 1800401305FE00003800A00006FC0000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 525F00535F0000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000