NLM_EXTERN size_t Nlm_stream2text(const Nlm_Char FAR PNTR str, size_t max_col, int PNTR dash) { const Nlm_Char FAR PNTR s; const Nlm_Char FAR PNTR sb; /* the nearest breakable position */ size_t n_lead = 0; size_t n_tail = 0; size_t len = Nlm_StringLen( str ); len = max_col < len ? max_col : len; *dash = 0; if (len == 0 || can_break(str[len-1], str[len])) return len; /* go to the beginning of the last completely fit word */ for (sb = &str[len-1]; sb != str && !IS_WHITESP(*sb) && !can_break(*sb, *(sb+1)); sb--) continue; while (sb != str && IS_WHITESP(*sb)) sb--; if (sb == str) { /* the first word is longer than "max_col" */ if (len > MAX_NO_DASH && IS_ALPHA(str[len-1]) && IS_ALPHA(str[len])) *dash = 1; /* recommend use dash in the place of last symbol */ return len; } /* decide of whether and how to break the last alphabet word */ /* count the lead and the tail of the last non-fit word */ for (s = &str[len]; *s != '\0' && IS_ALPHA(*s); s++, n_tail++) continue; for (s = &str[len-1]; IS_ALPHA(*s); s--, n_lead++) continue; ASSERT ( s > str ); /* try to "move" symbols from lead in the sake of tail */ while (n_lead > MIN_LEAD && n_tail < MIN_TAIL) { n_lead--; n_tail++; } if (n_lead < MIN_LEAD || n_tail < MIN_TAIL) { /* no luck this time -- move the whole non-fit word to the next line */ return (sb - str + 1); } else { *dash = 1; return (s - str + n_lead + 1); } }
HitResponse BonusBlock::collision(GameObject& other, const CollisionHit& hit_){ auto player = dynamic_cast<Player*> (&other); if (player) { if (player->does_buttjump) try_drop(player); } auto badguy = dynamic_cast<BadGuy*> (&other); if(badguy) { // hit contains no information for collisions with blocks. // Badguy's bottom has to be below the top of the block // SHIFT_DELTA is required to slide over one tile gaps. if( badguy->can_break() && ( badguy->get_bbox().get_bottom() > bbox.get_top() + SHIFT_DELTA ) ){ try_open(player); } } auto portable = dynamic_cast<Portable*> (&other); if(portable) { auto moving = dynamic_cast<MovingObject*> (&other); if(moving->get_bbox().get_top() > bbox.get_bottom() - SHIFT_DELTA) { try_open(player); } } return Block::collision(other, hit_); }