File: bug.txt - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off

0001: [img]http://www.mirari.fr/Y5X0[/img]
0002: 
0003: Bon j'ai un peu optimis� le code et ajout� de quoi calculer les d�g�ts. ï¿½a finira peut ï¿½tre par faire un vrai jeu :p
0004: 
0005: Ah et les ennemis sont moins agressifs maintenant.
0006: [box=test.c]
0007: [code=c]
0008: #pragma string name C TEST
0009: 
0010: #include "..\dev\ti83p.h"
0011: #include "..\dev\tilib.c"
0012: #include "..\dev\gbalib2.c"
0013: 
0014: // Sprites
0015: #include "..\dev\sprites\title.h"
0016: #include "..\dev\sprites\map.h"
0017: #include "..\dev\sprites\map_player.h"
0018: #include "..\dev\sprites\tiles.h"
0019: #include "..\dev\sprites\battle_player_up.h"
0020: #include "..\dev\sprites\battle_player_up_attack.h"
0021: #include "..\dev\sprites\battle_player_right.h"
0022: #include "..\dev\sprites\battle_player_right_attack.h"
0023: #include "..\dev\sprites\battle_player_down.h"
0024: #include "..\dev\sprites\battle_player_down_attack.h"
0025: #include "..\dev\sprites\battle_player_left.h"
0026: #include "..\dev\sprites\battle_player_left_attack.h"
0027: #include "..\dev\sprites\battle_enemy.h"
0028: #include "..\dev\sprites\battle_enemy_attack.h"
0029: 
0030: // Map
0031: extern char battle_map[];
0032: #asm
0033: ._battle_map
0034:     defb 4,4,4,4,4,4,4,3,3,3,3,3,4,4,4,4,4,4,4,4
0035:     defb 4,0,0,0,0,0,0,1,3,3,3,4,4,0,1,1,1,0,0,4
0036:     defb 4,0,0,0,0,0,0,2,1,3,3,1,1,0,2,2,2,0,0,4
0037:     defb 4,0,0,4,4,4,0,0,2,3,0,2,2,0,0,0,0,0,0,4
0038:     defb 4,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4
0039:     defb 4,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
0040:     defb 4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
0041:     defb 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
0042:     defb 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
0043:     defb 4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
0044:     defb 4,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
0045:     defb 4,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,4
0046:     defb 4,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,4
0047:     defb 4,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4
0048:     defb 4,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,4
0049:     defb 4,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,4
0050:     defb 4,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,4
0051:     defb 4,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,4
0052:     defb 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
0053:     defb 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
0054: #endasm
0055: 
0056: // Constants
0057: #define START   0
0058: #define LOAD    1
0059: #define QUIT    2
0060: #define BATTLE_MAP_WIDTH    20
0061: #define BATTLE_MAP_HEIGHT   20
0062: #define ATTACK_ANIM_DELAY   45
0063: 
0064: // Global variables
0065: unsigned char i, j, key, player_x = 80, player_y = 59, player_hp = 10, battle_player_x = 10, battle_player_y = 18, *battle_player_direction = 0, camera_x, camera_y, x_temp, y_temp, x_temp2, y_temp2;
0066: 
0067: typedef struct {
0068:   unsigned char x;
0069:   unsigned char y;
0070:   unsigned char *sprite;
0071:   unsigned char hp;
0072: } enemy_struct;
0073: 
0074: enemy_struct enemy[4];
0075: 
0076: extern char text_menu[];
0077: #asm
0078: ._text_menu
0079:     defm "Nouveau"&TL_NEWL&"Continuer"&TL_NEWL&"Quitter"&0
0080: #endasm
0081: 
0082: extern char text_intro[];
0083: #asm
0084: ._text_intro
0085:     defm "Vous viviez tranquillement"&TL_NEWL&"en dehors de la soci"&0x96&"t"&0x96&TL_NEWL&"jusqu'au jour o"&0xaf&" vous"&TL_NEWL&"d"&0x96&"couvrez qu'on vous a"&TL_NEWL&"vol"&0x96&"..."&TL_BRK&TL_NEWL&"Vous d"&0x96&"cidez alors de"&TL_NEWL&"partir "&0x8f&" la recherche"&TL_NEWL&"des voleurs."&TL_BRK&0
0086: #endasm
0087: 
0088: extern char text_castle[];
0089: #asm
0090: ._text_castle
0091:     defm "Garde :"&TL_NEWL&"Passez votre chemin sale"&TL_NEWL&"manant !"&TL_BRK&0
0092: #endasm
0093: 
0094: extern char text_hp[];
0095: #asm
0096: ._text_hp
0097:     defm "PV :"&0
0098: #endasm
0099: 
0100: //Functions prototypes
0101: void main_menu(void);
0102: char draw_cursor(unsigned char x, unsigned char y);
0103: void handle_map(void);
0104: void update_map(void);
0105: char draw_player(unsigned char old_player_x, unsigned char old_player_y, unsigned char player_x, unsigned char player_y);
0106: char check_place(unsigned char player_x, unsigned char player_y);
0107: void battle(void);
0108: void update_battle_screen(void);
0109: char is_location_empty(unsigned char x, unsigned char y);
0110: char hit(unsigned char damage, unsigned char x, unsigned char y);
0111: 
0112: //Functions
0113: char main(){
0114:     switch(main_menu()){
0115:         case START:
0116:             TL_rectangle_filled(0, 0, 96, 64, TL_RECT_FILL_BLACK);
0117:             TL_rectangle_filled(1, 1, 94, 62, TL_RECT_FILL_WHITE);
0118:             TL_text(2, 1, text_intro, TL_TEXT_TYPE, 5);
0119:             handle_map();
0120:             break;
0121:         case LOAD:
0122:             break;
0123:     }
0124: }
0125: 
0126: void main_menu(void){
0127:     unsigned char cursor_y = 0;
0128:     TL_large_sprite(5, 0, 11, 26, title);
0129:     TL_rectangle_filled(28, 33, 40, 21, TL_RECT_FILL_BLACK);
0130:     TL_rectangle_filled(29, 34, 38, 19, TL_RECT_FILL_WHITE);
0131:     TL_text(34, 34, text_menu, TL_TEXT_NOTYPE, 0);
0132:     TL_gbuf_to_lcd();
0133:     key = 0;
0134:     while(key != skey_2nd){
0135:         draw_cursor(30, 34+cursor_y*6);
0136:         key = TL_get_key();
0137:         switch(key){
0138:             case skey_up:
0139:                 if(cursor_y > START){
0140:                     TL_gbuf_to_lcd();
0141:                     cursor_y-=1;
0142:                 }
0143:                 break;
0144:             case skey_down:
0145:                 if(cursor_y < QUIT){
0146:                     TL_gbuf_to_lcd();
0147:                     cursor_y+=1;
0148:                 }
0149:                 break;
0150:         }
0151:     }
0152:     return cursor_y;
0153: }
0154: 
0155: char draw_cursor(unsigned char x, unsigned char y){
0156: #asm
0157:     res textwrite,(iy+sgrflags) ; reset some flag to write only to the screen (not the graph buffer)
0158:     ld hl,2
0159:     add hl,sp
0160:     ld b,(hl)   ; get y from the parameters (stack)
0161:     inc hl
0162:     inc hl
0163:     ld c,(hl)   ; get x
0164:     ld (pencol),bc
0165:     ld a,5
0166:     rst rbr_call
0167:     defw _vputmap   ; write the cursor character
0168:     set textwrite,(iy+sgrflags) ; set the flag to write on the gbuf
0169: #endasm
0170: }
0171: 
0172: void handle_map(void){
0173:     int move;
0174:     update_map();
0175:     key = 0;
0176:     while(key != dkey_clear){
0177:         key = TL_direct_input(dkey_group_1);
0178:         switch(key){
0179:             case dkey_up:
0180:                 if((TL_get_pixel(player_x, player_y-1) == TL_PIXEL_ON) || (TL_get_pixel(player_x+1, player_y-1) == TL_PIXEL_ON) || (TL_get_pixel(player_x+2, player_y-1) == TL_PIXEL_ON)){
0181:                     check_place(player_x+1, player_y-1);
0182:                     update_map();
0183:                 }else
0184:                     move = 1;
0185:                 break;
0186:             case dkey_right:
0187:                 if((TL_get_pixel(player_x+3, player_y) == TL_PIXEL_ON) || (TL_get_pixel(player_x+3, player_y+1) == TL_PIXEL_ON) || (TL_get_pixel(player_x+3, player_y+2) == TL_PIXEL_ON)){
0188:                     check_place(player_x+3, player_y+1);
0189:                     update_map();
0190:                 }else
0191:                     move = 1;
0192:                 break;
0193:             case dkey_left:
0194:                 if((TL_get_pixel(player_x-1, player_y) == TL_PIXEL_ON) || (TL_get_pixel(player_x-1, player_y+1) == TL_PIXEL_ON) || (TL_get_pixel(player_x-1, player_y+2) == TL_PIXEL_ON)){
0195:                     check_place(player_x-1, player_y+1);
0196:                     update_map();
0197:                 }else
0198:                     move = 1;
0199:                 break;
0200:             case dkey_down:
0201:                 if((TL_get_pixel(player_x, player_y+3) == TL_PIXEL_ON) || (TL_get_pixel(player_x+1, player_y+3) == TL_PIXEL_ON) || (TL_get_pixel(player_x+2, player_y+3) == TL_PIXEL_ON)){
0202:                     check_place(player_x+1, player_y+3);
0203:                     update_map();
0204:                 }else
0205:                     move = 1;
0206:                 break;
0207:         }
0208:         if(move){
0209:             draw_player(player_x, player_y, player_x += (key == dkey_right)-(key == dkey_left), player_y += (key == dkey_down)-(key == dkey_up));
0210:             move = 0;
0211:         }
0212:         key = TL_direct_input(dkey_group_2);
0213:     }
0214: }
0215: 
0216: void update_map(void){
0217:     C_bcall(_cleargbuf);
0218:     TL_large_sprite(0, 0, 12, 64, map);
0219:     TL_small_sprite(player_x, player_y, 3, map_player);
0220:     TL_gbuf_to_lcd();
0221: }
0222: 
0223: char draw_player(unsigned char old_player_x, unsigned char old_player_y, unsigned char player_x, unsigned char player_y){
0224:     TL_small_sprite(old_player_x, old_player_y, 3, map_player); // clear the player's sprite
0225:     TL_small_sprite(player_x, player_y, 3, map_player); // and re-draw it to its new place
0226:     TL_gbuf_to_lcd();
0227: }
0228: 
0229: char check_place(unsigned char player_x, unsigned char player_y){
0230:     if(player_x > 5 && player_x < 19 && player_y > 4 && player_y < 31){
0231:         // TOWER
0232:     }else if(player_x > 25 && player_x < 58 && player_y > 3 && player_y < 36){
0233:         // CASTLE
0234:         TL_rectangle_filled(0, 37, 96, 27, TL_RECT_FILL_BLACK);
0235:         TL_rectangle_filled(1, 38, 94, 25, TL_RECT_FILL_WHITE);
0236:         TL_text(2, 38, text_castle, TL_TEXT_TYPE, 5);
0237:     }else if(player_x > 57 && player_x < 95 && player_y > 0 && player_y < 25){
0238:         // VOLCANO
0239:     }else if(player_x > 29 && player_x < 49 && player_y > 39 && player_y < 54){
0240:         // TOWN
0241:     }else if(player_x > 59 && player_x < 95 && player_y > 32 && player_y < 63){
0242:         if(player_x > 83 && player_x < 94 && player_y > 52 && player_y < 62){
0243:             // HOUSE
0244:         }else{
0245:             // FOREST
0246:             battle();
0247:         }
0248:     }
0249: }
0250: 
0251: void battle(void){
0252:     C_bcall(_cleargbuf);
0253:     for(i = 0; i<4; i++){
0254: generate_enemy_coordinates:
0255:         x_temp = TL_random(BATTLE_MAP_WIDTH-2)+1;
0256:         y_temp = TL_random(BATTLE_MAP_HEIGHT/2)+1;
0257:         if(GBA_collision((x_temp-GBA_scroll_x)*8, (y_temp-GBA_scroll_y)*8) > 0)
0258:             goto generate_enemy_coordinates;
0259:         enemy[i].x = x_temp;
0260:         enemy[i].y = y_temp;
0261:         enemy[i].sprite = battle_enemy;
0262:         enemy[i].hp = 3;
0263:     }
0264:     battle_player_direction = battle_player_up;
0265:     key = 0;
0266:     while(key != skey_clear){
0267:         if(battle_player_x < screen_w/16){
0268:             camera_x = 0;
0269:         }else if(battle_player_x > BATTLE_MAP_WIDTH-screen_w/16){
0270:             camera_x = BATTLE_MAP_WIDTH-screen_w/8;
0271:         }else{
0272:             camera_x = battle_player_x-screen_w/16;
0273:         }
0274:         if(battle_player_y < screen_h/16){
0275:             camera_y = 0;
0276:         }else if(battle_player_y > BATTLE_MAP_HEIGHT-screen_h/18){
0277:             camera_y = BATTLE_MAP_HEIGHT-screen_h/9;
0278:         }else{
0279:             camera_y = battle_player_y-screen_h/16;
0280:         }
0281:         update_battle_screen();
0282:         key = TL_get_key();
0283:         x_temp = battle_player_x-(key == skey_left)+(key == skey_right);
0284:         y_temp = battle_player_y-(key == skey_up)+(key == skey_down);
0285:         if(is_location_empty(x_temp, y_temp) && GBA_collision((x_temp-GBA_scroll_x)*8, (y_temp-GBA_scroll_y)*8) == 0){
0286:             battle_player_x = x_temp;
0287:             battle_player_y = y_temp;
0288:         }
0289:         switch(key){
0290:             case skey_up:
0291:                 battle_player_direction = battle_player_up;
0292:                 x_temp2 = battle_player_x;
0293:                 y_temp2 = battle_player_y-1;
0294:                 break;
0295:             case skey_right:
0296:                 battle_player_direction = battle_player_right;
0297:                 x_temp2 = battle_player_x+1;
0298:                 y_temp2 = battle_player_y;
0299:                 break;
0300:             case skey_left:
0301:                 battle_player_direction = battle_player_left;
0302:                 x_temp2 = battle_player_x-1;
0303:                 y_temp2 = battle_player_y;
0304:                 break;
0305:             case skey_down:
0306:                 battle_player_direction = battle_player_down;
0307:                 x_temp2 = battle_player_x;
0308:                 y_temp2 = battle_player_y+1;
0309:                 break;
0310:         }
0311:         if(key == skey_2nd){
0312:             battle_player_direction += 2*8; // go to the attack sprite
0313:             if(is_location_empty(x_temp2, y_temp2)){
0314:                 update_battle_screen();
0315:                 TL_delay(ATTACK_ANIM_DELAY);
0316:             }else
0317:                 enemy[j].hp -= hit(TL_random(2), (enemy[j].x-GBA_scroll_x)*8, (enemy[j].y-GBA_scroll_y)*8);
0318:             battle_player_direction -= 2*8; // go back to the normal sprite
0319:         }
0320:         // IA
0321:         for(i = 0; i<4; i++){
0322:             if(enemy[i].hp > 0){
0323:                 if(TL_random(3)){   // 1 in 3 chance that the enemy goes anywhere
0324:                     if(TL_random(2))
0325:                         x_temp = TL_random(2)+enemy[i].x;
0326:                     else
0327:                         x_temp = -TL_random(2)+enemy[i].x;
0328:                     if(TL_random(2))
0329:                         y_temp = TL_random(2)+enemy[i].y;
0330:                     else
0331:                         y_temp = -TL_random(2)+enemy[i].y;
0332:                 }else{  // 2 in 3 chance that the enemy follow the player
0333:                     x_temp = enemy[i].x+(enemy[i].x < battle_player_x)-(enemy[i].x > battle_player_x);
0334:                     y_temp = enemy[i].y+(enemy[i].y < battle_player_y)-(enemy[i].y > battle_player_y);
0335:                 }
0336:                 if(TL_random(2))    // to prevent the enemy from moving two tiles at a time
0337:                     x_temp = enemy[i].x;
0338:                 else
0339:                     y_temp = enemy[i].y;
0340:                 if(is_location_empty(x_temp, y_temp) && GBA_collision((x_temp-GBA_scroll_x)*8, (y_temp-GBA_scroll_y)*8) == 0){
0341:                     if(x_temp == battle_player_x && y_temp == battle_player_y){
0342:                         enemy[i].sprite = battle_enemy_attack;
0343:                         player_hp -= hit(TL_random(2), (battle_player_x-GBA_scroll_x)*8, (battle_player_y-GBA_scroll_y)*8);
0344:                         enemy[i].sprite = battle_enemy;
0345:                     }else{
0346:                         enemy[i].x = x_temp;
0347:                         enemy[i].y = y_temp;
0348:                     }
0349:                 }
0350:             }
0351:         }
0352:     }
0353: }
0354: 
0355: void update_battle_screen(void){
0356:     C_bcall(_cleargbuf);
0357:     GBA_init_map(camera_x, camera_y, 20, 20, tiles, battle_map);
0358:     GBA_restore_map();
0359:     GBA_draw_mask_sprite((battle_player_x-GBA_scroll_x)*8, (battle_player_y-GBA_scroll_y)*8, 1, 8, battle_player_direction, GBA_CLIP_SPRITE);
0360:     for(j = 0; j<4; j++){
0361:         if(enemy[j].hp > 0)
0362:             GBA_draw_mask_sprite((enemy[j].x-GBA_scroll_x)*8, (enemy[j].y-GBA_scroll_y)*8, 1, 8, enemy[j].sprite, GBA_CLIP_SPRITE);
0363:     }
0364: #asm
0365:     ld hl,gbuf+57*(96/8)
0366:     ld de,gbuf+57*(96/8)+1
0367:     ld (hl),@11111111
0368:     ld bc,96/8
0369:     ldir    ; draw a horizontal line (x = 0, y = 57, w = 96, h = 1)
0370: #endasm 
0371:     TL_text(0, 58, text_hp, TL_TEXT_NOTYPE, 0);
0372:     TL_put_val(12, 58, player_hp);
0373:     TL_gbuf_to_lcd();
0374: }
0375: 
0376: char is_location_empty(unsigned char x, unsigned char y){   // return 1 (TRUE) if there's no enemy at the location, otherwise return 0 (FALSE)
0377:     for(j = 0; j<4; j++){
0378:         if(enemy[j].x == x && enemy[j].y == y && enemy[j].hp > 0){
0379:             return 0;
0380:         }
0381:     }
0382:     return 1;
0383: }
0384: 
0385: char hit(unsigned char damage, unsigned char x, unsigned char y){
0386:     update_battle_screen();
0387:     TL_rectangle_filled(x+2, y-7, 5, 7, TL_RECT_FILL_WHITE);
0388:     TL_put_val(x+3, y-7, damage);
0389:     TL_gbuf_to_lcd();
0390:     TL_delay(ATTACK_ANIM_DELAY);
0391:     return damage;
0392: }
0393: [/code]
0394: [/box]
0395: [box=tilib.c]
0396: [code=c]
0397: #include "..\dev\tilib.h"   // ï¿½ MODIFIER EN : #include "tilib.h"
0398: 
0399: #if defined TL_ALL
0400: #define TL_RANDOM
0401: #define TL_DELAY
0402: #define TL_SMALL_SPRITE
0403: #define TL_LARGE_SPRITE
0404: #define TL_GBUF_TO_LCD
0405: #define TL_DIRECT_INPUT
0406: #define TL_GET_KEY
0407: #define TL_GET_PIXEL
0408: #define TL_RECTANGLE_FILLED
0409: #define TL_TEXT
0410: #define TL_PUT_VAL
0411: #endif
0412: 
0413: #if defined TL_RANDOM
0414: #asm
0415: TL_random_data:
0416:     defw $0000
0417: #endasm
0418: char __FASTCALL__ TL_random(unsigned char max){
0419: #asm
0420: ; Random routine by Joe Wingbermuehle
0421:     ld b,l
0422: 
0423: TL_random:
0424:     push hl
0425:     push de
0426:     ld hl,(TL_random_data)
0427:     ld a,r
0428:     ld d,a
0429:     ld e,(hl)
0430:     add hl,de
0431:     add a,l
0432:     xor h
0433:     ld (TL_random_data),hl
0434:     sbc hl,hl
0435:     ld e,a
0436:     ld d,h
0437: TL_random_loop:
0438:     add hl,de
0439:     djnz TL_random_loop
0440:     ld a,h
0441:     pop de
0442:     pop hl
0443:     ld h,0
0444:     ld l,a
0445: #endasm
0446: }
0447: #endif
0448: 
0449: #if defined TL_DELAY
0450: char __FASTCALL__ TL_delay(unsigned char delay){
0451: #asm
0452:     ld b,l
0453:     ei
0454: 
0455: delay_loop:
0456:     halt
0457:     djnz delay_loop
0458:     di
0459: #endasm
0460: }
0461: #endif
0462: 
0463: #if defined TL_SMALL_SPRITE
0464: char TL_small_sprite(unsigned char x, unsigned char y, unsigned char height, unsigned char *sprite){
0465: #asm
0466: ; Sprite routine by Joe Wingbermuehle
0467:     ld hl,2
0468:     add hl,sp
0469:     ld e,(hl)
0470:     inc hl
0471:     ld d,(hl)
0472:     push de
0473:     pop ix
0474:     inc hl
0475:     ld b,(hl)
0476:     inc hl
0477:     inc hl
0478:     ld c,(hl)
0479:     inc hl
0480:     inc hl
0481:     ld a,(hl)
0482:     ld l,c
0483: 
0484: TL_small_sprite:
0485:     ld e,l
0486:     ld h,$00
0487:     ld d,h
0488:     add hl,de
0489:     add hl,de
0490:     add hl,hl
0491:     add hl,hl
0492:     ld e,a
0493:     and $07
0494:     ld c,a
0495:     srl e
0496:     srl e
0497:     srl e
0498:     add hl,de
0499:     ld de,gbuf
0500:     add hl,de
0501: 
0502: TL_small_sprite_loop_1:
0503:     ld d,(ix)
0504:     ld e,$00
0505:     ld a,c
0506:     or a
0507:     jr z,TL_small_sprite_skip_1
0508: 
0509: TL_small_sprite_loop_2:
0510:     srl d
0511:     rr e
0512:     dec a
0513:     jr nz,TL_small_sprite_loop_2
0514: 
0515: TL_small_sprite_skip_1:
0516:     ld a,(hl)
0517:     xor d
0518:     ld (hl),a
0519:     inc hl
0520:     ld a,(hl)
0521:     xor e
0522:     ld (hl),a
0523:     ld de,$0b
0524:     add hl,de
0525:     inc ix
0526:     djnz TL_small_sprite_loop_1
0527: #endasm
0528: }
0529: #endif
0530: 
0531: #if defined TL_LARGE_SPRITE
0532: char TL_large_sprite(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char *sprite){
0533: #asm
0534: ; Sprite routine by Joe Wingbermuehle
0535:     ld hl,2
0536:     add hl,sp
0537:     ld e,(hl)
0538:     inc hl
0539:     ld d,(hl)
0540:     push de
0541:     pop ix
0542:     inc hl
0543:     ld b,(hl)
0544:     inc hl
0545:     inc hl
0546:     ld c,(hl)
0547:     inc hl
0548:     inc hl
0549:     push hl
0550:     inc hl
0551:     inc hl
0552:     ld a,(hl)
0553:     pop hl
0554:     ld l,(hl)
0555: 
0556: TL_large_sprite:
0557:     di
0558:     ex af,af
0559:     ld a,c
0560:     push af
0561:     ex af,af
0562:     ld e,l
0563:     ld h,0
0564:     ld d,h
0565:     add hl,de
0566:     add hl,de
0567:     add hl,hl
0568:     add hl,hl
0569:     ld e,a
0570:     and $07
0571:     ld c,a
0572:     srl e
0573:     srl e
0574:     srl e
0575:     add hl,de
0576:     ld de,gbuf
0577:     add hl,de
0578: 
0579: TL_large_sprite_loop_1:
0580:     push hl
0581: 
0582: TL_large_sprite_loop_2:
0583:     ld d,(ix)
0584:     ld e,0
0585:     ld a,c
0586:     or a
0587:     jr z,TL_large_sprite_skip_1
0588: 
0589: TL_large_sprite_loop_3:
0590:     srl d
0591:     rr e
0592:     dec a
0593:     jr nz,TL_large_sprite_loop_3
0594: 
0595: TL_large_sprite_skip_1:
0596:     ld a,(hl)
0597:     xor d
0598:     ld (hl),a
0599:     inc hl
0600:     ld a,(hl)
0601:     xor e
0602:     ld (hl),a
0603:     inc ix
0604:     ex af,af
0605:     dec a
0606:     push af
0607:     ex af,af
0608:     pop af
0609:     jr nz,TL_large_sprite_loop_2
0610:     pop hl
0611:     pop af
0612:     push af
0613:     ex af,af
0614:     ld de,$0c
0615:     add hl,de
0616:     djnz TL_large_sprite_loop_1
0617:     pop af
0618: #endasm
0619: }
0620: #endif
0621: 
0622: #if defined TL_GBUF_TO_LCD || defined TL_TEXT
0623: void TL_gbuf_to_lcd(void){
0624: #asm
0625: ; Fast copy routine by Joe Wingbermuehle
0626: TL_gbuf_to_lcd:
0627:     di
0628:     ld a,$80
0629:     out (plcdcmd),a
0630:     ld hl,gbuf-12-(-(12*64)+1)
0631:     ld a,$20
0632:     ld c,a
0633:     inc hl
0634:     dec hl
0635: 
0636: TL_gbuf_to_lcd_again:
0637:     ld b,64
0638:     inc c
0639:     ld de,-(12*64)+1
0640:     out (plcdcmd),a
0641:     add hl,de
0642:     ld de,10
0643: 
0644: TL_gbuf_to_lcd_loop:
0645:     add hl,de
0646:     inc hl
0647:     inc hl
0648:     inc de
0649:     ld a,(hl)
0650:     out (plcddata),a
0651:     dec de
0652:     djnz TL_gbuf_to_lcd_loop
0653:     ld a,c
0654:     cp $2b+1
0655:     jr nz,TL_gbuf_to_lcd_again
0656: #endasm
0657: }
0658: #endif
0659: 
0660: #if defined TL_DIRECT_INPUT
0661: char __FASTCALL__ TL_direct_input(unsigned char keygroup){
0662: #asm
0663:     ld a,l  ; a = keygroup
0664:     out (pkey),a
0665:     in a,(pkey)
0666:     ld h,0
0667:     ld l,a      ; hl is the return parameter
0668: #endasm
0669: }
0670: #endif
0671: 
0672: #if defined TL_GET_KEY
0673: void TL_get_key(void){
0674: #asm
0675: TL_get_key_loop:
0676:     rst rbr_call
0677:     defw _getcsc
0678:     or a
0679:     jr z,TL_get_key_loop
0680:     ld h,0
0681:     ld l,a
0682: #endasm
0683: }
0684: #endif
0685: 
0686: #if defined TL_GET_PIXEL
0687: char TL_get_pixel(unsigned char x, unsigned char y){
0688: #asm
0689:     ld hl,2
0690:     add hl,sp
0691:     ld e,(hl)   ; e=y
0692:     inc hl
0693:     inc hl
0694:     ld a,(hl)   ; a=x
0695:     ld l,e
0696: 
0697: TL_get_pixel:
0698:     ld h,0
0699:     ld d,h
0700:     ld e,l
0701:     add hl,hl
0702:     add hl,de
0703:     add hl,hl
0704:     add hl,hl
0705:     ld e,a
0706:     srl e
0707:     srl e
0708:     srl e
0709:     add hl,de
0710:     ld de,plotsscreen
0711:     add hl,de
0712:     and 7
0713:     ld b,a
0714:     ld a,$80
0715:     jr z,TL_test_pixel
0716: 
0717: TL_get_pixel_loop:
0718:     rrca
0719:     djnz TL_get_pixel_loop
0720: 
0721: TL_test_pixel:
0722:     and (hl)
0723:     or a
0724:     ld hl,TL_PIXEL_ON
0725:     jr nz,TL_get_pixel_quit
0726:     ld hl,TL_PIXEL_OFF
0727: 
0728: TL_get_pixel_quit:
0729: #endasm
0730: }
0731: #endif
0732: 
0733: #if defined TL_RECTANGLE_FILLED
0734: char TL_rectangle_filled(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char color){
0735: #asm
0736: ; Rectangle filled routine by chickendude
0737: #define GBUF_LSB    $40
0738: #define GBUF_MSB    $93
0739:     ld hl,2
0740:     add hl,sp
0741:     push hl
0742:     inc hl
0743:     inc hl
0744:     ld b,(hl)
0745:     inc hl
0746:     inc hl
0747:     ld c,(hl)
0748:     inc hl
0749:     inc hl
0750:     ld e,(hl)
0751:     inc hl
0752:     inc hl
0753:     ld d,(hl)
0754:     pop hl
0755:     ld a,(hl)
0756:     cp 2
0757:     jr z,TL_rectangle_filled_xor
0758:     or a
0759:     jr nz,TL_rectangle_filled_solid
0760: 
0761: ;b = height
0762: ;c = width
0763: ;d = starting x
0764: ;e = starting y
0765: 
0766: TL_rectangle_filled_white:
0767:     call TL_rectangle_filled_solid
0768: 
0769: TL_rectangle_filled_xor:
0770:     ld a,$ae        ;xor (hl)
0771:     jr TL_rectangle_filled_2
0772: 
0773: TL_rectangle_filled_solid:
0774:     ld a,$b6        ;or (hl)
0775: 
0776: TL_rectangle_filled_2:
0777:     push de
0778:     push bc
0779:     ld (TL_rectangle_filled_or_xor),a   ;use smc for xor/solid fill
0780:     ld a,d          ;starting x
0781:     and $7          ;what bit do we start on?
0782:     ex af,af
0783:     ld a,d          ;starting x
0784:     ld l,e          ;ld hl,e
0785:     ld h,0          ; ..
0786:     ld d,h          ;set d = 0
0787:     add hl,de       ;starting y * 12
0788:     add hl,de       ;x3
0789:     add hl,hl       ;x6
0790:     add hl,hl       ;x12
0791:     rra             ;a = x coord / 8
0792:     rra             ;
0793:     rra             ;
0794:     and @00011111   ;starting x/8 (starting byte in gbuf)
0795:     add a,GBUF_LSB
0796:     ld e,a          ;
0797:     ld d,GBUF_MSB   ;
0798:     add hl,de       ;hl = offset in gbuf
0799:     ex af,af
0800:     ld d,a
0801:     ld a,@10000000
0802:     jr z,TL_rectangle_filled_4
0803: 
0804: TL_rectangle_filled_3:
0805:     rra
0806:     dec d
0807:     jr nz,TL_rectangle_filled_3
0808: 
0809: TL_rectangle_filled_4:
0810:     ld e,12
0811: 
0812: TL_rectangle_filled_loop_x:
0813:     push af
0814:     push bc
0815:     push hl
0816:     ld c,a
0817: 
0818: TL_rectangle_filled_loop_y:
0819: TL_rectangle_filled_or_xor:
0820:     or (hl)         ;smc will modify this to or/xor
0821:     ld (hl),a
0822:     ld a,c
0823:     add hl,de
0824:     djnz TL_rectangle_filled_loop_y
0825:     pop hl
0826:     pop bc
0827:     pop af
0828:     rrca
0829:     jr nc,TL_rectangle_filled_5
0830:     inc hl
0831: 
0832: TL_rectangle_filled_5:
0833:     dec c
0834:     jr nz,TL_rectangle_filled_loop_x
0835: 
0836: TL_rectangle_filled_end:
0837:     pop bc
0838:     pop de
0839: #endasm
0840: }
0841: #endif
0842: 
0843: #if defined TL_TEXT
0844: #asm
0845: TL_text_wait:
0846:     defb 0
0847: TL_text_typing_speed:
0848:     defb 0
0849: TL_text_default_col:
0850:     defb 0
0851: #endasm
0852: char TL_text(unsigned char x, unsigned char y, unsigned char *text, unsigned char is_typed, unsigned char typing_speed){
0853: #asm
0854: ; Text routine by chickendude
0855: ;0      ($00)   = end of a dialogue or end of a menu option
0856: ;NEWX   ($ff)   = new X coordinate
0857: ;NEWY   ($fe)   = new Y coordinate
0858: ;NEWXY  ($fd)   = new XY coordinates
0859: ;NEWL   ($fc)   = new line
0860: ;BRK    ($fb)   = pause
0861:     ld hl,2
0862:     add hl,sp
0863:     set textwrite,(iy+sgrflags)
0864:     ld a,(hl)
0865:     ld (TL_text_typing_speed),a
0866:     inc hl
0867:     inc hl
0868:     ld a,(hl)
0869:     ld (TL_text_wait),a
0870:     inc hl
0871:     inc hl
0872:     push hl
0873:     inc hl
0874:     inc hl
0875:     ld d,(hl)
0876:     inc hl
0877:     inc hl
0878:     ld e,(hl)
0879:     pop hl
0880:     ld a,(hl)
0881:     inc hl
0882:     ld h,(hl)
0883:     ld l,a
0884: 
0885: TL_text_start:
0886:     ld (pencol),de
0887:     ld a,e
0888:     ld (TL_text_default_col),a
0889: 
0890: TL_text_loop:
0891:     ld de,(pencol)
0892:     ld a,(hl)
0893:     or a
0894:     jp z,TL_gbuf_to_lcd
0895:     cp TL_BRK
0896:     jr c,TL_text_not_special
0897:     ld bc,TL_text_loop
0898:     push bc
0899:     push hl
0900:     ld hl,TL_text_routine_table
0901:     cpl
0902:     add a,a
0903:     ld c,a
0904:     ld b,0
0905:     add hl,bc
0906:     ld c,(hl)
0907:     inc hl
0908:     ld b,(hl)
0909:     pop hl          ;hl = adress in the string
0910:     push bc         ;bc = routine adress where we want to jump
0911:     ret
0912: 
0913: TL_text_not_special:
0914:     push de
0915:     push ix
0916:     rst rbr_call
0917:     defw _vputmap
0918:     pop ix
0919:     pop de
0920:     ld a,(TL_text_wait) ;= 0 if no delay, != 0 else
0921:     or a
0922:     call nz,TL_text_delay
0923:     inc hl
0924:     jr TL_text_loop
0925: 
0926: TL_text_delay:
0927:     di
0928:     exx
0929:     ld a,dkey_group_6   ;check ALPHA to skip text typing
0930:     out (pkey),a
0931:     in a,(pkey)
0932:     bit 7,a
0933:     jr nz,TL_text_delay_skip
0934:     xor a
0935:     ld (TL_text_wait),a
0936: 
0937: TL_text_delay_skip:
0938:     ld a,(TL_text_typing_speed)
0939:     ld b,a
0940: 
0941: TL_text_delay_loop:
0942:     push bc
0943:     call nc,TL_gbuf_to_lcd
0944:     pop bc
0945:     djnz TL_text_delay_loop
0946:     exx
0947:     ret
0948: 
0949: TL_text_routine_table:
0950:     defw TL_text_new_x
0951:     defw TL_text_new_y
0952:     defw TL_text_new_x_y
0953:     defw TL_text_new_line
0954:     defw TL_text_pause
0955: 
0956: TL_text_new_x:
0957:     inc hl
0958:     ld e,(hl)
0959:     ld (pencol),de
0960:     inc hl
0961:     ret
0962: 
0963: TL_text_new_x_y:
0964:     call TL_text_new_x
0965: 
0966: TL_text_new_y:
0967:     inc hl
0968:     ld d,(hl)
0969:     ld (pencol),de
0970:     inc hl
0971:     ret
0972: 
0973: TL_text_new_line:
0974:     ld a,d
0975:     add a,6 ;penrow+6
0976:     ld d,a
0977:     ld a,(TL_text_default_col)
0978:     ld e,a
0979:     ld (pencol),de
0980:     inc hl
0981:     ld a,(hl)
0982:     ret
0983: 
0984: TL_text_pause:
0985:     push hl
0986:     call TL_gbuf_to_lcd
0987: 
0988: TL_text_pause_loop:
0989:     ei
0990:     halt
0991:     di
0992:     ld a,dkey_group_7   ;check 2nd
0993:     out (pkey),a
0994:     in a,(pkey)
0995:     bit 5,a
0996:     jr nz,TL_text_pause_loop
0997: 
0998: TL_text_load_next:
0999:     ld hl,TL_text_wait
1000:     inc (hl)
1001:     in a,(pkey)
1002:     inc a
1003:     jr nz,TL_text_load_next
1004:     pop hl
1005:     inc hl                  ;skip BRK
1006:     ret
1007: #endasm
1008: }
1009: #endif
1010: 
1011: #if defined TL_PUT_VAL
1012: char TL_put_val(unsigned char x, unsigned char y, unsigned char val){
1013: #asm
1014: TL_put_val:
1015:     ld hl,2
1016:     add hl,sp
1017:     ld e,(hl)
1018:     inc hl
1019:     ld d,(hl)
1020:     push de
1021:     inc hl
1022:     ld b,(hl)
1023:     inc hl
1024:     inc hl
1025:     ld c,(hl)
1026:     ld (pencol),bc
1027:     pop hl
1028:     rst rbr_call
1029:     defw _setxxxxop2
1030:     rst rbr_call
1031:     defw _op2toop1
1032:     ld a,3
1033:     rst rbr_call
1034:     defw _dispop1a
1035: #endasm
1036: }
1037: #endif
1038: [/code]
1039: [/box]
1040: [box=tilib.h]
1041: [code=c]
1042: //****************************************************//
1043: //** Uncomment #define of functions you want to use **//
1044: //****************************************************//
1045: 
1046: //#define TL_ALL    //Auto define all functions
1047: #define TL_RANDOM
1048: #define TL_DELAY
1049: #define TL_SMALL_SPRITE
1050: #define TL_LARGE_SPRITE
1051: #define TL_GBUF_TO_LCD
1052: #define TL_DIRECT_INPUT
1053: #define TL_GET_KEY
1054: #define TL_GET_PIXEL
1055: #define TL_RECTANGLE_FILLED
1056: #define TL_TEXT
1057: #define TL_PUT_VAL
1058: 
1059: //*********************//
1060: //** TIlib constants **//
1061: //*********************//
1062: 
1063: #define TL_PIXEL_ON 1
1064: #define TL_PIXEL_OFF    0
1065: #define TL_RECT_FILL_WHITE  0
1066: #define TL_RECT_FILL_BLACK  1
1067: #define TL_RECT_FILL_XOR    2
1068: #define TL_TEXT_NOTYPE  0
1069: #define TL_TEXT_TYPE    1
1070: #define TL_NEWX $ff
1071: #define TL_NEWY $fe
1072: #define TL_NEWXY    $fd
1073: #define TL_NEWL $fc
1074: #define TL_BRK  $fb
1075: 
1076: //**************************//
1077: //** Functions prototypes **//
1078: //**************************//
1079: 
1080: char __FASTCALL__ TL_random(unsigned char max);
1081: char __FASTCALL__ TL_delay(unsigned char delay);
1082: char TL_small_sprite(unsigned char x, unsigned char y, unsigned char height, unsigned char *sprite);
1083: char TL_large_sprite(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char *sprite);
1084: void TL_gbuf_to_lcd(void);
1085: char __FASTCALL__ TL_direct_input(unsigned char keygroup);
1086: void TL_get_key(void);
1087: char TL_get_pixel(unsigned char x, unsigned char y);
1088: char TL_rectangle_filled(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char color);
1089: char TL_text(unsigned char x, unsigned char y, unsigned char *text, unsigned char is_typed, unsigned char typing_speed);
1090: char TL_put_val(unsigned char x, unsigned char y, unsigned char val);
1091: [/code]
1092: [/box]