def create_spawner_house(dispatcher, atlas, x, y): house = Entity('house') house.add_component( WidgetComponent(dispatcher, Widget(*atlas.get_element('spawner')))) house.add_component(DestructorComponent(dispatcher)) house.add_component(PositionComponent(dispatcher, x, y)) dispatcher.add_event(BearEvent('ecs_create', house)) dispatcher.add_event( BearEvent('ecs_add', (house.id, house.position.x, house.position.y)))
def create_bullet(dispatcher, entity_id, x, y, vx, vy): bullet = Entity(entity_id) bullet.add_component( WidgetComponent(dispatcher, Widget([['*']], [['red']]))) bullet.add_component(PositionComponent(dispatcher, x, y, vx, vy)) bullet.add_component(ProjectileCollisionComponent(dispatcher, damage=1)) bullet.add_component(DestructorComponent(dispatcher)) dispatcher.add_event(BearEvent('ecs_create', bullet)) dispatcher.add_event( BearEvent('ecs_add', (bullet.id, bullet.position.x, bullet.position.y))) return bullet
def create_cop(atlas, dispatcher, x, y): """ Create a cop entity :param dispatcher: :return: """ cop_entity = Entity(id='cop') t = Widget(*atlas.get_element('cop_r')) widget = deserialize_widget(repr(t)) widget_component = WidgetComponent(dispatcher, widget, owner=cop_entity) position_component = WalkerComponent(dispatcher, x=x, y=y, owner=cop_entity) collision = WalkerCollisionComponent(dispatcher, owner=cop_entity) passing = PassingComponent(dispatcher, shadow_pos=(0, 15), shadow_size=(13, 3), owner=cop_entity) dispatcher.add_event( BearEvent(event_type='ecs_create', event_value=cop_entity)) dispatcher.add_event( BearEvent(event_type='ecs_add', event_value=('cop', x, y)))
create_wall(dispatcher, atlas, f'wall{x}{y}', x * 6, y * 6) # Spawner house is just an image. It doesn't even collide. create_spawner_house(dispatcher, atlas, 35, 0) # Actual spawning is done by this invisible listener: spawner = SpawnerListener(dispatcher=dispatcher, atlas=atlas, x=36, y=1, cooldown=5.0, enemies=3) dispatcher.register_listener(spawner, ['tick', 'ecs_destroy']) # These two are sidebar widgets, which can accept the events but are outside the # ECSLayout (ie game map) score = ScoreLabel(terminal) dispatcher.register_listener(score, 'ecs_destroy') hp = HPLabel(terminal) dispatcher.register_listener(hp, 'ac_damage') # And this listener should display the GAME OVER widget gameover_widget = Widget(*atlas.get_element('game_over')) gameover_listener = GameOverListener(terminal, widget=gameover_widget) dispatcher.register_listener(gameover_listener, 'ecs_destroy') ################################################################################ # Launching ################################################################################ terminal.start() terminal.add_widget(layout) terminal.add_widget(score, pos=(85, 10)) terminal.add_widget(hp, pos=(85, 15)) loop.run()
def init_game(): """ Initalize all game variables and objects. :return: """ global atlas global field global building global tetris global figures global t global attractor global attractor2 global emitter global initial_figure global score global loop global dispatcher field = GravityField((60, 45)) building = BuildingWidget((60, 45)) tetris = TetrisSystem((60, 45)) figures = FigureManager(field=field, tetris=tetris, dispatcher=dispatcher, building=building, atlas=atlas) figures.register_terminal(t) dispatcher.register_listener( figures, ['request_destruction', 'request_installation']) dispatcher.register_listener(building, ['square', 'h7', 'v7']) sound = SoundListener({ 'fly_away': 'Fly.wav', 'explosion': 'Explosion.wav', 'connect': 'Connect.wav', 'fail': 'Fail.wav' }) dispatcher.register_listener(sound, 'play_sound') # The construction's start building.add_figure( Widget([[' ', '*', ' '], ['*', '*', '*'], [' ', '*', ' ']], [['blue', 'blue', 'blue'], ['blue', 'blue', 'blue'], ['blue', 'blue', 'blue']]), pos=(29, 20)) tetris[30][20] = 1 tetris[29][21] = 1 tetris[30][21] = 1 tetris[31][21] = 1 tetris[30][22] = 1 # Emitter and attractors attractor = Attractor(*atlas.get_element('attractor'), field=field, mass=150) field.add_attractor(attractor, (10, 25)) attractor2 = Attractor(*atlas.get_element('attractor'), field=field, mass=150) field.add_attractor(attractor2, (50, 25)) dispatcher.register_listener(attractor, ['misc_input', 'key_up', 'key_down']) dispatcher.register_listener(attractor2, ['misc_input', 'key_up', 'key_down']) emitter = EmitterWidget(*atlas.get_element('emitter'), manager=figures, dispatcher=dispatcher, tetris=tetris) dispatcher.register_listener( emitter, ['tick', 'service', 'request_installation', 'request_destruction']) initial_figure = figures.create_figure() dispatcher.register_listener(initial_figure, 'tick') score = ScoreCounter() dispatcher.register_listener(score, ['h7', 'v7', 'square']) # Adding stuff t.add_widget(score, pos=(39, 47), layer=1) t.add_widget(building, pos=(0, 0), layer=0) t.add_widget(attractor, pos=(10, 25), layer=1) t.add_widget(attractor2, pos=(50, 25), layer=3) t.add_widget(emitter, pos=(40, 40), layer=4) t.add_widget(initial_figure, pos=(25, 40), layer=6) dispatcher.add_event( BearEvent(event_type='request_destruction', event_value=initial_figure))
dispatcher.register_listener(closing, ['misc_input', 'tick']) # Game objects # Init here so that the same objects can be reused (and safely created and # destroyed) between multiple games atlas = Atlas(XpLoader('indirectris.xp'), 'indirectris.json') field = None building = None tetris = None figures = None attractor = None attractor2 = None emitter = None score = None initial_figure = None sound = None # Debug stuff r = Refresher(t) restart = RestartButton('RESTART', color='#ff0000ff') losing = LosingListener(t, Widget(*atlas.get_element('loss'))) dispatcher.register_listener(losing, 'game_lost') dispatcher.register_listener(r, 'service') dispatcher.register_listener(restart, 'key_down') t.start() init_game() t.add_widget(Widget(*atlas.get_element('bottom_bar')), pos=(0, 45), layer=0) t.add_widget(restart, pos=(49, 47), layer=1) loop.run()
def update_bg(self, color): new_bg = Widget(copy_shape(self.chars, '.'), copy_shape(self.colors, color)) self.background = new_bg
t = BearTerminal(size='50x45', title='Test window', filter=['keyboard', 'mouse']) dispatcher = BearEventDispatcher() loop = BearLoop(t, dispatcher) dispatcher.register_listener(ClosingListener(), ['misc_input', 'tick']) # Fireworks box box = FireworkBox([['.' for x in range(38)] for x in range(10)], [['gray' for x in range(38)] for x in range(10)], dispatcher) dispatcher.register_listener(box, ['key_down', 'service']) # A tank, TXTLoader test loader = TxtLoader('bear_hug/demo_assets/tank.txt') tank1 = Widget(*loader.get_image_region(0, 0, 5, 6)) tank2 = Widget(*loader.get_image_region(6, 0, 5, 6)) # XPLoader tests # A tree without layer2 apples xploader = XpLoader('bear_hug/demo_assets/tree_lamp.xp') lamp = Widget(*xploader.get_image_region(7, 1, 7, 8)) # Monitor, with BG loaded from XP atlas and widgets added in monitor.__init__ atlas = Atlas(XpLoader('bear_hug/demo_assets/test_atlas.xp'), 'bear_hug/demo_assets/test_atlas.json') monitor = DevMonitor(*atlas.get_element('dev_bg'), dispatcher) dispatcher.register_listener(monitor, ['tick', 'service']) # Barrel, an animation test anim = Animation(