mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2026-10-04 16:31:44 +00:00
shmup:: replaced monsters_at with content lists
This commit is contained in:
@@ -249,6 +249,7 @@ EX int dirdiff(int dd, int t) {
|
|||||||
EX int cellcount = 0;
|
EX int cellcount = 0;
|
||||||
|
|
||||||
EX void destroy_cell(cell *c) {
|
EX void destroy_cell(cell *c) {
|
||||||
|
while(c->contents) c->contents->unlist_and_unref();
|
||||||
tailored_delete(c);
|
tailored_delete(c);
|
||||||
cellcount--;
|
cellcount--;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -57,7 +57,6 @@ struct celldrawer {
|
|||||||
void draw();
|
void draw();
|
||||||
bool cell_clipped();
|
bool cell_clipped();
|
||||||
void draw_fallanims();
|
void draw_fallanims();
|
||||||
bool draw_shmup_monster();
|
|
||||||
void draw_gravity_particles();
|
void draw_gravity_particles();
|
||||||
|
|
||||||
void set_land_floor(const shiftmatrix& Vf);
|
void set_land_floor(const shiftmatrix& Vf);
|
||||||
@@ -2975,7 +2974,7 @@ void celldrawer::draw() {
|
|||||||
|
|
||||||
Vboat = Vd;
|
Vboat = Vd;
|
||||||
|
|
||||||
draw_shmup_monster();
|
FOR_LIST(li, c->contents) li->draw(self);
|
||||||
|
|
||||||
poly_outline = OUTLINE_DEFAULT;
|
poly_outline = OUTLINE_DEFAULT;
|
||||||
|
|
||||||
|
|||||||
+43
-1
@@ -22,6 +22,45 @@ extern int cellcount, heptacount;
|
|||||||
#define NOBARRIERS 127
|
#define NOBARRIERS 127
|
||||||
#define NOBARRIERS2 125
|
#define NOBARRIERS2 125
|
||||||
|
|
||||||
|
using cell_content_list = struct cell_content*;
|
||||||
|
|
||||||
|
namespace shmup { struct monster; }
|
||||||
|
|
||||||
|
struct cell_content {
|
||||||
|
cell_content *next;
|
||||||
|
cell_content_list *last;
|
||||||
|
virtual shmup::monster *as_monster() { return nullptr; }
|
||||||
|
|
||||||
|
void remove_from_list() {
|
||||||
|
if(last) { last[0] = next; next->last = last; next = nullptr; last = nullptr; }
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_to_list(cell_content_list& l) {
|
||||||
|
remove_from_list();
|
||||||
|
last = &l;
|
||||||
|
next = l;
|
||||||
|
next->last = &next;
|
||||||
|
l = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
int refs;
|
||||||
|
cell_content() { refs = 1; }
|
||||||
|
|
||||||
|
virtual ~cell_content() {
|
||||||
|
remove_from_list();
|
||||||
|
}
|
||||||
|
|
||||||
|
void unref() {
|
||||||
|
refs--;
|
||||||
|
if(!refs) delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void unlist_and_unref() { remove_from_list(); unref(); }
|
||||||
|
virtual void draw(struct celldrawer& cd) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define FOR_LIST(it, ml) for(cell_content *it = (ml); it; it = ml->next)
|
||||||
|
|
||||||
/** \brief Cell information for the game. struct cell builds on this */
|
/** \brief Cell information for the game. struct cell builds on this */
|
||||||
struct gcell {
|
struct gcell {
|
||||||
|
|
||||||
@@ -98,11 +137,14 @@ struct gcell {
|
|||||||
#ifdef CELLID
|
#ifdef CELLID
|
||||||
int cellid;
|
int cellid;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
cell_content_list contents;
|
||||||
|
|
||||||
gcell() {
|
gcell() {
|
||||||
#ifdef CELLID
|
#ifdef CELLID
|
||||||
cellid = cellcount;
|
cellid = cellcount;
|
||||||
#endif
|
#endif
|
||||||
|
contents = nullptr;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -67,12 +67,8 @@ EX void addradar(const shiftpoint h1, const shiftpoint h2, color_t col) {
|
|||||||
void celldrawer::drawcell_in_radar() {
|
void celldrawer::drawcell_in_radar() {
|
||||||
#if CAP_SHMUP
|
#if CAP_SHMUP
|
||||||
if(shmup::on) {
|
if(shmup::on) {
|
||||||
pair<shmup::mit, shmup::mit> p =
|
FOR_LIST(it, c->contents) if(shmup::monster *m = it->as_monster())
|
||||||
shmup::monstersAt.equal_range(c);
|
|
||||||
for(shmup::mit it = p.first; it != p.second; it++) {
|
|
||||||
shmup::monster* m = it->second;
|
|
||||||
addradar(V*m->at, minf[m->type].glyph, minf[m->type].color, 0xFF0000FF);
|
addradar(V*m->at, minf[m->type].glyph, minf[m->type].color, 0xFF0000FF);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if(c->monst)
|
if(c->monst)
|
||||||
|
|||||||
@@ -33,9 +33,13 @@ ld sqdist(shiftpoint a, shiftpoint b) {
|
|||||||
|
|
||||||
EX namespace shmup {
|
EX namespace shmup {
|
||||||
|
|
||||||
|
EX hookset<void(struct monster*)> hooks_destroy_monster;
|
||||||
|
|
||||||
#if HDR
|
#if HDR
|
||||||
|
|
||||||
struct monster : dim_listener {
|
extern struct monster *mousetarget, *lmousetarget;
|
||||||
|
|
||||||
|
struct monster : cell_content, dim_listener {
|
||||||
eMonster type;
|
eMonster type;
|
||||||
cell *base; ///< on which base cell this monster currently is
|
cell *base; ///< on which base cell this monster currently is
|
||||||
cell *torigin; ///< tortoises: origin, butterflies: last position
|
cell *torigin; ///< tortoises: origin, butterflies: last position
|
||||||
@@ -60,18 +64,19 @@ struct monster : dim_listener {
|
|||||||
bool isVirtual; ///< off the screen: gmatrix is unknown, and pat equals at
|
bool isVirtual; ///< off the screen: gmatrix is unknown, and pat equals at
|
||||||
hyperpoint inertia;///< for frictionless lands
|
hyperpoint inertia;///< for frictionless lands
|
||||||
|
|
||||||
int refs; ///< +1 for every reference (parent, lists of active monsters)
|
|
||||||
|
|
||||||
int split_owner; ///< in splitscreen mode, which player handles this
|
int split_owner; ///< in splitscreen mode, which player handles this
|
||||||
int split_tick; ///< in which tick was split_owner computed
|
int split_tick; ///< in which tick was split_owner computed
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
monster *as_monster() override { return this; }
|
||||||
|
void draw(celldrawer &cd) override;
|
||||||
|
|
||||||
monster() {
|
monster() {
|
||||||
reset();
|
reset();
|
||||||
refs = 1; split_tick = -1; split_owner = -1;
|
split_tick = -1; split_owner = -1;
|
||||||
no_targetting = false;
|
no_targetting = false;
|
||||||
dead = false; inBoat = false; parent = NULL;
|
dead = false; inBoat = false; parent = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
eMonster get_parenttype() { return parent ? parent->type : moNone; }
|
eMonster get_parenttype() { return parent ? parent->type : moNone; }
|
||||||
@@ -84,11 +89,15 @@ struct monster : dim_listener {
|
|||||||
|
|
||||||
void rebasePat(const shiftmatrix& new_pat, cell *tgt);
|
void rebasePat(const shiftmatrix& new_pat, cell *tgt);
|
||||||
|
|
||||||
void remove_reference();
|
~monster() {
|
||||||
|
if(mousetarget == this) mousetarget = nullptr;
|
||||||
|
if(lmousetarget == this) lmousetarget = nullptr;
|
||||||
|
callhooks(hooks_destroy_monster, this);
|
||||||
|
if(parent) parent->unref();
|
||||||
|
}
|
||||||
|
|
||||||
void set_parent(monster *par) {
|
void set_parent(monster *par) {
|
||||||
if(parent == par) return;
|
if(parent) parent->unref();
|
||||||
if(parent) parent->remove_reference();
|
|
||||||
parent = par;
|
parent = par;
|
||||||
parent->refs++;
|
parent->refs++;
|
||||||
}
|
}
|
||||||
@@ -117,22 +126,9 @@ EX eLand delayed_safety_land;
|
|||||||
|
|
||||||
bool lastdead = false;
|
bool lastdead = false;
|
||||||
|
|
||||||
EX multimap<cell*, monster*> monstersAt;
|
EX cell_content_list active;
|
||||||
|
|
||||||
#if HDR
|
EX vector<monster*> nonvirtual, additional;
|
||||||
typedef multimap<cell*, monster*>::iterator mit;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
EX vector<monster*> active, nonvirtual, additional;
|
|
||||||
|
|
||||||
void monster::remove_reference() {
|
|
||||||
refs--;
|
|
||||||
if(!refs) {
|
|
||||||
if(parent) parent->remove_reference();
|
|
||||||
nonvirtual.erase(std::remove(nonvirtual.begin(), nonvirtual.end(), this), nonvirtual.end());
|
|
||||||
delete this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cell *findbaseAround(shiftpoint p, cell *around, int maxsteps) {
|
cell *findbaseAround(shiftpoint p, cell *around, int maxsteps) {
|
||||||
|
|
||||||
@@ -170,9 +166,7 @@ cell *findbaseAround(const shiftmatrix& H, cell *around, int maxsteps) {
|
|||||||
return asinh(h[2]);
|
return asinh(h[2]);
|
||||||
} */
|
} */
|
||||||
|
|
||||||
void monster::store() {
|
void monster::store() { add_to_list(base->contents); }
|
||||||
monstersAt.insert(make_pair(base, this));
|
|
||||||
}
|
|
||||||
|
|
||||||
void monster::findpat() {
|
void monster::findpat() {
|
||||||
isVirtual = !gmatrix.count(base) || invalid_matrix(gmatrix[base].T);
|
isVirtual = !gmatrix.count(base) || invalid_matrix(gmatrix[base].T);
|
||||||
@@ -1565,8 +1559,10 @@ EX bool verifyTeleport() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define FOR_MONSTERS_IN_LIST(it, m, ml) FOR_LIST(it, ml) if(monster *m = it->as_monster())
|
||||||
|
|
||||||
void destroyMimics() {
|
void destroyMimics() {
|
||||||
for(monster *m: active)
|
FOR_MONSTERS_IN_LIST(it, m, active)
|
||||||
if(isMimic(m->type))
|
if(isMimic(m->type))
|
||||||
m->dead = true;
|
m->dead = true;
|
||||||
}
|
}
|
||||||
@@ -2568,15 +2564,11 @@ void moveMonster(monster *m, int delta) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void activateMonstersAt(cell *c) {
|
void activate_monsters_at(cell *c) {
|
||||||
pair<mit, mit> p =
|
auto p = &c->contents;
|
||||||
monstersAt.equal_range(c);
|
while(*p) {
|
||||||
for(mit it = p.first; it != p.second;) {
|
if(monster *m = (*p)->as_monster()) m->add_to_list(active);
|
||||||
mit itplus = it;
|
else p = &((*p)->next);
|
||||||
itplus++;
|
|
||||||
active.push_back(it->second);
|
|
||||||
monstersAt.erase(it);
|
|
||||||
it = itplus;
|
|
||||||
}
|
}
|
||||||
if(c->monst && isMimic(c->monst)) c->monst = moNone;
|
if(c->monst && isMimic(c->monst)) c->monst = moNone;
|
||||||
// mimics are awakened by awakenMimics
|
// mimics are awakened by awakenMimics
|
||||||
@@ -2596,22 +2588,10 @@ void activateMonstersAt(cell *c) {
|
|||||||
enemy->inertia = random_spin() * point2(SCALE/3000., 0);
|
enemy->inertia = random_spin() * point2(SCALE/3000., 0);
|
||||||
}
|
}
|
||||||
c->monst = moNone;
|
c->monst = moNone;
|
||||||
active.push_back(enemy);
|
enemy->add_to_list(active);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EX void fixStorage() {
|
|
||||||
|
|
||||||
vector<monster*> restore;
|
|
||||||
|
|
||||||
for(auto it = monstersAt.begin(); it != monstersAt.end(); it++)
|
|
||||||
restore.push_back(it->second);
|
|
||||||
|
|
||||||
monstersAt.clear();
|
|
||||||
|
|
||||||
for(monster *m: restore) m->store();
|
|
||||||
}
|
|
||||||
|
|
||||||
EX hookset<bool(int)> hooks_turn;
|
EX hookset<bool(int)> hooks_turn;
|
||||||
|
|
||||||
/** the amount of time chars are disabled in PvP */
|
/** the amount of time chars are disabled in PvP */
|
||||||
@@ -2687,28 +2667,24 @@ EX void turn(int delta) {
|
|||||||
|
|
||||||
// detect active monsters
|
// detect active monsters
|
||||||
if(doall)
|
if(doall)
|
||||||
for(cell *c: currentmap->allcells()) activateMonstersAt(c);
|
for(cell *c: currentmap->allcells()) activate_monsters_at(c);
|
||||||
else
|
else
|
||||||
for(auto& p: gmatrix)
|
for(auto& p: gmatrix)
|
||||||
activateMonstersAt(p.first);
|
activate_monsters_at(p.first);
|
||||||
|
|
||||||
/* printf("size: gmatrix = %ld, active = %ld, monstersAt = %ld, delta = %d\n",
|
|
||||||
gmatrix.size(), active.size(), monstersAt.size(),
|
|
||||||
delta); */
|
|
||||||
|
|
||||||
bool exists[motypes];
|
bool exists[motypes];
|
||||||
|
|
||||||
for(int i=0; i<motypes; i++) exists[i] = false;
|
for(int i=0; i<motypes; i++) exists[i] = false;
|
||||||
|
|
||||||
nonvirtual.clear();
|
nonvirtual.clear();
|
||||||
for(monster *m: active) {
|
FOR_MONSTERS_IN_LIST(it, m, active) {
|
||||||
m->findpat();
|
m->findpat();
|
||||||
if(m->isVirtual) continue;
|
if(m->isVirtual) continue;
|
||||||
else nonvirtual.push_back(m);
|
else nonvirtual.push_back(m);
|
||||||
exists[movegroup(m->type)] = true;
|
exists[movegroup(m->type)] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(monster *m: active) {
|
FOR_MONSTERS_IN_LIST(it, m, active) {
|
||||||
|
|
||||||
switch(m->type) {
|
switch(m->type) {
|
||||||
case moPlayer:
|
case moPlayer:
|
||||||
@@ -2724,7 +2700,7 @@ EX void turn(int delta) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(monster *m: active) {
|
FOR_MONSTERS_IN_LIST(it, m, active) {
|
||||||
if(isMimic(m->type))
|
if(isMimic(m->type))
|
||||||
moveMimic(m);
|
moveMimic(m);
|
||||||
}
|
}
|
||||||
@@ -2886,8 +2862,7 @@ EX void turn(int delta) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(monster *m: additional)
|
for(monster *m: additional) m->add_to_list(active);
|
||||||
active.push_back(m);
|
|
||||||
additional.clear();
|
additional.clear();
|
||||||
|
|
||||||
if(delayed_safety) {
|
if(delayed_safety) {
|
||||||
@@ -2895,18 +2870,13 @@ EX void turn(int delta) {
|
|||||||
delayed_safety = false;
|
delayed_safety = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// deactivate all monsters
|
while(active) {
|
||||||
for(monster *m: active)
|
auto *m = (monster*) active;
|
||||||
if(m->dead && m->type != moPlayer) {
|
if(m->dead && m->type != moPlayer)
|
||||||
if(m == mousetarget) mousetarget = NULL;
|
m->unlist_and_unref();
|
||||||
if(m == lmousetarget) lmousetarget = NULL;
|
else
|
||||||
m->remove_reference();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m->store();
|
m->store();
|
||||||
}
|
}
|
||||||
|
|
||||||
active.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EX void recall() {
|
EX void recall() {
|
||||||
@@ -2954,29 +2924,13 @@ EX void init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EX bool boatAt(cell *c) {
|
EX bool boatAt(cell *c) {
|
||||||
pair<mit, mit> p =
|
FOR_MONSTERS_IN_LIST(it, m, c->contents) if(m->inBoat) return true;
|
||||||
monstersAt.equal_range(c);
|
|
||||||
for(mit it = p.first; it != p.second; it++) {
|
|
||||||
monster* m = it->second;
|
|
||||||
if(m->inBoat) return true;
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
EX hookset<bool(const shiftmatrix&, cell*, shmup::monster*)> hooks_draw;
|
EX hookset<bool(const shiftmatrix&, cell*, shmup::monster*)> hooks_draw;
|
||||||
|
|
||||||
EX void clearMonsters() {
|
|
||||||
for(mit it = monstersAt.begin(); it != monstersAt.end(); it++)
|
|
||||||
delete(it->second);
|
|
||||||
for(monster *m: active) m->remove_reference();
|
|
||||||
mousetarget = NULL;
|
|
||||||
lmousetarget = NULL;
|
|
||||||
monstersAt.clear();
|
|
||||||
active.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
EX void clearMemory() {
|
EX void clearMemory() {
|
||||||
clearMonsters();
|
|
||||||
while(!traplist.empty()) traplist.pop();
|
while(!traplist.empty()) traplist.pop();
|
||||||
curtime = 0;
|
curtime = 0;
|
||||||
speed_saving = 0;
|
speed_saving = 0;
|
||||||
@@ -2995,7 +2949,6 @@ void gamedata(hr::gamedata* gd) {
|
|||||||
gd->store(nextdragon);
|
gd->store(nextdragon);
|
||||||
gd->store(visibleAt);
|
gd->store(visibleAt);
|
||||||
gd->store(traplist);
|
gd->store(traplist);
|
||||||
gd->store(monstersAt);
|
|
||||||
gd->store(active);
|
gd->store(active);
|
||||||
gd->store(mousetarget);
|
gd->store(mousetarget);
|
||||||
gd->store(lmousetarget);
|
gd->store(lmousetarget);
|
||||||
@@ -3018,7 +2971,7 @@ EX bool playerInBoat(int i) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EX void destroyBoats(cell *c) {
|
EX void destroyBoats(cell *c) {
|
||||||
for(monster *m: active)
|
FOR_MONSTERS_IN_LIST(it, m, active)
|
||||||
if(m->base == c && m->inBoat)
|
if(m->base == c && m->inBoat)
|
||||||
m->inBoat = false;
|
m->inBoat = false;
|
||||||
}
|
}
|
||||||
@@ -3039,17 +2992,7 @@ EX void addShmupHelp(string& out) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto hooks = addHook(hooks_clearmemory, 0, shmup::clearMemory) +
|
auto hooks = addHook(hooks_clearmemory, 0, shmup::clearMemory) +
|
||||||
addHook(hooks_gamedata, 0, shmup::gamedata) +
|
addHook(hooks_gamedata, 0, shmup::gamedata);
|
||||||
addHook(hooks_removecells, 0, [] () {
|
|
||||||
for(mit it = monstersAt.begin(); it != monstersAt.end();) {
|
|
||||||
if(is_cell_removed(it->first)) {
|
|
||||||
monstersAt.insert(make_pair(nullptr, it->second));
|
|
||||||
auto it0 = it; it++;
|
|
||||||
monstersAt.erase(it0);
|
|
||||||
}
|
|
||||||
else it++;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
EX void switch_shmup() {
|
EX void switch_shmup() {
|
||||||
stop_game();
|
stop_game();
|
||||||
@@ -3071,21 +3014,19 @@ EX void draw_collision_debug() {
|
|||||||
|
|
||||||
EX }
|
EX }
|
||||||
|
|
||||||
bool celldrawer::draw_shmup_monster() {
|
void shmup::monster::draw(struct hr::celldrawer& cd) {
|
||||||
using namespace shmup;
|
|
||||||
#if CAP_SHAPES
|
#if CAP_SHAPES
|
||||||
|
using namespace shmup;
|
||||||
|
|
||||||
|
auto m = this;
|
||||||
|
cell *c = cd.c;
|
||||||
|
auto& Vd = cd.Vd;
|
||||||
|
auto& V = cd.V;
|
||||||
|
auto& Vboat = cd.Vboat;
|
||||||
|
|
||||||
pair<mit, mit> p =
|
|
||||||
monstersAt.equal_range(c);
|
|
||||||
|
|
||||||
if(p.first == p.second) return false;
|
|
||||||
ld zlev = -geom3::factor_to_lev(zlevel(tC0(Vd.T)));
|
ld zlev = -geom3::factor_to_lev(zlevel(tC0(Vd.T)));
|
||||||
|
|
||||||
vector<monster*> monsters;
|
if(1) {
|
||||||
|
|
||||||
for(mit it = p.first; it != p.second; it++) {
|
|
||||||
monster* m = it->second;
|
|
||||||
if(c != m->base) continue; // may happen in RogueViz Collatz
|
|
||||||
m->pat = ggmatrix(m->base) * m->at;
|
m->pat = ggmatrix(m->base) * m->at;
|
||||||
shiftmatrix view = V * m->at;
|
shiftmatrix view = V * m->at;
|
||||||
|
|
||||||
@@ -3097,7 +3038,7 @@ bool celldrawer::draw_shmup_monster() {
|
|||||||
|
|
||||||
bool half_elliptic = elliptic && GDIM == 3 && WDIM == 2;
|
bool half_elliptic = elliptic && GDIM == 3 && WDIM == 2;
|
||||||
bool mirrored = det(view.T) > 0;
|
bool mirrored = det(view.T) > 0;
|
||||||
if(half_elliptic && mirrored) continue;
|
if(half_elliptic && mirrored) return;
|
||||||
|
|
||||||
if(!mouseout()) {
|
if(!mouseout()) {
|
||||||
if(m->no_targetting) ; else
|
if(m->no_targetting) ; else
|
||||||
@@ -3133,7 +3074,7 @@ bool celldrawer::draw_shmup_monster() {
|
|||||||
int q = isize(ptds);
|
int q = isize(ptds);
|
||||||
if(q != isize(ptds) && !m->inBoat) pushdown(c, q, view, zlev, true, false);
|
if(q != isize(ptds) && !m->inBoat) pushdown(c, q, view, zlev, true, false);
|
||||||
|
|
||||||
if(callhandlers(false, hooks_draw, V, c, m)) continue;
|
if(callhandlers(false, hooks_draw, V, c, m)) return;
|
||||||
|
|
||||||
switch(m->type) {
|
switch(m->type) {
|
||||||
case moPlayer: {
|
case moPlayer: {
|
||||||
@@ -3284,7 +3225,6 @@ bool celldrawer::draw_shmup_monster() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user