def __init__(self,**kwargs): self.flash_color = [ 1.0,1.0,0.0,1.0 ] Object.__init__(self,**kwargs) self.light_type = Object.LightTypes.DYNAMIC_TEXTURE_OVERLAY self.light_texture = BGL.assets.get('NL-lights/texture/radial') self.texture = Firefly.texture self.buftarget = "additive" self.is_pixie = False self.light_color = [ 1.0,0.6,0.3,1.0 ] self.color = [ 1.0,0.8,0.2,1.0] self.light_radius = 15 self.tick_type = Object.TickTypes.PURGING self.life = 0 self.trigger_life = uniform( 30.0,60.0 ) self.base_p = self.p self.size = [0.7+uniform(0.0,0.3),0.7+uniform(0.0,0.3)] self.visible = True self.offs = uniform(0.0,3.14) spd = uniform(0.5,0.9) d = uniform(-3.14,3.14) self.vx = cos(d)*spd self.vy = sin(d)*spd
def __init__(self, **kwargs): Object.__init__(self, **kwargs) self.buftarget = "popup" self.tick_type = Object.TickTypes.PURGING #self.light_type = Object.LightTypes.DYNAMIC_TEXTURE_OVERLAY #self.light_texture = BGL.assets.get('NL-lights/texture/radial') #self.light_radius = 15 self.lifespan = 150 self.light_color = [1.0, 0.7, 0.0, 0.0] self.color = [1.0, 0.5, 0.5, 1.0] self.fr = 0 sz = uniform(0.3, 0.5) self.size = [sz, sz] self.snapshot_fields = ['p'] self.rad = uniform(-0.8, 0.8) self.vx = uniform(-1.0, 1.0) self.vy = uniform(-0.5, -1.5) if (self.vx > 0): self.size[0] *= -1 self.delay = uniform(10.0, 90.0) self.visible = False self.z_index = 9000000 self.rad = uniform(-0.2, 0.2)
def __init__(self,**kwargs): Object.__init__(self,**kwargs) self.texture = BasicProjectile.textures["default"] if "texture" in kwargs: self.texture = BasicProjectile.textures[kwargs["texture"]] self.animation = None self.buftarget = "popup" self.tick_type = Object.TickTypes.PURGING self.light_type = Object.LightTypes.DYNAMIC_SHADOWCASTER self.light_radius = 5 self.lifespan = 120 self.light_color = [ 0.6,1.0,0.3,0.4 ] self.size = [ 0.5,0.5 ] self.snapshot_fields = [ 'p' ] if "override_spd" in kwargs: spd = self.override_spd else: spd = 0.45 + uniform(0.001, 0.01) self.vx = cos( self.rad )*spd self.vy = sin( self.rad )*spd self.attack_str = 8 self.player_touch_frames = 0 self.vs_enemy = False self.fr = 0 if "animation" in kwargs: self.animation = BasicProjectile.animations[kwargs["animation"]]
def __init__(self, **kwargs): Object.__init__(self, **kwargs) self.texture = choice(SplatterParticle.texture) if "ptexture" in self.__dict__: self.texture = self.ptexture self.buftarget = "popup" self.tick_type = Object.TickTypes.PURGING #self.light_type = Object.LightTypes.DYNAMIC_TEXTURE_OVERLAY #self.light_texture = BGL.assets.get('NL-lights/texture/radial') #self.light_radius = 15 self.lifespan = 90 self.light_color = [1.0, 0.7, 0.0, 0.0] self.color = [1.0, 0.5, 0.5, 1.0] self.size = [3.8, 3.8] if "ptexture" in self.__dict__: self.size = [5.0, 5.0] self.snapshot_fields = ['p'] spd = 0.3 + uniform(0.2, 0.8) self.vx = cos(self.rad) * spd self.vy = sin(self.rad) * spd self.rad = uniform(-3.14, 3.14)
def __init__(self, **kwargs): Object.__init__(self, **kwargs) self.p[1] += 1.5 self.size = [3.0, 3.0] self.buftarget = "floor" self.texture = FTermStand.texture self.tick_type = Object.TickTypes.STATIC self.physics = {"radius": 1.2, "mass": 900, "friction": 0.3}
def __init__(self, **kwargs): Object.__init__(self, **kwargs) self.buftarget = "floor" self.z_index = 2 self.light_type = Object.LightTypes.DYNAMIC_SHADOWCASTER self.light_color = [0.8, 0.0, 1.0, 1.0] self.light_radius = 25 self.tick_type = Object.TickTypes.TICK_FOREVER self.size = [2.0, 2.0] self.fr = 0
def __init__(self, **kwargs): Object.__init__(self, **kwargs) self.texture = BGL.assets.get("KT-player/texture/beam") self.tick_type = Object.TickTypes.TICK_FOREVER self.size = [30.0, 0.1] self.light_color = [0.5, 0.5, 0.5, 0.5] self.light_type = Object.LightTypes.NONE self.visible = False self.buftarget = "popup" self.fired = False self.aiming = False
def __init__(self, **kwargs): Object.__init__(self, **kwargs) self.texture = BGL.assets.get("KT-player/texture/beam") self.tick_type = Object.TickTypes.TICK_FOREVER self.size = [30.0, 10.0] self.light_color = [0.2, 0.2, 0.2, 1.0] self.light_type = Object.LightTypes.DYNAMIC_TEXTURE_OVERLAY self.visible = False self.buftarget = "popup" self.fired = False self.aiming = False
def __init__(self, **kwargs): Object.__init__(self, **kwargs) self.texture = RangedMagic.arrow_texture self.buftarget = "popup" self.tick_type = Object.TickTypes.PURGING self.light_type = Object.LightTypes.DYNAMIC_SHADOWCASTER self.light_radius = 5 self.lifespan = 120 self.light_color = [0.0, 0.0, 1.0, 1.0] self.vx = cos(self.rad) * 2 self.vy = sin(self.rad) * 2
def __init__(self, **kwargs): overrides = { "num": 0, "texture": BGL.assets.get("KT-forest/texture/treeroots"), 'tick_type': Object.TickTypes.TICK_FOREVER, 'size': [5.0, 5.0], 'rad': uniform(-3.14, 3.14), 'z_index': -121, 'buftarget': 'popup' } overrides.update(kwargs) Object.__init__(self, **overrides) self.t = 0 self.base_size = [self.size[0], self.size[1]] self.draw_color = [0.8, uniform(0.0, 1.0), 0.8, uniform(0.6, 0.7)]
def get_shader_params(self): bp = Object.get_shader_params(self) if self.hitFr > 0: bp['translation_local'][0] += uniform(-0.2, 0.2) bp['filter_color'] = [10.0, 10.0, 10.0, 1.0] return bp
def get_shader_params(self): params = Object.get_shader_params(self) tw = params["translation_world"] tw[0] = tw[0] * self.parallax tw[1] = tw[1] * self.parallax params["translation_world"] = tw return params
def get_guppy_batch(self): batch = [Object.get_shader_params(self), self.get_shader_params()] r = self.physics["radius"] batch[0]["scale_local"] = [r * 1.5, r * 1.5] batch[0]["texBuffer"] = BGL.assets.get( "KT-forest/texture/alpha_shadow") return batch
def get_shader_params(self): bp = Object.get_shader_params(self) bp["translation_local"][1] = 0.0 bp["translation_local"][0] += 0.1*sin(self.bob_index) bp["scale_local"][1] *= -1.0 #bp["translation_local"][1] -= 0.0 bp["filter_color"] = [ 0.0,0.0,0.0,0.0 ] return bp
def __init__(self, **kwargs): Object.__init__(self, **kwargs) self.texture = HealthBubble.texture self.buftarget = "popup" self.tick_type = Object.TickTypes.PURGING self.light_type = Object.LightTypes.NONE if (uniform(0.0, 1.0) > 0.8): self.light_type = Object.LightTypes.DYNAMIC_SHADOWCASTER self.light_radius = 5 self.lifespan = 1390 self.light_color = [1.0, 0.0, 0.0, 0.0] self.color = [1.0, 0.0, 0.0, 1.0] self.size = [2.8, 2.8] self.snapshot_fields = ['p'] self.vx = uniform(-0.05, 0.05) self.vy = uniform(-0.1, -0.2)
def __init__(self, **kwargs): self.scale = 2 tt = kwargs['TreeTop'] overrides = { "num": 0, "texture": choice(GeneratorOptions.TreeShadowTextures), 'tick_type': Object.TickTypes.TICK_FOREVER, 'size': [self.scale * tt.size[0], self.scale * tt.size[1]], 'rad': tt.rad, 'z_index': 0, 'tt': tt, 'buftarget': 'shadow' } overrides.update(kwargs) Object.__init__(self, **overrides) self.t = 0 self.base_size = [self.size[0], self.size[1]] self.draw_color = [0.8, uniform(0.0, 1.0), 0.8, 0.3] self.wind_speed = tt.wind_speed self.wind_mod = tt.wind_mod
def __init__(self, **kwargs): Object.__init__(self, **kwargs) self.rad = uniform(-3.14, 3.14) self.texture = choice(CrystalChunk.textures) self.buftarget = "popup" self.tick_type = Object.TickTypes.PURGING self.light_type = Object.LightTypes.DYNAMIC_SHADOWCASTER self.light_radius = 15 self.lifespan = 90 self.light_color = [1.0, 0.7, 0.0, 0.0] self.color = [1.0, 1.0, 1.0, 1.0] sz = uniform(2.0, 4.0) self.size = [sz, sz] self.snapshot_fields = ['p'] spd = 0.3 + uniform(0.2, 0.8) self.vx = cos(self.rad) * spd self.vy = sin(self.rad) * spd self.rad = uniform(-3.14, 3.14)
def get_shader_params(self): base_params = Object.get_shader_params(self) dx = self.owner.p[0] - self.floor.player.p[0] dy = self.owner.p[1] - self.floor.player.p[1] if self.owner.tooltip_layout==0: base_params['translation_world'][0] -= (self.owner.size[0]*1.2) * (1.0+(dx/30.)) base_params['translation_world'][1] -= (self.owner.size[1]*1.2) * (1.0+(dy/30.)) return base_params
def get_guppy_batch(self): return [self.get_shader_params()] batch = [Object.get_shader_params(self), self.get_shader_params()] r = self.physics["radius"] #batch[0]["scale_local"] = [ r*2,r*2 ] #batch[0]["texBuffer"]=BGL.assets.get("KT-forest/texture/alpha_shadow") batch[0]["scale_local"] = [r, r] batch[0]["texBuffer"] = BGL.assets.get( "KT-forest/texture/registration2") batch[1]["translation_local"][1] -= 0.0 return batch
def __init__(self, **kwargs): tex_options = GeneratorOptions.TreeTopTextures overrides = { "num": 0, "texture": choice(tex_options), 'tick_type': Object.TickTypes.TICK_FOREVER, 'size': [5.0, 5.0], 'rad': uniform(-3.14, 3.14), 'parallax': 1.2, 'z_index': 100, 'wind_speed': uniform(0.1, 0.3), 'wind_mod': uniform(1.1, 1.2), 'buftarget': 'canopy' } overrides.update(kwargs) Object.__init__(self, **overrides) self.t = 0 self.base_size = [self.size[0], self.size[1]] self.draw_color = [0.9, uniform(0.8, 1.0), 0.9, uniform(0.6, 0.9)] self.last_a = self.draw_color[3]
def get_shader_params(self): params = Object.get_shader_params(self) tw = params["translation_world"] tw[0] = tw[0] * self.parallax tw[1] = tw[1] * self.parallax params["translation_world"] = tw params["filter_color"] = list(self.draw_color) dx = self.p[0] - (self.floor.camera.p[0] + (self.floor.player.v[0] * 3)) dy = self.p[1] - (self.floor.camera.p[1] + (self.floor.player.v[1] * 3)) md = (dx * dx) + (dy * dy) impulse_a = self.draw_color[3] if (md < 250): impulse_a = 0.1 self.last_a = (self.last_a * 0.98) + (impulse_a * 0.02) params["filter_color"][3] = self.last_a return params
def get_shader_params(self): sp = Object.get_shader_params(self) return sp
def get_shader_params(self): sp = Object.get_shader_params(self) sp["translation_local"][1] += ((sin(self.fridx * 0.01) * 0.05)) + -0.8 return sp
def get_shader_params(self): params = Object.get_shader_params(self) tw = params["translation_world"] params["translation_world"] = tw params["filter_color"] = self.draw_color return params
def get_shader_params(self): sp = Object.get_shader_params(self) sp["filter_color"] = [1.0, 1.0, 1.0, float(self.cooldown) / 80.] return sp
def tick(self): Cooldown.tick(self) self.size = [6.7, 6.7] if (self.snap_animation_buffer > 0): self.size = [2.2, 2.2] self.run_animation_subtick = self.run_animation_subtick + 1 if (self.run_animation_subtick == 16): self.run_animation_subtick = 0 self.run_animation_alt = 0 if (self.in_editor): self.title_card.abort() if not self.beat_level and self.floor.genocide_enabled: #set in game if not self.suspend_time_penalty: if not self.title_card.displaying(): if not self.floor.camera.cinema_target: self.life_timer -= 1 else: self.suspend_time_penalty = False if (self.life_timer < 0): self.hp = -1 self.disp_life_timer = floor(self.life_timer / 60) if (self.disp_life_timer < 0): self.disp_life_timer = "!TIMES UP!" if not self.violentally_executed_self: if choice([True, False, False]): KSounds.play(KSounds.basic_hit) KSounds.play(KSounds.player_hurt) for x in range(0, 2): self.floor.create_object( SplatterParticle(p=[ self.floor.player.p[0], self.floor.player.p[1] ], rad=uniform(-3.14, 3.14))) if self.life_timer < -90: self.violentally_executed_self = True self.title_card.tick() if (self.title_card.displaying()): self.texture = self.determine_texture() self.physics_suspended = True self.vx = 0 self.vy = 0 self.v = [0.0, 0.0] if not self.in_editor: return True self.telekineFlash *= 0.95 self.potionFlash *= 0.95 teleportRecharge = 0.09 if (self.teleportAmt < 100.0): self.teleportAmt += teleportRecharge if self.floor.camera.cinema_target: self.physics_suspended = True self.vx = 0 self.vy = 0 self.v = [0.0, 0.0] return True self.physics_suspended = False if (self.flash_color[3] > 0.1): self.flash_color[3] *= 0.95 else: self.flash_color[3] *= 0.0 if (self.active_terminal): if (self.terminal_size < 1.0): self.terminal_size = (self.terminal_size * 0.9) + 0.1 if self.terminal_size > 0.99: self.terminal_size = 1.0 else: if (self.terminal_size > 0): self.terminal_size = (self.terminal_size * 0.78) if (self.terminal_size < 0.01): self.terminal_size = 0.0 self.sword_swing -= 1 if (self.run_stamina < 0): self.run_stamina = 0 if self.get_camera().cinema_target is not None: return if (self.ability_timeout > 0): self.ability_timeout -= 1 self.handle_ability() return True self.hittable_hint_real = (self.hittable_hint_real * 0.99) + (self.hittable_hint_impulse * 0.01) self.hittable_hint_impulse *= 0.98 if (self.LEFT_PRESSED): self.sel_invslot -= 1 if (self.sel_invslot < 0): self.sel_invslot = self.max_invslots - 1 if (self.RIGHT_PRESSED): self.sel_invslot += 1 if (self.sel_invslot == self.max_invslots): self.sel_invslot = 0 PlayerInvSlot.tick() self.dm_msg_cooldown += 1 if self.dm_msg_cooldown > 300: self.deq_dm_message() self.dm_msg_cooldown = 0 self.gun.tick() #player tick if self.got_time > 0: self.got_time -= 1 self.subtick = (self.subtick + 1) % 60 #if(self.run_stamina<=1.0): # self.add_dm_message("You over exerted yourself") self.invuln_frames -= 1 if (self.shield_frames > 0): self.shield_frames -= 1 KPlayer.BirdmanTick = KPlayer.BirdmanTick + 1 self.snap_animation_buffer -= 1 if (self.snap_animation_buffer > 0): self.display_p[0] = (self.display_p[0] * 0.87) + (self.p[0] * 0.13) self.display_p[1] = (self.display_p[1] * 0.87) + (self.p[1] * 0.13) if (self.combo_reset_cooldown > 0): self.combo_reset_cooldown = self.combo_reset_cooldown - 1 else: self.combo_count = 0 self.link_count = 0 self.last_link = None self.critical_hit_display_counter = self.critical_hit_display_counter - 1 self.snap_cooldown = self.snap_cooldown - 1 self.hud_message_timeout = self.hud_message_timeout - 1 self.stimer = self.stimer + 1 self.cardtick = self.cardtick + 0.01 self.heartcard.tick() self.swordcard.tick() self.wandcard.tick() self.telekinecard.tick() self.potioncard.tick() self.guncard.tick() self.pumped_dashcombo = False if (self.hp < 0): #self.light_type = Object.LightTypes.DYNAMIC_SHADOWCASTER #self.light_color = [ 1.0,0.0,0.0,1.0] #self.light_radius = 100 self.texture = BGL.assets.get('KT-player/texture/skeleton') self.size = [2.0, 2.0] self.rad = atan2(self.p[0] - self.snapshot['p'][0], self.p[1] - self.snapshot['p'][1]) return True else: pass #self.light_color = [ 1.0,0.8,0.8,1.0 ] #self.light_radius = 15 pad = self.controllers.get_virtualized_pad(self.num) self.map_controller_state(pad) used_term = self.route_terminal_input() if used_term: print("USED TERMINAL") self.A_PRESSED = False self.B_PRESSED = False self.UP_PRESSED = False self.DOWN_PRESSED = False self.LEFT_PRESSED = False self.RIGHT_PRESSED = False if self.A_PRESSED: if Abilities.Sword: if self.slash.slash(): self.run_animation_subtick = 0 self.run_animation_alt = 1 #self.add_dm_message("You swung your sword") #print("a pressed") #self.state = KPlayer.STATE_FIRING self.dch_cooldown -= 1 if self.snap_cooldown < 0: #if (self.X_PRESSED and self.link_count>0) or ( (self.sword.state == Sword.STATE_CHARGING) and (self.sword.stimer == 10)): if (self.X_PRESSED) or ( (self.sword.state == Sword.STATE_CHARGING) and (self.sword.stimer == 10)) or (self.sword.state == Sword.STATE_DISCHARGING and self.dch_cooldown == 0): self.dch_cooldown = 17 self.attempt_snap_attack() self.snap_cooldown = 4 if (abs(pad.left_stick[0]) > 0.003) or (abs(pad.left_stick[1]) > 0.003): self.walk_tick = self.walk_tick + 1 if (self.walk_tick % 100 == 1): KSounds.play(choice([KSounds.walk1, KSounds.walk2])) if (self.walk_tick > 400): self.walk_tick = 0 else: self.walk_tick = 0 if (self.state == KPlayer.STATE_STUNNED): self.v[0] = self.v[0] * 0.4 self.v[1] = self.v[1] * 0.4 #if(self.attack_object): # self.v[0] = self.v[0] + (self.attack_object.v[0]*4) # self.v[1] = self.v[1] + (self.attack_object.v[1]*4) if self.stimer > 15: self.attack_object = None self.set_state(KPlayer.STATE_DEFAULT) if (self.state == KPlayer.STATE_DODGING): self.invisible_frames = 19 #also makes invuln for x in range(0, 5): spltr = Bird(p=[ self.p[0] + uniform(0.0, self.size[0]), self.p[1] + uniform(-4.0, 4.0) ]) spltr.color = [0.0, 0.0, 0.0, 1.0] spltr.light_color = [0.0, 1.0, 0.0, 1.0] spltr.size[0] *= uniform(1.0, 1.5) self.floor.create_object(spltr) #self.visible = False #self.invuln_frames = 1 self.v[0] += self.dv[0] * 1.8 self.v[1] += self.dv[1] * 1.8 self.dv[0] *= 0.6 self.dv[1] *= 0.6 if (self.sword.state is not Sword.STATE_IDLE): self.set_state(KPlayer.STATE_DEFAULT) if (self.stimer > 6): self.visible = True self.set_state(KPlayer.STATE_DEFAULT) if (self.state == KPlayer.STATE_FIRING): self.fire_timer = self.fire_timer + 1 self.v[0] = self.v[0] * 0.4 self.v[1] = self.v[1] * 0.4 delta = [pad.left_stick[0], pad.left_stick[1]] self.v[0] = self.v[0] + (delta[0] * 0.2) self.v[1] = self.v[1] + (delta[1] * 0.2) self.rad = atan2(self.v[1], self.v[0]) if (self.fire_timer > 8): self.lazer_beam.visible = True self.lazer_beam.size[1] *= 1.15 #if(self.fire_timer==20): # self.attempt_snap_attack(False) if (self.fire_timer > 40): self.lazer_beam.size[1] = 0.1 self.lazer_beam.visible = False self.fire_timer = 0 self.state = KPlayer.STATE_DEFAULT if (self.state == KPlayer.STATE_DEFAULT): if not pad.button_down(BGL.gamepads.buttons.B): self.can_backstep = True if (Abilities.Dash and pad.button_down(BGL.gamepads.buttons.B) and self.can_backstep and self.sword.state == Sword.STATE_IDLE): if (self.stimer > 30): if (self.run_stamina > 5): self.run_stamina -= 5 delta = [pad.left_stick[0], pad.left_stick[1]] self.dv = [ delta[0] * self.speed, delta[1] * self.speed ] self.can_backstep = False self.set_state(KPlayer.STATE_DODGING) #self.attempt_snap_attack() self.combo_reset_cooldown = 60 * KPlayer.ComboSecs if (self.link_count == 0): self.link_count = 1 self.flash_color = [1.0, 1.0, 1.0, 1.0] KSounds.play(KSounds.dash) calc_speed = self.speed if (self.run_stamina < 1.0): self.flash_color = [1.0, 0.6, 0.6, 1.0] calc_speed *= 0.2 if (self.RB_DOWN and Abilities.Dash): if (self.run_stamina > 0.0): self.running = True self.stamina_recharge_buffer = 10.0 self.run_stamina -= 0.45 rs1 = self.run_stamina / 75.0 rs2 = rs1 * rs1 mod1 = 0.8 * rs1 mod2 = 1.1 * rs2 calc_speed *= 1.0 + (mod1 + mod2) if (self.slash.visible): mod1 *= 1.5 else: self.stamina_recharge_buffer -= 0.2 if (self.stamina_recharge_buffer < 0.0): if (self.run_stamina < 100.0): self.run_stamina += 1.0 self.dash_flash = False if (self.sword.state == Sword.STATE_CHARGING): calc_speed = self.speed * 0.5 if (self.sword.state == Sword.STATE_DISCHARGING): self.dash_flash = True calc_speed = self.speed * 4.0 if (self.sword.state == Sword.STATE_ATTACK_PENDING): self.dash_flash = True calc_speed = self.speed * 0.001 #if(self.aiming_beam.aiming): # calc_speed = calc_speed * 0.5 self.filtered_speed = (self.filtered_speed * 0.8) + (calc_speed * 0.2) #if(self.state == KPlayer.STATE_FIRING): # self.v[0] = self.v[0] * 0.01 # self.v[1] = self.v[1] * 0.01 calc_speed = self.filtered_speed Object.tick(self) pad = self.controllers.get_virtualized_pad(self.num) #delta = [0.0,0.0] #self.v[0] = self.v[0]*0.8+delta[0]*0.2 #self.v[1] = self.v[1]*0.8+delta[1]*0.2 delta = [ pad.left_stick[0] * calc_speed, pad.left_stick[1] * calc_speed ] self.v[0] = self.v[0] * 0.8 + delta[0] * 0.2 self.v[1] = self.v[1] * 0.8 + delta[1] * 0.2 self.rad = atan2(self.v[1], self.v[0]) self.texture = self.determine_texture() if (self.snap_cooldown > 0): self.v[0] = 0 self.v[1] = 0 if (self.snap_attack_frozen): self.v[0] = 0 self.v[1] = 0 if (self.attack_physics_timer > 0 and self.attack_object): #the and here is a hack around a bug print("TRYING TO APPLY ATTACK REBOUND") self.attack_physics_timer = self.attack_physics_timer - 1 print(self.attack_object.v) self.v[0] = (self.v[0] * 0.2) + (self.attack_object.vx * 2) self.v[1] = (self.v[1] * 0.2) + (self.attack_object.vy * 2) else: self.attack_object = None if (self.hurt_flash_timer > 0): self.color = [1.0, 0.0, 0.0, 1.0] self.hurt_flash_timer -= 1 elif (self.link_count > 0): self.color = [1.0, 1.0, 0.7, 1.0] else: self.color = [1.0, 1.0, 1.0, 1.0] if (self.slash.visible): self.v[0] *= 1.05 self.v[1] *= 1.05 if (abs(self.v[0]) + abs(self.v[1]) > 0.5): if uniform(0.0, 1.0) > 0.98: self.floor.create_object( Dust(p=[self.p[0], self.p[1] + 0.8])) Object.tick(self) if self.invisible_frames > 0: self.invisible_frames -= 1 self.invuln_frames = 2 self.visible = False else: self.visible = True
def __init__(self,**kwargs): Object.__init__(self,**kwargs)