comic/odin/src/core/script.odin
2026-05-22 03:51:50 +02:00

81 lines
2.2 KiB
Odin

package core
import "core:fmt"
script_is_valid_minimal :: proc(script: Comic_Script) -> bool {
if len(script.title) == 0 {
return false
}
if len(script.synopsis) == 0 {
return false
}
if len(script.pages) == 0 {
return false
}
return true
}
normalize_script :: proc(script: Comic_Script) -> Comic_Script {
normalized := script
if len(normalized.title) == 0 {
normalized.title = fmt.aprintf("Untitled Comic")
}
if len(normalized.synopsis) == 0 {
normalized.synopsis = fmt.aprintf("Generated comic synopsis")
}
for idx in 0..<len(normalized.characters) {
if len(normalized.characters[idx].id) == 0 {
normalized.characters[idx].id = fmt.aprintf("char_%03d", idx+1)
}
if len(normalized.characters[idx].name) == 0 {
normalized.characters[idx].name = fmt.aprintf("Character %d", idx+1)
}
if normalized.characters[idx].seed == 0 {
normalized.characters[idx].seed = derive_seed_from_string(normalized.characters[idx].name)
}
}
for page_idx in 0..<len(normalized.pages) {
if normalized.pages[page_idx].page_number <= 0 {
normalized.pages[page_idx].page_number = page_idx + 1
}
for panel_idx in 0..<len(normalized.pages[page_idx].panels) {
if len(normalized.pages[page_idx].panels[panel_idx].panel_id) == 0 {
normalized.pages[page_idx].panels[panel_idx].panel_id = fmt.aprintf("panel_%03d_%03d", page_idx+1, panel_idx+1)
}
if normalized.pages[page_idx].panels[panel_idx].panel_number <= 0 {
normalized.pages[page_idx].panels[panel_idx].panel_number = panel_idx + 1
}
}
}
return normalized
}
count_character_appearances :: proc(script: ^Comic_Script) {
for i in 0..<len(script.characters) {
char_id := script.characters[i].id
count := 0
first_panel := ""
for page_idx in 0..<len(script.pages) {
for panel_idx in 0..<len(script.pages[page_idx].panels) {
panel := &script.pages[page_idx].panels[panel_idx]
for cid in panel.characters_present {
if cid == char_id {
count += 1
if len(first_panel) == 0 {
first_panel = panel.panel_id
}
break
}
}
}
}
script.characters[i].appearance_count = count
script.characters[i].first_appearance_panel = first_panel
}
}