870 lines
33 KiB
Plaintext
870 lines
33 KiB
Plaintext
# Character names
|
|
|
|
#character colors and names for the text box
|
|
define base = Character(ctc="ctc_end_marker", ctc_pause="ctc_mid_marker", ctc_timedpause=Null(), ctc_position="nestled") #imagine having to tell your users they need to interact with the video game
|
|
define narrator = Character(kind=base)
|
|
define narrator_old = Character()
|
|
define unknown = Character('???', base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')]) # Grey
|
|
define I = Character(_('Inco'), base, color="#dbe0ff", who_outlines=[(gui.name_text_thickness, '#0e0841')]) # Navy blue
|
|
define O = Character(_('Olivia'), base, color="#73fdb1", who_outlines=[(gui.name_text_thickness, '#03200c')])
|
|
define B = Character(_('Ben'), base, color="#9aceff", who_outlines=[(gui.name_text_thickness, '#0b0d22')])
|
|
define Scal = Character (_('Scaler'), base, color="#ffd9a8", who_outlines=[(gui.name_text_thickness, '#200505')]) # Bright fuckin' yellow
|
|
define Proc = Character (_('Prockling'), base, color="#ffeaf2", who_outlines=[(gui.name_text_thickness, '#4e024a')])
|
|
define Coach = Character(_('Coach'), base, color="#ffa494", who_outlines=[(gui.name_text_thickness, '#350404')])
|
|
define D = Character(_('Damien'), base, color="#fdddd4", who_outlines=[(gui.name_text_thickness, '#2c0e03')]) # Some kinda pastel velvet?
|
|
define L = Character(_('Liz'), base, color="#faeeca", who_outlines=[(gui.name_text_thickness, '#032449')]) # Some kinda pastel velvet?
|
|
define Iad = Character(_('Iadakan'), base, color="#fff8e6", who_outlines=[(gui.name_text_thickness, '#272b09')])
|
|
define Mia = Character(_('Mia'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#8a0e0e')])
|
|
define Lu = Character(_('Lunara'), base, color="#effdff", who_outlines=[(gui.name_text_thickness, '#082b30')])
|
|
define K = Character(_('Kiara'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')]) # Grey
|
|
define Fe = Character(_('Mr. Ferris'), base, color="#b7abf8", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Ra = Character(_('Randy'), base, color="#ec738d", who_outlines=[(gui.name_text_thickness, '#220a05')])
|
|
define Sp = Character(_('Sophia'), base, color="#d3e6ff", who_outlines=[(gui.name_text_thickness, '#0b1431')])
|
|
define Vi = Character(_('Vinny'), base, color="#fff3b0", who_outlines=[(gui.name_text_thickness, '#311c04')])
|
|
define So = Character(_('Solly'), base, color="#ffd4cc", who_outlines=[(gui.name_text_thickness, '#350404')])
|
|
define Bu = Character(_('Buster'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Grm = Character(_('Groom'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Janitor = Character(_('Janitor'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define MallCop = Character(_('Mall Cop'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Dad = Character(_('Dad'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Driver = Character(_('Driver'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Nurse = Character(_('Nurse'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Waitress = Character(_('Waitress'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Chef = Character(_('Chef'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Miquella = Character(_('Miquella'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Alena = Character(_('Alena'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Ted = Character(_('Ted'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Journo = Character(_('Journo'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Ale = Character(_('Alejandro'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')]) # Grey
|
|
define Miq = Character(_('Miquella'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')]) # Grey
|
|
|
|
|
|
|
|
define InDa = Character('{image=DamText} & {image=InText}', base, color = "#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define MiOl = Character('{image=MiaText} & {image=OlText}', base, color = "#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define OlInc = Character('{image=OlText} & {image=InText}', base, color = "#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define BInco = Character('{image=BenText} & {image=InText}', base, color = "#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
|
|
define JK = Character(_('Jurasskick'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define OO = Character(_('Funny Gator Girl on Wheels'), color="#001aff", who_outlines=[(0, '#03200c')])
|
|
define Toy = Character(_('Toy'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Grill = Character(_('Grill'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Everyone = Character(_('Everyone'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')]) # Grey
|
|
define Teacher = Character(_('Teacher'), base, color="#fff8e6", who_outlines=[(gui.name_text_thickness, '#272b09')]) # Grey
|
|
define Phone = Character(_('Phone'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Speakers = Character(_('Speakers'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
define Crowd = Character(_('Crowd'), base, color="#ffffff", who_outlines=[(gui.name_text_thickness, '#000000')])
|
|
|
|
|
|
# Text displayables to show the individual color and outlines in the dual character textboxes
|
|
image InText = Text(_("Inco"), color="#dbe0ff", outlines=[(gui.name_text_thickness, '#0e0841')])
|
|
image MiaText = Text(_("Mia"), color="#ffffff", outlines=[(gui.name_text_thickness, '#8a0e0e')])
|
|
image OlText = Text(_("Olivia"), color="#73fdb1", outlines=[(gui.name_text_thickness, '#03200c')])
|
|
image DamText = Text(_("Damien"), color="#fdddd4", outlines=[(gui.name_text_thickness, '#2c0e03')])
|
|
image BenText = Text(_("Ben"), color="#9aceff", outlines=[(gui.name_text_thickness, '#0b0d22')])
|
|
|
|
|
|
# Particle effects
|
|
|
|
image spr_particle_darker:
|
|
alpha 0.2
|
|
"spr_particle"
|
|
image spr_particle_dark:
|
|
alpha 0.5
|
|
"spr_particle"
|
|
image vfx_embereffect_darker_instant = AlphaMask(Fixed(SnowBlossom("spr_particle_darker", 50, xspeed=(-20, 20), yspeed=(-100, -50), start=1, fast=True)), "spr_creditsimage_gradient")
|
|
image vfx_embereffect_dark_instant = AlphaMask(Fixed(SnowBlossom("spr_particle_dark", 50, xspeed=(-35, 35), yspeed=(-200, -100), start=1, fast=True)), "spr_creditsimage_gradient")
|
|
image vfx_embereffect_instant = AlphaMask(Fixed(SnowBlossom("spr_particle", 50, xspeed=(-50, 50), yspeed=(-300, -150), start=1, fast=True)), "spr_creditsimage_gradient")
|
|
|
|
image vfx_embereffect_darker = AlphaMask(Fixed(SnowBlossom("spr_particle_darker", 50, xspeed=(-20, 20), yspeed=(-100, -50), start=1)), "spr_creditsimage_gradient")
|
|
image vfx_embereffect_dark = AlphaMask(Fixed(SnowBlossom("spr_particle_dark", 50, xspeed=(-35, 35), yspeed=(-200, -100), start=1)), "spr_creditsimage_gradient")
|
|
image vfx_embereffect = AlphaMask(Fixed(SnowBlossom("spr_particle", 50, xspeed=(-50, 50), yspeed=(-300, -150), start=1)), "spr_creditsimage_gradient")
|
|
|
|
|
|
|
|
|
|
# Matrix defines
|
|
|
|
# This color is #586C81 applied as multiply blending, same as the darkened background.
|
|
define elevator_multiply = Matrix([1.0 * 0.34509803921568627, 0.0, 0.0, 0.0,
|
|
0.0, 1.0 * 0.42352941176470588, 0.0, 0.0,
|
|
0.0, 0.0, 1.0 * 0.50588235294117647, 0.0,
|
|
0.0, 0.0, 0.0, 1.0, ])
|
|
|
|
|
|
|
|
|
|
#Helper functions
|
|
|
|
init python:
|
|
|
|
# Shows two lines of dialogue at the same time, spoken by 'speaker'
|
|
# Speaker: Character definiton, Line_1: Line of dialogue of the top, Line_2: Line of dialogue of the bottom
|
|
def sim_text(speaker,line_1,line_2):
|
|
strings = []
|
|
if not config.skipping:
|
|
for i in range(max(len(line_1),len(line_2))):
|
|
char_1 = min(i, len(line_1))
|
|
char_2 = min(i, len(line_2))
|
|
strings.append(f"{line_1[0:char_1]}\n{line_2[0:char_2]}{{fast}}{{nw}}{{done}}")
|
|
strings.append(f"{line_1}\n{line_2}{{fast}}")
|
|
for string in strings:
|
|
speaker(string)
|
|
|
|
# Get the position properties of a tag within the master layer
|
|
def tag_get_placement(tag, layer="master"):
|
|
return renpy.get_placement(renpy.game.context().scene_lists.get_displayable_by_tag(layer, tag))
|
|
|
|
|
|
# xpos positions for crowd sprites, in order from back to front:
|
|
# chilling1: 1.68
|
|
# phone1: 1.18
|
|
# chilling2: 0.44
|
|
# watching4: 2.5
|
|
# watching1: 0.85
|
|
# idle1: 0.0
|
|
# phone3: 0.65
|
|
# idle3: 0.88
|
|
# idle4: 1.96
|
|
# idle2: 1.59
|
|
# phone2: 1.8
|
|
# watching3: 0.39
|
|
# watching2: 1.33
|
|
# chilling3: 0.6
|
|
#
|
|
# xpos 2.4 for idle1 to complete the loop
|
|
#
|
|
# Formula for calculating the delay before sprites move to give their offsets:
|
|
# time * (a sprite xpos / xpos of sprite that completes the loop))
|
|
|
|
# Get the sprites started by sprHandler_CrowdTransitionIn and smoothly transition them out
|
|
def sprHandler_crowdTransitionAway(instant=False):
|
|
# TODO: Make sprHandler_crowdTransitionAway search through the scene's list of tags instead of a premade array
|
|
#tags = renpy.get_showing_tags()
|
|
#for i in tags:
|
|
# if i.find("spr_crowdperson_"):
|
|
crowd_list = ["spr_crowdperson_chilling1",
|
|
"spr_crowdperson_phone1",
|
|
"spr_crowdperson_chilling2",
|
|
"spr_crowdperson_watching4",
|
|
"spr_crowdperson_watching1",
|
|
"spr_crowdperson_idle1",
|
|
"spr_crowdperson_phone3",
|
|
"spr_crowdperson_idle3",
|
|
"spr_crowdperson_idle4",
|
|
"spr_crowdperson_idle2",
|
|
"spr_crowdperson_phone2",
|
|
"spr_crowdperson_watching3",
|
|
"spr_crowdperson_watching2",
|
|
"spr_crowdperson_chilling3",]
|
|
if instant:
|
|
for i in crowd_list:
|
|
renpy.show(i, at_list=[setx()], layer="effects") # Override any transform currenlty happening, the sprite will disappear before this transform shows
|
|
renpy.hide(i, layer="effects")
|
|
else:
|
|
for i in crowd_list:
|
|
crowd_pos = tag_get_placement(i, "effects")
|
|
dist_from_reset_point = crowd_pos.xpos - (0.9 - 2.4)
|
|
new_interp_time = 3 * (dist_from_reset_point / 2.4)
|
|
renpy.show(i, at_list=[tf_crowdperson_hide(new_interp_time)], layer="effects")
|
|
renpy.hide(i, layer="effects")
|
|
|
|
def sprHandler_CrowdTransitionIn(instant=False):
|
|
if instant:
|
|
renpy.show("spr_crowdperson_chilling1", at_list=[tf_crowdperson_scroll_instant(1.68, 1, "#113509")], layer="effects")
|
|
renpy.show("spr_crowdperson_phone1", at_list=[tf_crowdperson_scroll_instant(1.18, 1, "#372020")], layer="effects")
|
|
renpy.show("spr_crowdperson_chilling2", at_list=[tf_crowdperson_scroll_instant(0.44, -1, "#4f522f")], layer="effects")
|
|
renpy.show("spr_crowdperson_watching4", at_list=[tf_crowdperson_scroll_instant(2.5, 1, "#340d2f")], layer="effects")
|
|
renpy.show("spr_crowdperson_watching1", at_list=[tf_crowdperson_scroll_instant(0.85, -1, "#0f203f")], layer="effects")
|
|
renpy.show("spr_crowdperson_idle1", at_list=[tf_crowdperson_scroll_instant(0.0, 1, "#19171E")], layer="effects")
|
|
renpy.show("spr_crowdperson_phone3", at_list=[tf_crowdperson_scroll_instant(0.65, 1, "#292128")], layer="effects")
|
|
renpy.show("spr_crowdperson_idle3", at_list=[tf_crowdperson_scroll_instant(0.88, 1, "#2A372F")], layer="effects")
|
|
renpy.show("spr_crowdperson_idle4", at_list=[tf_crowdperson_scroll_instant(1.96, -1, "#0C122D")], layer="effects")
|
|
renpy.show("spr_crowdperson_idle2", at_list=[tf_crowdperson_scroll_instant(1.59, 1, "#364b10")], layer="effects")
|
|
renpy.show("spr_crowdperson_phone2", at_list=[tf_crowdperson_scroll_instant(1.8, 1, "#0D341E")], layer="effects")
|
|
renpy.show("spr_crowdperson_watching3", at_list=[tf_crowdperson_scroll_instant(0.39, 1, "#142943")], layer="effects")
|
|
renpy.show("spr_crowdperson_watching2", at_list=[tf_crowdperson_scroll_instant(1.33, -1, "#481818")], layer="effects")
|
|
renpy.show("spr_crowdperson_chilling3", at_list=[tf_crowdperson_scroll_instant(0.6, 1, "#370B0D")], layer="effects")
|
|
else:
|
|
renpy.show("spr_crowdperson_chilling1", at_list=[tf_crowdperson_scroll(1.68, 1, "#113509")], layer="effects")
|
|
renpy.show("spr_crowdperson_phone1", at_list=[tf_crowdperson_scroll(1.18, 1, "#372020")], layer="effects")
|
|
renpy.show("spr_crowdperson_chilling2", at_list=[tf_crowdperson_scroll(0.44, -1, "#4f522f")], layer="effects")
|
|
renpy.show("spr_crowdperson_watching4", at_list=[tf_crowdperson_scroll(2.5, 1, "#340d2f")], layer="effects")
|
|
renpy.show("spr_crowdperson_watching1", at_list=[tf_crowdperson_scroll(0.85, -1, "#0f203f")], layer="effects")
|
|
renpy.show("spr_crowdperson_idle1", at_list=[tf_crowdperson_scroll(0.0, 1, "#19171E")], layer="effects")
|
|
renpy.show("spr_crowdperson_phone3", at_list=[tf_crowdperson_scroll(0.65, 1, "#292128")], layer="effects")
|
|
renpy.show("spr_crowdperson_idle3", at_list=[tf_crowdperson_scroll(0.88, 1, "#2A372F")], layer="effects")
|
|
renpy.show("spr_crowdperson_idle4", at_list=[tf_crowdperson_scroll(1.96, -1, "#0C122D")], layer="effects")
|
|
renpy.show("spr_crowdperson_idle2", at_list=[tf_crowdperson_scroll(1.59, 1, "#364b10")], layer="effects")
|
|
renpy.show("spr_crowdperson_phone2", at_list=[tf_crowdperson_scroll(1.8, 1, "#0D341E")], layer="effects")
|
|
renpy.show("spr_crowdperson_watching3", at_list=[tf_crowdperson_scroll(0.39, 1, "#142943")], layer="effects")
|
|
renpy.show("spr_crowdperson_watching2", at_list=[tf_crowdperson_scroll(1.33, -1, "#481818")], layer="effects")
|
|
renpy.show("spr_crowdperson_chilling3", at_list=[tf_crowdperson_scroll(0.6, 1, "#370B0D")], layer="effects")
|
|
|
|
def pause_music(fadeout=1.0,channel="music"):
|
|
|
|
song_name = renpy.music.get_playing(channel)
|
|
loop_point = "0"
|
|
|
|
if song_name != None:
|
|
if "loop" in song_name:
|
|
# Gets the loop point in the current playing song by splitting it, makes it work with pre-defined loops and pausing a song that has already been paused
|
|
# Example of a song that has a predefined loop: define audio.mus_somber = "<loop 33.309563>audio/music/mus_somber.ogg"
|
|
loop_point = song_name.split("<")[1].split(">")[0].split(" ")[-1]
|
|
|
|
if "<" in song_name:
|
|
# Gets only the song name, no loops or from
|
|
song_name = song_name.split("<")[1].split(">")[-1]
|
|
|
|
# We clear the last played song if we are playing nothing and pause the music, so that we avoid carrying songs from older chapters into new ones
|
|
# This is due to the fact that we also "play nothing" when the player has the game muted so that could lead to undefined behavior, tho is it better to play nothing instead? - Legalo
|
|
store.last_played[channel] = (str(renpy.music.get_pos(channel)), loop_point, song_name)
|
|
|
|
renpy.music.stop(channel,fadeout)
|
|
|
|
def resume_music(fadein=1.0, channel="music"):
|
|
try:
|
|
# For some fucking reason get_pos() will return a None if the user has "Mute All" active, this doesn't happen if volume is set to 0
|
|
if store.last_played[channel][0] != "None" and store.last_played[channel][2] != None:
|
|
# Formats the audio file to play from that place
|
|
toPlay = "<from "+store.last_played[channel][0]+" loop "+store.last_played[channel][1]+">"+store.last_played[channel][2]
|
|
renpy.music.play(toPlay, channel,fadein=fadein)
|
|
except KeyError:
|
|
pass
|
|
|
|
define last_played = {}
|
|
|
|
# Transforms for the crowd transitions above
|
|
|
|
transform tf_crowdperson_hide(t):
|
|
on hide:
|
|
linear t xpos 0.9 - 2.4
|
|
|
|
transform tf_crowdperson_scroll(x=0.0, flip=1, color="#ffffff", _offset=0.9, t=3):
|
|
zoom 2.285714 ypos -0.91 xpos _offset xzoom flip alpha 0.0
|
|
matrixcolor ColorizeMatrix(color, "#ffffff")
|
|
pause t * (x / 2.4)
|
|
alpha 1
|
|
block:
|
|
linear t xpos _offset - 2.4
|
|
xpos _offset
|
|
repeat
|
|
transform tf_crowdperson_scroll_instant(x=0.0, flip=1, color="#ffffff", _offset=0.9, t=3):
|
|
zoom 2.285714 ypos -0.91 xpos _offset - (2.4 - x) xzoom flip
|
|
matrixcolor ColorizeMatrix(color, "#ffffff")
|
|
linear t * (x / 2.4) xpos _offset - 2.4
|
|
block:
|
|
xpos _offset
|
|
linear t xpos _offset - 2.4
|
|
repeat
|
|
|
|
|
|
|
|
#
|
|
# METRO STUFF
|
|
#
|
|
init -300:
|
|
define animation_controller = 1
|
|
init python:
|
|
# some stupid bullshit you have to do to get sounds playing in an ATL block
|
|
def play_metro_bump_sound(a,b,c):
|
|
renpy.play("audio/sounds/snd_metro_bump" + DEFAULT_SOUND_EXTENSION, channel='audio')
|
|
def play_metro_announcer1_sound(a,b,c):
|
|
renpy.play("audio/sounds/snd_metro_announcer1" + DEFAULT_SOUND_EXTENSION, channel='audio')
|
|
def play_metro_announcer2_sound(a,b,c):
|
|
renpy.play("audio/sounds/snd_metro_announcer2" + DEFAULT_SOUND_EXTENSION, channel='audio')
|
|
def play_metro_announcer3_sound(a,b,c):
|
|
renpy.play("audio/sounds/snd_metro_announcer3" + DEFAULT_SOUND_EXTENSION, channel='audio')
|
|
def play_metro_beep_sound(a,b,c):
|
|
renpy.play("audio/sounds/snd_metro_beep" + DEFAULT_SOUND_EXTENSION, channel='audio')
|
|
def bump(a,b,c):
|
|
renpy.invoke_in_thread(fn=animate_hair)
|
|
return
|
|
def animate_hair():
|
|
import time
|
|
time.sleep(0.1)
|
|
store.animation_controller = 2
|
|
time.sleep(0.0832)
|
|
store.animation_controller = 3
|
|
time.sleep(0.0832)
|
|
store.animation_controller = 4
|
|
time.sleep(0.0832)
|
|
store.animation_controller = 1
|
|
return
|
|
def hair_controller(st, at, name):
|
|
return f"{name}{store.animation_controller}",0.03
|
|
|
|
#TODO make the car kino more "real" feeling
|
|
transform tf_car_cameramove:
|
|
parallel:
|
|
parallel:
|
|
ease_quad 1.5 xoffset 0
|
|
ease_quad 1.0 xoffset -1
|
|
ease_quad 1.3 xoffset 1
|
|
ease_quad 1.0 xoffset -1
|
|
ease_quad 1.2 xoffset 2
|
|
ease_quad 1.0 xoffset -1
|
|
ease_quad 1.2 xoffset -3
|
|
ease_quad 1.4 xoffset 0
|
|
repeat
|
|
parallel:
|
|
ease_quad 1.0 yoffset 0
|
|
ease_quad 1.4 yoffset 2
|
|
ease_quad 1.1 yoffset -3
|
|
ease_quad 1.5 yoffset 1
|
|
ease_quad 1.1 yoffset 3
|
|
ease_quad 1.0 yoffset -1
|
|
repeat
|
|
|
|
|
|
parallel:
|
|
# autistic workaround for the 'time' statement not working in these blocks.
|
|
pause 8
|
|
block:
|
|
parallel:
|
|
pause 16
|
|
parallel:
|
|
function bump
|
|
linear 0.04 yanchor 0.002
|
|
linear 0.055 yanchor 0.0
|
|
linear 0.07 yanchor 0.005
|
|
linear 0.07 yanchor 0.0
|
|
linear 0.07 yanchor 0.01
|
|
linear 0.07 yanchor 0.0
|
|
linear 0.07 yanchor 0.005
|
|
linear 0.09 yanchor 0.0
|
|
linear 0.09 yanchor 0.002
|
|
linear 0.09 yanchor 0.0
|
|
repeat
|
|
|
|
transform tf_metro_cameramove:
|
|
parallel:
|
|
parallel:
|
|
ease_quad 1.5 xoffset 1
|
|
ease_quad 1.0 xoffset -2
|
|
ease_quad 1.3 xoffset 2
|
|
ease_quad 1.0 xoffset -2
|
|
ease_quad 1.2 xoffset 3
|
|
ease_quad 1.0 xoffset -2
|
|
ease_quad 1.2 xoffset -4
|
|
ease_quad 1.4 xoffset 0
|
|
repeat
|
|
parallel:
|
|
ease_quad 1.0 yoffset -1
|
|
ease_quad 1.4 yoffset 3
|
|
ease_quad 1.1 yoffset -4
|
|
ease_quad 1.5 yoffset 2
|
|
ease_quad 1.1 yoffset 4
|
|
ease_quad 1.0 yoffset -2
|
|
repeat
|
|
|
|
parallel:
|
|
# autistic workaround for the 'time' statement not working in these blocks.
|
|
pause 8
|
|
block:
|
|
parallel:
|
|
pause 8
|
|
parallel:
|
|
linear 0.04 yanchor 0.002
|
|
linear 0.055 yanchor 0.0
|
|
linear 0.07 yanchor 0.005
|
|
linear 0.07 yanchor 0.0
|
|
linear 0.07 yanchor 0.01
|
|
linear 0.07 yanchor 0.0
|
|
linear 0.07 yanchor 0.005
|
|
linear 0.09 yanchor 0.0
|
|
linear 0.09 yanchor 0.002
|
|
linear 0.09 yanchor 0.0
|
|
repeat
|
|
|
|
# Transform that includes the bump function, this is needed because renpy is stupid and if you have that there whenever a camera pan and a bump happen at the same time the camera will be reset back to its original position
|
|
transform tf_metro_cameramove_olivia:
|
|
parallel:
|
|
parallel:
|
|
ease_quad 1.5 xoffset 1
|
|
ease_quad 1.0 xoffset -2
|
|
ease_quad 1.3 xoffset 2
|
|
ease_quad 1.0 xoffset -2
|
|
ease_quad 1.2 xoffset 3
|
|
ease_quad 1.0 xoffset -2
|
|
ease_quad 1.2 xoffset -4
|
|
ease_quad 1.4 xoffset 0
|
|
repeat
|
|
parallel:
|
|
ease_quad 1.0 yoffset -1
|
|
ease_quad 1.4 yoffset 3
|
|
ease_quad 1.1 yoffset -4
|
|
ease_quad 1.5 yoffset 2
|
|
ease_quad 1.1 yoffset 4
|
|
ease_quad 1.0 yoffset -2
|
|
repeat
|
|
|
|
parallel:
|
|
# autistic workaround for the 'time' statement not working in these blocks.
|
|
pause 8
|
|
block:
|
|
parallel:
|
|
pause 8
|
|
parallel:
|
|
function bump
|
|
linear 0.04 yanchor 0.002
|
|
linear 0.055 yanchor 0.0
|
|
linear 0.07 yanchor 0.005
|
|
linear 0.07 yanchor 0.0
|
|
linear 0.07 yanchor 0.01
|
|
linear 0.07 yanchor 0.0
|
|
linear 0.07 yanchor 0.005
|
|
linear 0.09 yanchor 0.0
|
|
linear 0.09 yanchor 0.002
|
|
linear 0.09 yanchor 0.0
|
|
repeat
|
|
|
|
transform tf_metro_camerastop:
|
|
parallel:
|
|
ease_quad 1.4 xoffset 0
|
|
|
|
parallel:
|
|
ease_quad 1.0 yoffset 0
|
|
|
|
|
|
transform tf_metro_soundplayer:
|
|
parallel:
|
|
pause 7.5
|
|
function play_metro_bump_sound
|
|
pause 0.5
|
|
repeat
|
|
parallel:
|
|
pause 10
|
|
function play_metro_beep_sound
|
|
pause 1
|
|
function play_metro_announcer1_sound
|
|
pause 20
|
|
function play_metro_beep_sound
|
|
pause 1
|
|
function play_metro_announcer2_sound
|
|
pause 17
|
|
function play_metro_beep_sound
|
|
pause 1
|
|
function play_metro_announcer3_sound
|
|
pause 6
|
|
repeat
|
|
|
|
#constants
|
|
init python:
|
|
# Metro asset aligns. Effectively the camera, but the camera's position would not be affected. This makes it so the default view lets the camera be located at (0.0, 0.0)
|
|
METRO_DEFAULTALIGNX = 0.5
|
|
METRO_DEFAULTALIGNY = 0.59
|
|
|
|
# Positions for the camera to pan up/down
|
|
METRO_CAMERA_FERRISVIEW = 600
|
|
METRO_CAMERA_OLIVIAVIEW = -400
|
|
|
|
# Aligns the metro to it's default view to the camera without needing to adjust the camera to the correct position
|
|
transform tf_metro_defaultalign:
|
|
xalign METRO_DEFAULTALIGNX
|
|
yalign METRO_DEFAULTALIGNY
|
|
|
|
|
|
|
|
# Call these labels, so you can quickly setup the metro scene in a chapter
|
|
|
|
label l_metro_day_sound:
|
|
scene black
|
|
|
|
show bg_metro_skyline:
|
|
xpos 0.46
|
|
ypos -0.69
|
|
matrixtransform RotateMatrix(0.0, -9.0, 0.0)
|
|
block:
|
|
xpan 0
|
|
linear 140 xpan 360
|
|
repeat
|
|
show bg_metro_skyline as bg_metro_skyline2:
|
|
xpos -0.96
|
|
ypos -0.69
|
|
matrixtransform RotateMatrix(0.0, 9.0, 0.0)
|
|
block:
|
|
xpan 0
|
|
linear 140 xpan -360
|
|
repeat
|
|
|
|
show bg_metro_day at tf_metro_defaultalign
|
|
|
|
show spr_metrorandy_hoe:
|
|
tf_metro_defaultalign
|
|
pause 4
|
|
"spr_metrorandy_hoe_blink"
|
|
pause 4.1
|
|
block:
|
|
"spr_metrorandy_hoe_bump"
|
|
pause 4
|
|
"spr_metrorandy_hoe_blink"
|
|
pause 4
|
|
"spr_metrorandy_hoe_bump"
|
|
pause 5
|
|
"spr_metrorandy_hoe_blink"
|
|
pause 3
|
|
repeat
|
|
|
|
show spr_metrorandy_rebels:
|
|
tf_metro_defaultalign
|
|
pause 8.1
|
|
block:
|
|
"spr_metrorandy_rebels_bump"
|
|
pause 8
|
|
repeat
|
|
show spr_metrorandy_paperguy:
|
|
tf_metro_defaultalign
|
|
pause 8.1
|
|
block:
|
|
"spr_metrorandy_paperguy_bump"
|
|
pause 3
|
|
"spr_metrorandy_paperguy_turnpage"
|
|
pause 5
|
|
"spr_metrorandy_paperguy_bump"
|
|
pause 8
|
|
"spr_metrorandy_paperguy_bump"
|
|
pause 8
|
|
repeat
|
|
|
|
show bg_metro_bars at tf_metro_defaultalign
|
|
show bg_metro_overlay at tf_metro_defaultalign
|
|
|
|
return
|
|
|
|
|
|
label l_metro_day:
|
|
|
|
scene black
|
|
|
|
show bg_metro_skyline:
|
|
xpos 0.46
|
|
ypos -0.69
|
|
matrixtransform RotateMatrix(0.0, -9.0, 0.0)
|
|
block:
|
|
xpan 0
|
|
linear 140 xpan 360
|
|
repeat
|
|
show bg_metro_skyline as bg_metro_skyline2:
|
|
xpos -0.96
|
|
ypos -0.69
|
|
matrixtransform RotateMatrix(0.0, 9.0, 0.0)
|
|
block:
|
|
xpan 0
|
|
linear 140 xpan -360
|
|
repeat
|
|
|
|
show bg_metro_day at tf_metro_defaultalign
|
|
|
|
show spr_metrorandy_hoe:
|
|
tf_metro_defaultalign
|
|
pause 4
|
|
"spr_metrorandy_hoe_blink"
|
|
pause 4.1
|
|
block:
|
|
"spr_metrorandy_hoe_bump"
|
|
pause 4
|
|
"spr_metrorandy_hoe_blink"
|
|
pause 4
|
|
"spr_metrorandy_hoe_bump"
|
|
pause 5
|
|
"spr_metrorandy_hoe_blink"
|
|
pause 3
|
|
repeat
|
|
|
|
show spr_metrorandy_rebels:
|
|
tf_metro_defaultalign
|
|
pause 8.1
|
|
block:
|
|
"spr_metrorandy_rebels_bump"
|
|
pause 8
|
|
repeat
|
|
show spr_metrorandy_paperguy:
|
|
tf_metro_defaultalign
|
|
pause 8.1
|
|
block:
|
|
"spr_metrorandy_paperguy_bump"
|
|
pause 3
|
|
"spr_metrorandy_paperguy_turnpage"
|
|
pause 5
|
|
"spr_metrorandy_paperguy_bump"
|
|
pause 8
|
|
"spr_metrorandy_paperguy_bump"
|
|
pause 8
|
|
repeat
|
|
|
|
show bg_metro_bars at tf_metro_defaultalign
|
|
show bg_metro_overlay at tf_metro_defaultalign
|
|
|
|
camera:
|
|
perspective True
|
|
tf_metro_cameramove
|
|
|
|
return
|
|
|
|
|
|
label l_metro_dusk:
|
|
|
|
scene black
|
|
|
|
show bg_metro_skyline:
|
|
xpos 0.46
|
|
ypos -0.69
|
|
matrixtransform RotateMatrix(0.0, -9.0, 0.0)
|
|
block:
|
|
xpan 0
|
|
linear 140 xpan -360
|
|
repeat
|
|
show bg_metro_skyline as bg_metro_skyline2:
|
|
xpos -0.96
|
|
ypos -0.69
|
|
matrixtransform RotateMatrix(0.0, 9.0, 0.0)
|
|
block:
|
|
xpan 0
|
|
linear 140 xpan 360
|
|
repeat
|
|
|
|
show bg_metro_day at tf_metro_defaultalign
|
|
|
|
show spr_metrorandy_paperguy:
|
|
tf_metro_defaultalign
|
|
pause 8.1
|
|
block:
|
|
"spr_metrorandy_paperguy_bump"
|
|
pause 3
|
|
"spr_metrorandy_paperguy_turnpage"
|
|
pause 5
|
|
"spr_metrorandy_paperguy_bump"
|
|
pause 8
|
|
"spr_metrorandy_paperguy_bump"
|
|
pause 8
|
|
repeat
|
|
|
|
show bg_metro_bars at tf_metro_defaultalign
|
|
show bg_metro_overlay at tf_metro_defaultalign
|
|
|
|
camera:
|
|
perspective True
|
|
matrixcolor BrightnessMatrix(0.1)*TintMatrix("#FFA976")*ContrastMatrix(value=1.2)
|
|
tf_metro_cameramove
|
|
|
|
return
|
|
|
|
label l_metro_night:
|
|
|
|
scene black
|
|
|
|
show bg_metro_skyline_night:
|
|
xpos 0.46
|
|
ypos -0.69
|
|
matrixtransform RotateMatrix(0.0, -9.0, 0.0)
|
|
block:
|
|
xpan 0
|
|
linear 140 xpan -360
|
|
repeat
|
|
show bg_metro_skyline_night as bg_metro_skyline2:
|
|
xpos -0.96
|
|
ypos -0.69
|
|
matrixtransform RotateMatrix(0.0, 9.0, 0.0)
|
|
block:
|
|
xpan 0
|
|
linear 140 xpan 360
|
|
repeat
|
|
|
|
show bg_metro_night:
|
|
tf_metro_defaultalign
|
|
matrixcolor HueMatrix(22.0) * SaturationMatrix(1.3) * BrightnessMatrix(-0.09)
|
|
|
|
show spr_metrorandy_rebels:
|
|
tf_metro_defaultalign
|
|
matrixcolor HueMatrix(22.0) * SaturationMatrix(1.3) * BrightnessMatrix(-0.04)
|
|
pause 8.1
|
|
block:
|
|
"spr_metrorandy_rebels_bump"
|
|
pause 8
|
|
repeat
|
|
|
|
show bg_metro_bars:
|
|
tf_metro_defaultalign
|
|
matrixcolor HueMatrix(22.0) * SaturationMatrix(1.3) * BrightnessMatrix(-0.09)
|
|
show bg_metro_overlay:
|
|
tf_metro_defaultalign
|
|
matrixcolor BrightnessMatrix(-0.09)
|
|
|
|
camera:
|
|
perspective True
|
|
tf_metro_cameramove
|
|
|
|
return
|
|
|
|
label l_metro_day_empty:
|
|
scene black
|
|
|
|
show bg_metro_skyline:
|
|
xpos 0.46
|
|
ypos -0.69
|
|
matrixtransform RotateMatrix(0.0, -9.0, 0.0)
|
|
block:
|
|
xpan 0
|
|
linear 140 xpan 360
|
|
repeat
|
|
show bg_metro_skyline as bg_metro_skyline2:
|
|
xpos -0.96
|
|
ypos -0.69
|
|
matrixtransform RotateMatrix(0.0, 9.0, 0.0)
|
|
block:
|
|
xpan 0
|
|
linear 140 xpan -360
|
|
repeat
|
|
|
|
show bg_metro_day at tf_metro_defaultalign
|
|
show bg_metro_bars at tf_metro_defaultalign
|
|
show bg_metro_overlay at tf_metro_defaultalign
|
|
|
|
return
|
|
|
|
label l_metro_night_empty:
|
|
|
|
scene black
|
|
|
|
show bg_metro_skyline_night:
|
|
xpos 0.46
|
|
ypos -0.69
|
|
matrixtransform RotateMatrix(0.0, -9.0, 0.0)
|
|
block:
|
|
xpan 0
|
|
linear 140 xpan -360
|
|
repeat
|
|
show bg_metro_skyline_night as bg_metro_skyline2:
|
|
xpos -0.96
|
|
ypos -0.69
|
|
matrixtransform RotateMatrix(0.0, 9.0, 0.0)
|
|
block:
|
|
xpan 0
|
|
linear 140 xpan 360
|
|
repeat
|
|
|
|
show bg_metro_night:
|
|
tf_metro_defaultalign
|
|
matrixcolor HueMatrix(22.0) * SaturationMatrix(1.3) * BrightnessMatrix(-0.09)
|
|
|
|
show bg_metro_bars:
|
|
tf_metro_defaultalign
|
|
matrixcolor HueMatrix(22.0) * SaturationMatrix(1.3) * BrightnessMatrix(-0.09)
|
|
show bg_metro_overlay:
|
|
tf_metro_defaultalign
|
|
matrixcolor BrightnessMatrix(-0.09)
|
|
|
|
camera:
|
|
perspective True
|
|
tf_metro_cameramove
|
|
|
|
return
|
|
|
|
|
|
#
|
|
# DEMO STUFF
|
|
#
|
|
|
|
transform tf_endofdemo_delayshow(p):
|
|
alpha 0.0
|
|
pause p
|
|
linear 0.5 alpha 1.1
|
|
|
|
screen endofdemo_1():
|
|
text _("You've reached the end of the demo!") yalign 0.7 xalign 0.5 size 50 text_align 0.5 at tf_endofdemo_delayshow(1)
|
|
screen endofdemo_2():
|
|
style_prefix "main_menu"
|
|
vbox:
|
|
xalign 0.5
|
|
yanchor 0.7
|
|
ypos 0.885
|
|
spacing 40
|
|
text _("You can purchase the full game on Itch.io or Steam.") yalign 0.7 xalign 0.5 size 50 xmaximum 1400 text_align 0.5
|
|
button at tf_draw_moveindown(0.0):
|
|
xalign 0.5
|
|
xmaximum 450
|
|
ymaximum 100
|
|
action OpenURL("https://store.steampowered.com/app/1895350/I_Wani_Hug_that_Gator/")
|
|
activate_sound "audio/ui/snd_ui_click.wav"
|
|
fixed:
|
|
add "gui/button/menubuttons/menu_button.png" zoom 1.2 yalign 0.5 xalign 0.5
|
|
text _("Steam") size 35 yalign 0.5 xalign 0.5
|
|
button at tf_draw_moveindown(0.0):
|
|
xalign 0.5
|
|
xmaximum 450
|
|
ymaximum 100
|
|
action OpenURL("https://cavemanon.itch.io/i-wani-hug-that-gator/purchase")
|
|
activate_sound "audio/ui/snd_ui_click.wav"
|
|
fixed:
|
|
add "gui/button/menubuttons/menu_button.png" zoom 1.2 yalign 0.5 xalign 0.5
|
|
text _("Itch.io") size 35 yalign 0.5 xalign 0.5
|
|
screen endofdemo_3():
|
|
text _("Thanks for playing!") yalign 0.7 xalign 0.5 size 50 text_align 0.5
|
|
|
|
|
|
label end_of_demo:
|
|
$ quick_menu = False
|
|
window auto hide
|
|
pause 0.5
|
|
|
|
scene black
|
|
camera:
|
|
resetcamera()
|
|
zoom 1.0 rotate None
|
|
|
|
play music mus_rock noloop
|
|
pause 1.3
|
|
|
|
if persistent.splashtype == 1:
|
|
$ demo_logo = "anim_logoalt"
|
|
else:
|
|
$ demo_logo = "anim_logo"
|
|
|
|
show vfx_embereffect_darker:
|
|
alpha 0.0
|
|
easeout_quad 5 alpha 1.0
|
|
show vfx_embereffect_dark:
|
|
alpha 0.0
|
|
easeout_quad 5 alpha 1.0
|
|
show vfx_embereffect:
|
|
alpha 0.0
|
|
easeout_quad 5 alpha 1.0
|
|
|
|
show expression demo_logo:
|
|
subpixel True
|
|
xalign 0.5 yalign 0.5 zoom 0.9
|
|
linear 8 zoom 0.75
|
|
|
|
pause 8
|
|
|
|
show expression demo_logo:
|
|
subpixel True
|
|
zoom 0.75
|
|
ease_cubic 2 yoffset -200 zoom 0.5
|
|
|
|
show screen endofdemo_1
|
|
pause 3.5
|
|
hide screen endofdemo_1 with Dissolve(0.5)
|
|
pause 0.25
|
|
show screen endofdemo_2 with Dissolve(0.5)
|
|
pause
|
|
hide screen endofdemo_2 with Dissolve(0.5)
|
|
pause 0.25
|
|
show screen endofdemo_3 with Dissolve(0.5)
|
|
pause 3
|
|
|
|
stop music fadeout 3
|
|
|
|
hide expression demo_logo
|
|
hide screen endofdemo_3
|
|
hide vfx_embereffect_darker
|
|
hide vfx_embereffect_dark
|
|
hide vfx_embereffect
|
|
with Dissolve(2)
|
|
pause 1.25
|
|
|
|
|
|
# This is so fucking stupid
|
|
image nothing = Transform("#000000", alpha=0)
|