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]