1+ import pygame as pg
2+ from core .visuals .ui import *
3+ from ursina import Entity
4+
5+ class Dialogue :
6+ '''Values:
7+ is_skippable: bool
8+ maxtime: int
9+ text: str
10+
11+ Errors:
12+ ...
13+ '''
14+ default_values = {
15+ 'maxshowtime' : 400 , 'is_skippable' : True , 'text' : "Test"
16+ }
17+ def __init__ (self , game , dialoguemanager , ** kwargs ):
18+ self .game = game
19+ self .dialogmanage = dialoguemanager
20+ self .text = "Test\n Multiline"
21+ self .is_skippable = True
22+ self .on_scr_time = 0
23+ self .maxtime = 400
24+ for key , value in kwargs .items ():
25+ setattr (self , key , value )
26+
27+ def todict (self ): # method for saving an enemy object to a stage file
28+ return {"game" : None ,
29+ "text" : self .text ,
30+ "is_skippable" : self .is_skippable ,
31+ "maxshowtime" : self .maxtime
32+ }
33+
34+ @classmethod
35+ def fromdict (cls , asset , game = None , dialogmanager = None ): # method for loading an enemy object from a stage file
36+ return cls (game , dialogmanager , text = asset ["text" ], is_skippable = asset ["is_skippable" ], maxtime = asset ["maxshowtime" ])
37+
38+ def update (self ):
39+ self .on_scr_time += 1
40+ if self .on_scr_time >= self .maxtime :
41+ return True
42+ else :
43+ return False
44+
45+ def skip (self ):
46+ self .on_scr_time = self .maxtime
47+
48+ class DialogueCollection :
49+ def __init__ (self , game , dialoguemanager , dialogue = []):
50+ self .game = game
51+ self .active = True
52+ self .dialog_index = 0
53+ self .dialogmanager = dialoguemanager
54+ self .dialogue = dialogue
55+
56+ def todict (self ): # method for saving an enemy object to a stage file
57+ return {"game" : None ,
58+ "dialogue" : self .dialogue
59+ }
60+
61+ @classmethod
62+ def fromdict (cls , asset , game = None , dialogmanager = None ): # method for loading an enemy object from a stage file
63+ return cls (game , dialogmanager , dialogue = asset ["dialogue" ])
64+
65+ def update (self ):
66+ if self .active == False :
67+ for dialog in self .dialogue :
68+ dialog .on_scr_time = 0
69+ if len (self .dialogue ) >= 1 :
70+ try :
71+ line_height = self .dialogmanager .font .get_linesize ()
72+ lines = self .dialogue [self .dialog_index ].text .split ('\n ' )
73+ if self .dialogue [self .dialog_index ].update () == True :
74+ self .dialog_index += 1
75+ for line in lines :
76+ text_surface = self .dialogmanager .font .render (line , True , (255 , 255 , 255 ))
77+ self .game .fight_area .blit (text_surface , (self .dialogmanager .dialoguerect .left , self .dialogmanager .dialoguerect .top + self .dialogmanager .y_offset ))
78+ self .dialogmanager .y_offset += line_height
79+ self .dialogmanager .y_offset = self .dialogmanager .default_offset
80+ except IndexError :
81+ self .active = False
82+
83+ class DialogueSystem :
84+ def __init__ (self , game ):
85+ self .game = game
86+ self .active = False
87+ self .active_collection = 0
88+ self .dialogue_collection_dict = {0 : DialogueCollection (self .game , self , [Dialogue (self .game , self , maxshowtime = 400 , is_skippable = True , text = "Test\n Multiline" ), Dialogue (self .game , self , maxshowtime = 400 , is_skippable = True , text = "Test NAH" )])}
89+ self .skip_dialogue = False
90+ self .dialoguerect = pg .Rect (16 , 300 , 354 , 130 )
91+ self .font = pg .font .SysFont ('Comic Sans MS' , 18 )
92+
93+ self .default_offset = 0
94+ self .y_offset = 0
95+
96+ def update (self ):
97+ if self .active :
98+ if len (self .dialogue_collection_dict ) >= 1 and self .dialogue_collection_dict [self .active_collection ].active == True :
99+ pg .draw .rect (self .game .fight_area , (40 , 40 , 40 , 150 ), self .dialoguerect )
100+ self .dialogue_collection_dict [self .active_collection ].update ()
101+
102+ def skip (self ):
103+ if len (self .dialogue_collection_dict ) >= 1 and self .dialogue_collection_dict [self .active_collection ].active == True :
104+ self .dialogue_collection_dict [self .active_collection ].dialogue [self .dialogue_collection_dict [self .active_collection ].dialog_index ].skip ()
0 commit comments