/** * Draws the crucial warning messages on screen. * Requires the screen to be locked before. */ TbBool draw_onscreen_direct_messages(void) { unsigned int msg_pos; SYNCDBG(5,"Starting"); // Display in-game message for debug purposes if ((onscreen_msg_turns > 0) || erstat_check()) { if ( LbScreenIsLocked() ) LbTextDraw(260*units_per_pixel/16, 0*units_per_pixel/16, onscreen_msg_text); onscreen_msg_turns--; } msg_pos = 200; if ((game.system_flags & GSF_NetGameNoSync) != 0) { ERRORLOG("OUT OF SYNC (GameTurn %7d)", game.play_gameturn); if ( LbScreenIsLocked() ) LbTextDraw(260*units_per_pixel/16, msg_pos*units_per_pixel/16, "OUT OF SYNC"); msg_pos += 20; } if ((game.system_flags & GSF_NetSeedNoSync) != 0) { ERRORLOG("SEED OUT OF SYNC (GameTurn %7d)", game.play_gameturn); if ( LbScreenIsLocked() ) LbTextDraw(260*units_per_pixel/16, msg_pos*units_per_pixel/16, "SEED OUT OF SYNC"); msg_pos += 20; } SYNCDBG(18,"Finished"); return true; }
void draw_overlay_compass(long base_x, long base_y) { unsigned short flg_mem; flg_mem = lbDisplay.DrawFlags; LbTextSetFont(winfont); lbDisplay.DrawFlags |= Lb_SPRITE_TRANSPAR4; LbTextSetWindow(0, 0, MyScreenWidth, MyScreenHeight); int units_per_px; units_per_px = (16*status_panel_width + 70) / 140; int tx_units_per_px; tx_units_per_px = (22 * units_per_px) / LbTextLineHeight(); int w,h; w = (LbSprFontCharWidth(lbFontPtr,'/')*tx_units_per_px/16) / 2; h = (LbSprFontCharHeight(lbFontPtr,'/')*tx_units_per_px/16) / 2 + 2*units_per_px/16; struct PlayerInfo *player; player = get_my_player(); struct Camera *cam; cam = player->acamera; int center_x, center_y; int shift_x, shift_y; center_x = base_x*units_per_px/16 + PANNEL_MAP_RADIUS*units_per_px/16; center_y = base_y*units_per_px/16 + PANNEL_MAP_RADIUS*units_per_px/16; shift_x = ((-(PANNEL_MAP_RADIUS*7/8)*units_per_px/16) * LbSinL(cam->orient_a)) >> LbFPMath_TrigmBits; shift_y = ((-(PANNEL_MAP_RADIUS*7/8)*units_per_px/16) * LbCosL(cam->orient_a)) >> LbFPMath_TrigmBits; if (LbScreenIsLocked()) { LbTextDrawResized(center_x + shift_x - w, center_y + shift_y - h, tx_units_per_px, gui_strings[877]); } shift_x = (( (PANNEL_MAP_RADIUS*7/8)*units_per_px/16) * LbSinL(cam->orient_a)) >> LbFPMath_TrigmBits; shift_y = (( (PANNEL_MAP_RADIUS*7/8)*units_per_px/16) * LbCosL(cam->orient_a)) >> LbFPMath_TrigmBits; if (LbScreenIsLocked()) { LbTextDrawResized(center_x + shift_x - w, center_y + shift_y - h, tx_units_per_px, gui_strings[879]); } shift_x = (( (PANNEL_MAP_RADIUS*7/8)*units_per_px/16) * LbCosL(cam->orient_a)) >> LbFPMath_TrigmBits; shift_y = ((-(PANNEL_MAP_RADIUS*7/8)*units_per_px/16) * LbSinL(cam->orient_a)) >> LbFPMath_TrigmBits; if (LbScreenIsLocked()) { LbTextDrawResized(center_x + shift_x - w, center_y + shift_y - h, tx_units_per_px, gui_strings[878]); } shift_x = ((-(PANNEL_MAP_RADIUS*7/8)*units_per_px/16) * LbCosL(cam->orient_a)) >> LbFPMath_TrigmBits; shift_y = (( (PANNEL_MAP_RADIUS*7/8)*units_per_px/16) * LbSinL(cam->orient_a)) >> LbFPMath_TrigmBits; if (LbScreenIsLocked()) { LbTextDrawResized(center_x + shift_x - w, center_y + shift_y - h, tx_units_per_px, gui_strings[880]); } lbDisplay.DrawFlags = flg_mem; }
void draw_overlay_compass(long base_x, long base_y) { unsigned short flg_mem; flg_mem = lbDisplay.DrawFlags; LbTextSetFont(winfont); lbDisplay.DrawFlags |= Lb_SPRITE_TRANSPAR4; LbTextSetWindow(0, 0, MyScreenWidth, MyScreenHeight); int units_per_px; units_per_px = (16*status_panel_width + 140/2) / 140; int tx_units_per_px; tx_units_per_px = (22 * units_per_px) / LbTextLineHeight(); int w,h; w = (LbSprFontCharWidth(lbFontPtr,'/')*tx_units_per_px/16) / 2; h = (LbSprFontCharHeight(lbFontPtr,'/')*tx_units_per_px/16) / 2 + 2*units_per_px/16; struct PlayerInfo *player; player = get_my_player(); const struct Camera *cam; cam = player->acamera; int center_x, center_y; int shift_x, shift_y; center_x = base_x*units_per_px/16 + MapDiagonalLength/2; center_y = base_y*units_per_px/16 + MapDiagonalLength/2; shift_x = (-(MapDiagonalLength*7/16) * LbSinL(cam->orient_a)) >> LbFPMath_TrigmBits; shift_y = (-(MapDiagonalLength*7/16) * LbCosL(cam->orient_a)) >> LbFPMath_TrigmBits; if (LbScreenIsLocked()) { LbTextDrawResized(center_x + shift_x - w, center_y + shift_y - h, tx_units_per_px, get_string(GUIStr_MapN)); } shift_x = ( (MapDiagonalLength*7/16) * LbSinL(cam->orient_a)) >> LbFPMath_TrigmBits; shift_y = ( (MapDiagonalLength*7/16) * LbCosL(cam->orient_a)) >> LbFPMath_TrigmBits; if (LbScreenIsLocked()) { LbTextDrawResized(center_x + shift_x - w, center_y + shift_y - h, tx_units_per_px, get_string(GUIStr_MapS)); } shift_x = ( (MapDiagonalLength*7/16) * LbCosL(cam->orient_a)) >> LbFPMath_TrigmBits; shift_y = (-(MapDiagonalLength*7/16) * LbSinL(cam->orient_a)) >> LbFPMath_TrigmBits; if (LbScreenIsLocked()) { LbTextDrawResized(center_x + shift_x - w, center_y + shift_y - h, tx_units_per_px, get_string(GUIStr_MapE)); } shift_x = (-(MapDiagonalLength*7/16) * LbCosL(cam->orient_a)) >> LbFPMath_TrigmBits; shift_y = ( (MapDiagonalLength*7/16) * LbSinL(cam->orient_a)) >> LbFPMath_TrigmBits; if (LbScreenIsLocked()) { LbTextDrawResized(center_x + shift_x - w, center_y + shift_y - h, tx_units_per_px, get_string(GUIStr_MapW)); } lbDisplay.DrawFlags = flg_mem; }
TbBool movie_record_frame(void) { short lock_mem; short result; lock_mem = LbScreenIsLocked(); if (!lock_mem) { if (LbScreenLock() != Lb_SUCCESS) return false; } LbPaletteGet(cap_palette); result=anim_record_frame(lbDisplay.WScreen, cap_palette); if (!lock_mem) LbScreenUnlock(); return result; }
/** * Displays easter egg messages on screen. */ void draw_eastegg(void) { char *text; static long px[2]={0,0},py[2]={0,0}; static long vx[2]={0,0},vy[2]={0,0}; long i,k; SYNCDBG(5,"Starting"); LbTextSetWindow(0, 0, MyScreenWidth, MyScreenHeight); if (eastegg_skeksis_cntr >= eastegg_skeksis_codes.length) { unsigned char pos; eastegg_skeksis_cntr++; LbTextSetFont(winfont); text=buf_sprintf("Dene says a big 'Hello' to Goth Buns, Tarts and Barbies"); lbDisplay.DrawFlags = Lb_TEXT_ONE_COLOR; for (i=0; i<30; i+=2) { pos = game.play_gameturn - i; lbDisplay.DrawColour = pos; LbTextDraw((LbCosL(16*(long)pos) / 512 + 120) / pixel_size, (LbSinL(32*(long)pos) / 512 + 200) / pixel_size, text); } set_flag_word(&lbDisplay.DrawFlags,Lb_TEXT_ONE_COLOR,false); pos=game.play_gameturn; LbTextDraw((LbCosL(16*(long)pos) / 512 + 120) / pixel_size, (LbSinL(32*(long)pos) / 512 + 200) / pixel_size, text); if (eastegg_skeksis_cntr >= 255) eastegg_skeksis_cntr = 0; } if (game.eastegg01_cntr >= eastegg_feckoff_codes.length) { LbTextSetWindow(0/pixel_size, 0/pixel_size, MyScreenWidth/pixel_size, MyScreenHeight/pixel_size); lbDisplay.DrawFlags &= ~Lb_TEXT_ONE_COLOR; LbTextSetFont(winfont); i = 0; text = buf_sprintf("Simon says Hi to everyone he knows..."); px[i] += vx[i]; if (px[i] < 0) { px[i] = 0; vx[i] = -vx[i]; } py[i] += vy[i]; if (py[i] < 0) { py[i] = 0; vy[i] = -vy[i]; } k = pixel_size*LbTextStringWidth(text); if (px[i]+k >= MyScreenWidth) { vx[i] = -vx[i]; px[i] = MyScreenWidth-k-1; } k = pixel_size*LbTextStringHeight(text); if (py[i]+k >= MyScreenHeight) { vy[i] = -vy[i]; py[i] = MyScreenHeight-k-1; } if (LbScreenIsLocked()) { LbTextDraw(px[i]/pixel_size, py[i]/pixel_size, text); } play_non_3d_sample_no_overlap(90); } if ((game.flags_font & FFlg_AlexCheat) == 0) return; if (game.eastegg02_cntr >= eastegg_jlw_codes.length) { LbTextSetWindow(0/pixel_size, 0/pixel_size, MyScreenWidth/pixel_size, MyScreenHeight/pixel_size); lbDisplay.DrawFlags &= ~Lb_TEXT_ONE_COLOR; LbTextSetFont(winfont); i = 1; text = buf_sprintf("Alex, hopefully lying on a beach with Jo, says Hi"); px[i] += vx[i]; if (px[i] < 0) { px[i] = 0; vx[i] = -vx[i]; } py[i] += vy[i]; if (py[i] < 0) { py[i] = 0; vy[i] = -vy[i]; } k = pixel_size * LbTextStringWidth(text); if (px[i]+k >= MyScreenWidth) { vx[i] = -vx[i]; px[i] = MyScreenWidth-k-1; } k = pixel_size * LbTextStringHeight(text); if (py[i]+k >= MyScreenHeight) { vy[i] = -vy[i]; py[i] = MyScreenHeight-k-1; } if (LbScreenIsLocked()) LbTextDraw(px[i]/pixel_size, py[i]/pixel_size, text); play_non_3d_sample_no_overlap(90); } }
void gui_draw_box(struct GuiBox *gbox) { SYNCDBG(6,"Drawing box, first optn \"%s\"",gbox->optn_list->label); struct GuiBox *gbox_over; struct GuiBoxOption *goptn_over; struct GuiBoxOption *goptn; long lnheight; long mouse_x,mouse_y; long pos_x,pos_y; LbTextSetWindow(0, 0, MyScreenWidth/pixel_size, MyScreenHeight/pixel_size); mouse_x = GetMouseX(); mouse_y = GetMouseY(); goptn_over = NULL; gbox_over = gui_get_box_point_over(mouse_x, mouse_y); if (gbox_over != NULL) { goptn_over = gui_get_box_option_point_over(gbox_over, mouse_x, mouse_y); } LbTextSetFont(font_sprites); lnheight = pixel_size * LbTextLineHeight() + 2; pos_y = gbox->pos_y + 8; pos_x = gbox->pos_x + 8; if (gbox != gui_get_highest_priority_box()) { lbDisplay.DrawFlags |= Lb_SPRITE_TRANSPAR4; LbDrawBox(gbox->pos_x/pixel_size, gbox->pos_y/pixel_size, gbox->width/pixel_size, gbox->height/pixel_size, colours[6][0][0]); if (lbDisplay.DrawFlags & Lb_SPRITE_OUTLINE) { LbDrawBox(gbox->pos_x/pixel_size, gbox->pos_y/pixel_size, gbox->width/pixel_size, gbox->height/pixel_size, colours[0][0][0]); } else { lbDisplay.DrawFlags ^= Lb_SPRITE_OUTLINE; LbDrawBox(gbox->pos_x/pixel_size, gbox->pos_y/pixel_size, gbox->width/pixel_size, gbox->height/pixel_size, colours[0][0][0]); lbDisplay.DrawFlags ^= Lb_SPRITE_OUTLINE; } lbDisplay.DrawFlags ^= Lb_SPRITE_TRANSPAR4; lbDisplay.DrawColour = colours[3][3][3]; goptn = gbox->optn_list; while (goptn->label[0] != '!') { if (goptn->active_cb != NULL) goptn->field_26 = (goptn->active_cb)(gbox, goptn, &goptn->field_D); else goptn->field_26 = 1; if (!goptn->field_26) lbDisplay.DrawColour = colours[0][0][0]; else lbDisplay.DrawColour = colours[3][3][3]; if (LbScreenIsLocked()) { LbTextDraw(pos_x/pixel_size, pos_y/pixel_size, goptn->label); } goptn++; pos_y += lnheight; } } else { lbDisplay.DrawFlags |= Lb_SPRITE_TRANSPAR4; LbDrawBox(gbox->pos_x/pixel_size, gbox->pos_y/pixel_size, gbox->width/pixel_size, gbox->height/pixel_size, colours[12][0][0]); if (lbDisplay.DrawFlags & Lb_SPRITE_OUTLINE) { LbDrawBox(gbox->pos_x/pixel_size, gbox->pos_y/pixel_size, gbox->width/pixel_size, gbox->height/pixel_size, colours[2][0][0]); } else { lbDisplay.DrawFlags ^= Lb_SPRITE_OUTLINE; LbDrawBox(gbox->pos_x/pixel_size, gbox->pos_y/pixel_size, gbox->width/pixel_size, gbox->height/pixel_size, colours[2][0][0]); lbDisplay.DrawFlags ^= Lb_SPRITE_OUTLINE; } lbDisplay.DrawFlags ^= Lb_SPRITE_TRANSPAR4; goptn = gbox->optn_list; while (goptn->label[0] != '!') { if (goptn->active_cb != NULL) goptn->field_26 = (goptn->active_cb)(gbox, goptn, &goptn->field_D); else goptn->field_26 = 1; if (!goptn->field_26) lbDisplay.DrawColour = colours[0][0][0]; else if ( ((gbox == gbox_over) && (goptn == goptn_over) && (gbox != dragging_box.gbox)) || ((gbox != NULL) && (goptn->active != 0)) ) lbDisplay.DrawColour = colours[15][15][15]; else lbDisplay.DrawColour = colours[9][9][9]; if (LbScreenIsLocked()) { LbTextDraw(pos_x/pixel_size, pos_y/pixel_size, goptn->label); } goptn++; pos_y += lnheight; } } }
long prepare_hsi_screenshot(unsigned char *buf,unsigned char *palette) { long pos,i; int w,h; short lock_mem; pos=0; w=MyScreenWidth/pixel_size; h=MyScreenHeight/pixel_size; write_int8_buf(buf+pos,'m'); pos++; write_int8_buf(buf+pos,'h'); pos++; write_int8_buf(buf+pos,'w'); pos++; write_int8_buf(buf+pos,'a'); pos++; write_int8_buf(buf+pos,'n'); pos++; write_int8_buf(buf+pos,'h'); pos++; // pos=6 write_int16_be_buf(buf+pos, 4); pos+=2; write_int16_be_buf(buf+pos, w); pos+=2; write_int16_be_buf(buf+pos, h); pos+=2; write_int16_be_buf(buf+pos, 256); pos+=2; // pos=14 write_int16_be_buf(buf+pos, 256); pos+=2; write_int16_be_buf(buf+pos, 256); pos+=2; write_int16_be_buf(buf+pos, 256); pos+=2; // pos=20 for (i=0; i<6; i++) { write_int16_be_buf(buf+pos, 0); pos+=2; } for (i=0; i<768; i+=3) { write_int8_buf(buf+pos,4*palette[i+0]); pos++; write_int8_buf(buf+pos,4*palette[i+1]); pos++; write_int8_buf(buf+pos,4*palette[i+2]); pos++; } lock_mem = LbScreenIsLocked(); if (!lock_mem) { if (LbScreenLock() != Lb_SUCCESS) { ERRORLOG("Can't lock canvas"); LbMemoryFree(buf); return 0; } } for (i=0; i<h; i++) { memcpy(buf+pos, lbDisplay.WScreen + lbDisplay.GraphicsScreenWidth*i, w); pos += w; } if (!lock_mem) LbScreenUnlock(); return pos; }
long prepare_bmp_screenshot(unsigned char *buf,unsigned char *palette) { long pos,i,j; int width,height; short lock_mem; long data_len,pal_len; pos=0; width=MyScreenWidth/pixel_size; height=MyScreenHeight/pixel_size; write_int8_buf(buf+pos,'B'); pos++; write_int8_buf(buf+pos,'M'); pos++; int padding_size=4-(width&3); data_len = (width+padding_size)*height; pal_len = 256*4; write_int32_le_buf(buf+pos, data_len+pal_len+0x36); pos+=4; write_int32_le_buf(buf+pos, 0); pos+=4; write_int32_le_buf(buf+pos, pal_len+0x36); pos+=4; write_int32_le_buf(buf+pos, 40); pos+=4; write_int32_le_buf(buf+pos, width); pos+=4; write_int32_le_buf(buf+pos, height); pos+=4; write_int16_le_buf(buf+pos, 1); pos+=2; write_int16_le_buf(buf+pos, 8); pos+=2; write_int32_le_buf(buf+pos, 0); pos+=4; write_int32_le_buf(buf+pos, 0); pos+=4; write_int32_le_buf(buf+pos, 0); pos+=4; write_int32_le_buf(buf+pos, 0); pos+=4; write_int32_le_buf(buf+pos, 0); pos+=4; write_int32_le_buf(buf+pos, 0); pos+=4; for (i=0; i<768; i+=3) { unsigned int cval; cval=4*(unsigned int)palette[i+2]; if (cval>255) cval=255; write_int8_buf(buf+pos,cval); pos++; cval=4*(unsigned int)palette[i+1]; if (cval>255) cval=255; write_int8_buf(buf+pos,cval); pos++; cval=4*(unsigned int)palette[i+0]; if (cval>255) cval=255; write_int8_buf(buf+pos,cval); pos++; write_int8_buf(buf+pos,0); pos++; } lock_mem = LbScreenIsLocked(); if (!lock_mem) { if (LbScreenLock() != Lb_SUCCESS) { ERRORLOG("Can't lock canvas"); LbMemoryFree(buf); return 0; } } for (i=0; i<height; i++) { memcpy(buf+pos, lbDisplay.WScreen + lbDisplay.GraphicsScreenWidth*(height-i-1), width); pos += width; if ((padding_size&3) > 0) for (j=0; j < padding_size; j++) { write_int8_buf(buf+pos,0); pos++; } } if (!lock_mem) LbScreenUnlock(); return pos; }