2011-04-29 10:26:37 +02:00
|
|
|
/*
|
|
|
|
* This software is licensed under the terms of the MIT-License
|
2017-02-11 04:52:08 +01:00
|
|
|
* See COPYING for further information.
|
2011-04-29 10:26:37 +02:00
|
|
|
* ---
|
2011-06-26 16:10:13 +02:00
|
|
|
* Copyright (C) 2011, Lukas Weber <laochailan@web.de>, Juergen Kieslich
|
2011-04-29 10:26:37 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "item.h"
|
|
|
|
#include "global.h"
|
|
|
|
#include "list.h"
|
|
|
|
|
2017-03-19 04:09:41 +01:00
|
|
|
Item *create_item(complex pos, complex v, ItemType type) {
|
|
|
|
Item *e, **d, **dest = &global.items;
|
|
|
|
|
|
|
|
for(e = *dest; e && e->next; e = e->next)
|
|
|
|
if(e->prev && type < e->type)
|
|
|
|
break;
|
|
|
|
|
|
|
|
if(e == NULL)
|
|
|
|
d = dest;
|
|
|
|
else
|
|
|
|
d = &e;
|
|
|
|
|
|
|
|
Item *i = create_element((void **)d, sizeof(Item));
|
2011-04-29 10:26:37 +02:00
|
|
|
i->pos = pos;
|
|
|
|
i->pos0 = pos;
|
|
|
|
i->v = v;
|
|
|
|
i->birthtime = global.frames;
|
|
|
|
i->auto_collect = 0;
|
|
|
|
i->type = type;
|
2017-02-11 04:52:08 +01:00
|
|
|
|
2011-05-13 19:03:02 +02:00
|
|
|
return i;
|
2011-04-29 10:26:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void delete_item(Item *item) {
|
|
|
|
delete_element((void **)&global.items, item);
|
|
|
|
}
|
|
|
|
|
2012-08-10 22:08:51 +02:00
|
|
|
void draw_items(void) {
|
2011-04-29 10:26:37 +02:00
|
|
|
Item *p;
|
|
|
|
Texture *tex = NULL;
|
2011-05-13 19:03:02 +02:00
|
|
|
for(p = global.items; p; p = p->next) {
|
|
|
|
switch(p->type){
|
|
|
|
case Power:
|
2017-02-06 00:15:18 +01:00
|
|
|
tex = get_tex("items/power");
|
|
|
|
break;
|
2011-05-13 19:03:02 +02:00
|
|
|
case Point:
|
|
|
|
tex = get_tex("items/point");
|
|
|
|
break;
|
|
|
|
case Life:
|
|
|
|
tex = get_tex("items/life");
|
|
|
|
break;
|
|
|
|
case Bomb:
|
|
|
|
tex = get_tex("items/bomb");
|
|
|
|
break;
|
2017-03-24 20:42:56 +01:00
|
|
|
case LifeFrag:
|
|
|
|
tex = get_tex("items/lifefrag");
|
|
|
|
break;
|
|
|
|
case BombFrag:
|
|
|
|
tex = get_tex("items/bombfrag");
|
|
|
|
break;
|
2011-05-13 19:03:02 +02:00
|
|
|
case BPoint:
|
|
|
|
tex = get_tex("items/bullet_point");
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2011-04-29 10:26:37 +02:00
|
|
|
draw_texture_p(creal(p->pos), cimag(p->pos), tex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-08-10 22:08:51 +02:00
|
|
|
void delete_items(void) {
|
2011-04-29 10:26:37 +02:00
|
|
|
delete_all_elements((void **)&global.items, delete_element);
|
|
|
|
}
|
|
|
|
|
|
|
|
void move_item(Item *i) {
|
|
|
|
int t = global.frames - i->birthtime;
|
2017-02-23 11:39:31 +01:00
|
|
|
complex lim = 0 + 2.0*I;
|
2017-02-11 04:52:08 +01:00
|
|
|
|
|
|
|
if(i->auto_collect)
|
2011-05-13 19:03:02 +02:00
|
|
|
i->pos -= (7+i->auto_collect)*cexp(I*carg(i->pos - global.plr.pos));
|
2011-04-29 10:26:37 +02:00
|
|
|
else
|
|
|
|
i->pos = i->pos0 + log(t/5.0 + 1)*5*(i->v + lim) + lim*t;
|
|
|
|
}
|
|
|
|
|
2012-08-10 22:08:51 +02:00
|
|
|
void process_items(void) {
|
2011-04-29 10:26:37 +02:00
|
|
|
Item *item = global.items, *del = NULL;
|
|
|
|
int v;
|
2017-02-11 04:52:08 +01:00
|
|
|
|
2011-06-28 19:23:02 +02:00
|
|
|
float r = 30;
|
2017-03-06 15:24:57 +01:00
|
|
|
if(global.plr.inputflags & INFLAG_FOCUS)
|
2011-06-28 19:23:02 +02:00
|
|
|
r *= 2;
|
2017-02-11 04:52:08 +01:00
|
|
|
|
2011-04-29 10:26:37 +02:00
|
|
|
while(item != NULL) {
|
2017-03-21 11:09:32 +01:00
|
|
|
if((item->type == Power && global.plr.power >= PLR_MAX_POWER) ||
|
2017-02-10 22:26:46 +01:00
|
|
|
// just in case we ever have some weird spell that spawns those...
|
|
|
|
(global.stage->type == STAGE_SPELL && (item->type == Life || item->type == Bomb))
|
|
|
|
) {
|
2017-02-06 00:15:18 +01:00
|
|
|
item->type = Point;
|
|
|
|
}
|
|
|
|
|
2011-06-28 19:23:02 +02:00
|
|
|
if(cimag(global.plr.pos) < POINT_OF_COLLECT || cabs(global.plr.pos - item->pos) < r
|
2011-04-29 10:26:37 +02:00
|
|
|
|| global.frames - global.plr.recovery < 0)
|
|
|
|
item->auto_collect = 1;
|
2017-02-11 04:52:08 +01:00
|
|
|
|
2011-04-29 10:26:37 +02:00
|
|
|
move_item(item);
|
2017-02-11 04:52:08 +01:00
|
|
|
|
2011-04-29 10:26:37 +02:00
|
|
|
v = collision_item(item);
|
|
|
|
if(v == 1) {
|
|
|
|
switch(item->type) {
|
|
|
|
case Power:
|
2012-08-21 13:50:11 +02:00
|
|
|
player_set_power(&global.plr, global.plr.power + POWER_VALUE);
|
2017-03-24 20:42:56 +01:00
|
|
|
play_sound("item_generic");
|
2011-04-29 10:26:37 +02:00
|
|
|
break;
|
|
|
|
case Point:
|
2017-02-15 18:34:47 +01:00
|
|
|
global.plr.points += 100;
|
2017-03-24 20:42:56 +01:00
|
|
|
play_sound("item_generic");
|
2011-04-29 10:26:37 +02:00
|
|
|
break;
|
2011-05-13 19:03:02 +02:00
|
|
|
case BPoint:
|
2017-02-15 18:34:47 +01:00
|
|
|
global.plr.points += 1;
|
2017-03-24 20:42:56 +01:00
|
|
|
play_sound("item_generic");
|
2011-05-13 19:03:02 +02:00
|
|
|
break;
|
2011-04-29 10:26:37 +02:00
|
|
|
case Life:
|
2017-03-21 11:09:32 +01:00
|
|
|
player_add_lives(&global.plr, 1);
|
2011-04-29 10:26:37 +02:00
|
|
|
break;
|
|
|
|
case Bomb:
|
2017-03-21 11:09:32 +01:00
|
|
|
player_add_bombs(&global.plr, 1);
|
2011-04-29 10:26:37 +02:00
|
|
|
break;
|
2017-03-24 20:42:56 +01:00
|
|
|
case LifeFrag:
|
|
|
|
player_add_life_fragments(&global.plr, 1);
|
|
|
|
break;
|
|
|
|
case BombFrag:
|
|
|
|
player_add_bomb_fragments(&global.plr, 1);
|
|
|
|
break;
|
2017-03-21 11:09:32 +01:00
|
|
|
}
|
2011-04-29 10:26:37 +02:00
|
|
|
}
|
2017-02-11 04:52:08 +01:00
|
|
|
|
2011-04-29 10:26:37 +02:00
|
|
|
if(v == 1 || creal(item->pos) < -9 || creal(item->pos) > VIEWPORT_W + 9
|
|
|
|
|| cimag(item->pos) > VIEWPORT_H + 8 ) {
|
|
|
|
del = item;
|
|
|
|
item = item->next;
|
|
|
|
delete_item(del);
|
|
|
|
} else {
|
|
|
|
item = item->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int collision_item(Item *i) {
|
2011-06-28 19:23:02 +02:00
|
|
|
if(cabs(global.plr.pos - i->pos) < 10)
|
2011-04-29 10:26:37 +02:00
|
|
|
return 1;
|
2017-02-11 04:52:08 +01:00
|
|
|
|
2011-04-29 10:26:37 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2011-06-27 13:36:35 +02:00
|
|
|
|
2017-03-19 04:09:41 +01:00
|
|
|
void spawn_item(complex pos, ItemType type) {
|
2012-08-04 03:25:43 +02:00
|
|
|
tsrand_fill(2);
|
2012-08-09 16:38:37 +02:00
|
|
|
create_item(pos, 5*cexp(I*tsrand_a(0)/afrand(1)*M_PI*2), type);
|
2011-06-28 19:23:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void spawn_items(complex pos, int point, int power, int bomb, int life) {
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < point; i++)
|
|
|
|
spawn_item(pos, Point);
|
2017-02-11 04:52:08 +01:00
|
|
|
|
2011-06-28 19:23:02 +02:00
|
|
|
for(i = 0; i < power; i++)
|
|
|
|
spawn_item(pos, Power);
|
2017-02-11 04:52:08 +01:00
|
|
|
|
2011-06-28 19:23:02 +02:00
|
|
|
for(i = 0; i < bomb; i++)
|
|
|
|
spawn_item(pos, Bomb);
|
2017-02-11 04:52:08 +01:00
|
|
|
|
2011-06-28 19:23:02 +02:00
|
|
|
for(i = 0; i < life; i++)
|
|
|
|
spawn_item(pos, Life);
|
2012-07-27 19:11:45 +02:00
|
|
|
}
|
2017-03-11 04:41:57 +01:00
|
|
|
|
|
|
|
void items_preload(void) {
|
|
|
|
preload_resources(RES_TEXTURE, RESF_PERMANENT,
|
|
|
|
"items/power",
|
|
|
|
"items/point",
|
|
|
|
"items/life",
|
|
|
|
"items/bomb",
|
2017-03-24 20:42:56 +01:00
|
|
|
"items/lifefrag",
|
|
|
|
"items/bombfrag",
|
2017-03-11 04:41:57 +01:00
|
|
|
"items/bullet_point",
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
preload_resources(RES_SFX, RESF_OPTIONAL,
|
|
|
|
"item_generic",
|
|
|
|
NULL);
|
|
|
|
}
|