def _swingSword(self): self.setSpriteAnimation(SKELETON_ANI_DICT[self.facing][0][1]) self.Schedule(self._finishSwordSwing, SKELETON_SWING_FOLLOW_THROUGH_TIME) if self.facing in {DIRECTION_UP, DIRECTION_DOWN}: hitbox_x_left = self.getPos()[0] - SKELETON_SWING_HITBOX_WIDE / 2 hitbox_x_right = hitbox_x_left + SKELETON_SWING_HITBOX_WIDE if self.facing == DIRECTION_UP: hitbox_y_top = self.getPos()[1] + SKELETON_SWING_HITBOX_FAR hitbox_y_bottom = self.getPos()[1] else: hitbox_y_top = self.getPos()[1] hitbox_y_bottom = self.getPos()[1] - SKELETON_SWING_HITBOX_FAR else: hitbox_y_bottom = self.getPos()[1] - SKELETON_SWING_HITBOX_WIDE / 2 hitbox_y_top = hitbox_y_bottom + SKELETON_SWING_HITBOX_WIDE if self.facing == DIRECTION_RIGHT: hitbox_x_left = self.getPos()[0] hitbox_x_right = self.getPos()[0] + SKELETON_SWING_HITBOX_FAR else: hitbox_x_left = self.getPos()[0] - SKELETON_SWING_HITBOX_FAR hitbox_x_right = self.getPos()[0] x, y = self.mappe.getPlayerActor().getPos() if x >= hitbox_x_left and x <= hitbox_x_right and y >= hitbox_y_bottom and y <= hitbox_y_top: customEvent(PLAYER_HURT_PLAYER_EVENT, *self.getPos())
def checkForPlayerToSave(self): pactor = self.mappe.getPlayerActor() x, y = map(operator.sub, pactor.getPos(), self.getPos()) if abs(x) + abs(y) <= SAVE_DISTANCE: self.Unschedule(self.checkForPlayerToSave) playSound(SOUND_SAVE, True) customEvent(PUSH_SAVE_EVENT) customEvent(PLAYER_MAX_HP_EVENT)
def checkPlayerCollision(self): if not self.isHurt() and not self.mappe.getPlayerActor().isCharging( ) and not self.isStunned(): distance = reduce( lambda x, y: abs(x) + abs(y), map(operator.sub, self.getPos(), self.mappe.getPlayerActor().getPos())) if distance <= COLLISION_DISTANCE: customEvent(PLAYER_HURT_PLAYER_EVENT, *self.getPos())
def _fireHeldKeyEvents(): binds = settings.getValue(DYNAMIC_SETTINGS_KEY_BINDS) for key in _held_keys: args = [] if key in (KAI_KEY_MOUSE_LEFT, KAI_KEY_MOUSE_RIGHT): args = list(getMousePosition()) key += INPUT_EVENT_TYPE_HOLD try: args.insert(0,binds[key]) except KeyError: pass else: customEvent(*args)
def checkPlayerCollision(self): if not self.isHurt() and not self.mappe.getPlayerActor( ).charging_forward and not self.isStunned(): distance = reduce( lambda x, y: abs(x) + abs(y), map(operator.sub, self.getPos(), self.mappe.getPlayerActor().getPos())) if self.charging_forward: col_distance = MINOTAUR_CHARGING_COLLISION_DISTANCE else: col_distance = COLLISION_DISTANCE if distance <= col_distance: customEvent(PLAYER_HURT_PLAYER_EVENT, *self.getPos())
def hurtPlayer(self, x, y): if not self.hurt: self._chargeFinish() #just in case self._finishSwordSwing() self.setHurt(90) self.setKnockbackVel(x, y, HURT_KNOCKBACK_VEL) self.hurt_control_loss = True playSound(SOUND_HIT_PLAYER, True) customEvent(PLAYER_REDUCE_HP_EVENT) if callQuery(CHECK_PLAYER_DEAD_QUERY): self.setVelocity(0, 0) self.Schedule(self._vanishForever, 91) self.Unschedule(self._endHurt) else: self.Schedule(self._regainHurtControl, HURT_CONTROL_LOSS_TIME)
def relayBinding(kai_key, *args, **kwargs): binds = settings.getValue(DYNAMIC_SETTINGS_KEY_BINDS) try: bind = binds[(kai_key + event_type)] except KeyError: pass else: hold_func(kai_key) return customEvent(bind, *args, **kwargs)
def updateScreenTransitions(self): if not self.mappe.getScreenTransitioning(): x, y = self.getSpriteScreenPosition() if x < SCREEN_BOUNDARIES: customEvent(START_SCREEN_TRANSITION_EVENT, DIRECTION_LEFT) elif x > MAP_SIZE[0] - SCREEN_BOUNDARIES: customEvent(START_SCREEN_TRANSITION_EVENT, DIRECTION_RIGHT) elif y > MAP_SIZE[1] - SCREEN_BOUNDARIES: customEvent(START_SCREEN_TRANSITION_EVENT, DIRECTION_UP) elif y < SCREEN_BOUNDARIES: customEvent(START_SCREEN_TRANSITION_EVENT, DIRECTION_DOWN)
def updateHitSomething(self): if not self.hit_something: for enemy in self.mappe.getEnemyActors(): distance = reduce( lambda x, y: abs(x) + abs(y), map(operator.sub, self.getPos(), enemy.getPos())) if distance <= COLLISION_DISTANCE: enemy_index = enemy.getEnemyIndex() if enemy_index: customEvent(PLAYER_FORM_CHANGE_EVENT, enemy.getEnemyIndex()) playSound(SOUND_POWERUP, True) self._hitSomething() return if self.checkCollision(): playSound(SOUND_POP, True) self._hitSomething() return if self.checkSpriteOffscreen(): playSound(SOUND_POP, True) self._hitSomething() return
def getEventCaller(self, key, *args, **kwargs): #convenience function for delaying a custom event return lambda: customEvent(key, *args, **kwargs)
def checkOffscreen(self): if self.getPos( )[0] > getWindowDimensionsScaled()[0] + OFFSCREEN_BUFFER: customEvent(REMOVE_BOULDER_EVENT, self.index)
def _relayEventFromServer(key, json_object): customEvent(_SERVER_EVENT_PREFIX + key, json_object)
def callFlagListeners(self, anikey, flag, frames): for frame in frames: customEvent(self.generateAniKeyFlag(anikey, flag))
def callFinishListeners(self, anikey): customEvent(self.generateAniKeyFinish(anikey))
def callTimeListeners(self,anikey, times): for time in times: customEvent(self.generateAniKeyTime(anikey, time))
def callFrameListeners(self, anikey, frames): for frame in frames: customEvent(self.generateAniKeyFrame(anikey, frame))
def collectSquid(self): playSound(SOUND_COLLECT_SQUID, True) customEvent(FINAL_SQUID_OBTAINED_EVENT) self.cleanupSelf()
def respondKeyPress(self, symbol, modifiers): if keyMatches(CANCEL, symbol): customEvent(PLAYER_JUMP_EVENT) return False
def _vanishForever(self): self.setSpriteAlpha(0.0) self.Unschedule(self._hurtFlash) customEvent(GAME_LOST_EVENT)
def _relayEventFromClient(key, client_id, json_object): customEvent(_CLIENT_EVENT_PREFIX + key, client_id, json_object)
def collectSquid(self): playSound(SOUND_COLLECT_SQUID, True) customEvent(SQUID_TROPHY_OBTAINED_EVENT, self.getSquidTrophyIndex()) self.cleanupSelf()