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