WTS/game/scripts/events/event_class.rpy

182 lines
6.5 KiB
Plaintext

init python:
class event_class(object):
"""
Handles and tracks event progression.
Event labels ending with "_intro" are treated as one-time events. Otherwise the event can be repeated.
`tier` (int): The current tier number, which determines the set of events to run.
`counter` (int): The number of successfully completed events.
`points` (int): The number of successfully completed events in the current tier.
"""
def __init__(self, **kwargs):
self.title = ""
self.hint = ""
self.counter = 0
self.start_label = ""
self.start_tier = 1
self.inProgress = False
self.events = []
self.icons = []
self.iconset = []
self.__dict__.update(kwargs)
# _tier is relative to start_tier
self._tier = 0
self._points = 0
if not self.events:
raise Exception('Events: "events" list was not defined for "{}".'.format(self.title))
self._max_tiers = len(self.events)
if not self.iconset:
raise Exception('Events: "iconset" list was not defined for "{}". You need to add at least one set of icons.'.format(self.title))
elif len(self.iconset) < self._max_tiers:
for i in range(self._max_tiers-len(self.iconset)):
self.iconset.append([self.iconset[0][0], self.iconset[0][1]])
if self.icons and len(self.icons) < self._max_tiers:
raise Exception('Events: "icons" list does not match the number of events for "{}".'.format(self.title))
for i in range(self._max_tiers):
for j in range(len(self.events[i])):
self.events[i][j] += [False]
def start(self):
self.counter += 1
for i in range(len(self.events[self._tier])):
if self.events[self._tier][i][1] == False:
self.events[self._tier][i][1] = True
self.points += 1
return renpy.jump(self.events[self._tier][i][0])
self.start_random()
def start_advance(self):
self.counter += 1
for i in range(self._max_tiers):
for j in range(len(self.events[i])):
if self.events[i][j][1] == False:
self.events[i][j][1] = True
self._tier = i
self.points += 1
return renpy.jump(self.events[i][j][0])
self.start_random()
def start_random(self):
events_filtered = [x for x in self.events[self._tier] if '_intro' not in x[0]]
random_event = events_filtered[random.randint(0, len(events_filtered)-1)][0]
return renpy.jump(random_event)
def change_icon(self, a="heart_half", b="heart_red"):
for icon in self.iconset:
if icon[1] == a:
icon[1] = b
def get_menu_item(self, disabled=False):
menu_text = ""
if self.hint:
menu_text += "{{image={}_check_True}}".format(gui.theme())
if self.title:
menu_text += "\"{}\"".format(self.title)
imagepath = "interface/icons/small/"
icon = None
if len(self.icons) > 0 and self.icons[self._tier]:
icon = imagepath + self.icons[self._tier] + ".webp"
progress = []
for i, ev in enumerate(self.events[self._tier]):
is_complete = ev[1]
if is_complete:
if self.iconset[self._tier][1] == "heart_half":
if i == len(self.events[self._tier])-1:
progress.append(imagepath + self.iconset[self._tier][1] + ".webp")
else:
progress.append(imagepath + "heart_red.webp")
else:
progress.append(imagepath + self.iconset[self._tier][1] + ".webp")
else:
progress.append(imagepath + self.iconset[self._tier][0] + ".webp")
if disabled:
return gui.menu_item(menu_text, "block", icon=icon, progress=progress, style="disabled")
else:
return gui.menu_item(menu_text, self.start_label, icon=icon, progress=progress)
def fail(self):
self.counter = max(0, self.counter-1)
self.points -= 1
self.events[self._tier][self._points][1] = False
return
def fail_intentional(self):
self.counter = max(0, self.counter-1)
self.points -= 1
return
# Reset the event completely
def reset(self):
for i in range(self._max_tiers):
for j in range(len(self.events[i])):
self.events[i][j][1] = False
self._tier = 0
self._points = 0
self.counter = 0
self.inProgress = False
def status(self, value):
status_list = []
for item in self.events[value-1]:
status_list += [item[1]]
return status_list
def is_complete(self, ignore_in_progress=False):
is_last_tier = (self._tier == self._max_tiers - 1)
return is_last_tier and self.is_tier_complete(ignore_in_progress=ignore_in_progress)
def is_tier_complete(self, ignore_in_progress=False):
event_count = len(self.events[self._tier])
return self.points == event_count and (not self.inProgress or ignore_in_progress)
def is_event_complete(self, tier, event):
relative_tier = tier - self.start_tier
try:
return bool(self.events[relative_tier][event-1][1])
except IndexError:
return False
@property
def points(self):
return self._points
@points.setter
def points(self, value):
self._points = max(0, min(value, len(self.events[self._tier])))
@property
def tier(self):
return self._tier + self.start_tier
@tier.setter
def tier(self, value):
relative_tier = max(0, min(value - self.start_tier, self._max_tiers - 1))
if relative_tier != self._tier:
# Change tier and reset progress
self._points = 0
self._tier = relative_tier