use rand::Rng;
use pancurses::Window;
use crate::message::{MessageQueue, ColorString, ColorChar};
pub struct Streak {
head_x: i32, head_y: i32, length: i32, inner_text: ColorString,
}
impl Streak {
pub fn new_with_queue(queue: &mut MessageQueue, head_x: i32, length: i32, screen_height: i32, max_padding: i32) -> Self {
let mut rng = rand::thread_rng();
let mut inner_text = ColorString::with_capacity(screen_height as usize); let first_msg_check = queue.pop();
if let None = first_msg_check {
for _ in 0..screen_height {
inner_text.push(ColorChar{data: ' ' as u32, attr: 0}); }
return Streak{head_x, head_y: 0, length, inner_text}; }
let first_msg = first_msg_check.unwrap();
{
let first_string: ColorString = first_msg.contents;
let mut start: i32 = rng.gen_range(0, first_string.len()+max_padding as usize) as i32 - first_string.len() as i32 + 1; if start > screen_height {
start = screen_height; }
if start > 0 {
for _ in 0..start {
inner_text.push(ColorChar{data: ' ' as u32, attr: 0}); }
}
for i in (
if start < 0 {
-start } else {
0
}
)..(screen_height.min(first_string.len() as i32)) {
inner_text.push(first_string[i as usize]);
if inner_text.len() as i32 >= screen_height {
return Streak{head_x, head_y: 0, length, inner_text}; }
}
}
loop {
let r: i32 = if max_padding > 0 {
rng.gen_range(1,max_padding)
} else {
0 };
if inner_text.len() as i32+r >= screen_height { for _ in 0..(screen_height as usize-inner_text.len()) {
inner_text.push(ColorChar{data: ' ' as u32, attr: 0}); }
break; } else { for _ in 0..r {
inner_text.push(ColorChar{data: ' ' as u32, attr: 0});
}
}
let next_msg_check = queue.pop();
if let None = next_msg_check {
for _ in inner_text.len() as i32..screen_height {
inner_text.push(ColorChar{data: ' ' as u32, attr: 0}); }
return Streak{head_x, head_y: 0, length, inner_text}; }
let next_msg = next_msg_check.unwrap();
{
let next_string: ColorString = next_msg.contents;
if inner_text.len()+next_string.len() >= screen_height as usize { for i in 0..(screen_height as usize-inner_text.len()) {
inner_text.push(next_string[i as usize]); }
break; } else {
for i in 0..next_string.len() {
inner_text.push(next_string[i as usize]); }
}
}
}
Streak{head_x, head_y: 0, length, inner_text}
}
pub fn render(&self, window: &Window) { for i in (self.head_y-self.length-1)..self.head_y {
if i >= 0 && i < window.get_max_y() {
window.attron(self.inner_text[i as usize].attr);
window.mvaddch(i,self.head_x,self.inner_text[i as usize].data);
window.attroff(self.inner_text[i as usize].attr);
}
}
}
pub fn derender(&self, window: &Window) { window.mvaddch(self.head_y-self.length-1, self.head_x, window.getbkgd());
}
pub fn advance(&mut self) {
self.head_y+=1;
}
pub fn finished(&self, screen_height: i32) -> bool { self.head_y-self.length >= screen_height
}
pub fn top_space(&self) -> i32 { self.head_y-self.length+1
}
}