1 /*
2  * door.c - door
3  * Copyright (C) 2010  Alexandre Martins <alemartf(at)gmail(dot)com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 #include "door.h"
21 #include "../../core/util.h"
22 #include "../../core/audio.h"
23 #include "../../core/timer.h"
24 #include "../../core/soundfactory.h"
25 #include "../player.h"
26 #include "../enemy.h"
27 
28 /* door class */
29 typedef struct door_t door_t;
30 struct door_t {
31     item_t item; /* base class */
32     int is_closed; /* is the door closed? */
33 };
34 
35 static void door_init(item_t *item);
36 static void door_release(item_t* item);
37 static void door_update(item_t* item, player_t** team, int team_size, brick_list_t* brick_list, item_list_t* item_list, enemy_list_t* enemy_list);
38 static void door_render(item_t* item, v2d_t camera_position);
39 
40 
41 
42 /* public methods */
door_create()43 item_t* door_create()
44 {
45     item_t *item = mallocx(sizeof(door_t));
46 
47     item->init = door_init;
48     item->release = door_release;
49     item->update = door_update;
50     item->render = door_render;
51 
52     return item;
53 }
54 
door_open(item_t * door)55 void door_open(item_t *door)
56 {
57     door_t *me = (door_t*)door;
58     me->is_closed = FALSE;
59     sound_play( soundfactory_get("open door") );
60 }
61 
door_close(item_t * door)62 void door_close(item_t *door)
63 {
64     door_t *me = (door_t*)door;
65     me->is_closed = TRUE;
66     sound_play( soundfactory_get("close door") );
67 }
68 
69 
70 /* private methods */
door_init(item_t * item)71 void door_init(item_t *item)
72 {
73     door_t *me = (door_t*)item;
74 
75     item->obstacle = TRUE;
76     item->bring_to_back = TRUE;
77     item->preserve = TRUE;
78     item->actor = actor_create();
79 
80     me->is_closed = TRUE;
81     actor_change_animation(item->actor, sprite_get_animation("SD_DOOR", 0));
82 }
83 
84 
85 
door_release(item_t * item)86 void door_release(item_t* item)
87 {
88     actor_destroy(item->actor);
89 }
90 
91 
92 
door_update(item_t * item,player_t ** team,int team_size,brick_list_t * brick_list,item_list_t * item_list,enemy_list_t * enemy_list)93 void door_update(item_t* item, player_t** team, int team_size, brick_list_t* brick_list, item_list_t* item_list, enemy_list_t* enemy_list)
94 {
95     door_t *me = (door_t*)item;
96     actor_t *act = item->actor;
97     float speed = 2000.0f;
98     float dt = timer_get_delta();
99 
100     if(me->is_closed)
101         act->position.y = min(act->position.y + speed*dt, act->spawn_point.y);
102     else
103         act->position.y = max(act->position.y - speed*dt, act->spawn_point.y - actor_image(act)->h * 0.8);
104 }
105 
106 
door_render(item_t * item,v2d_t camera_position)107 void door_render(item_t* item, v2d_t camera_position)
108 {
109     actor_render(item->actor, camera_position);
110 }
111 
112