Files
thepool/source/main.cpp
Raimon Zamora a59c8b57ad - Editor més guapet
- [NEW] Ja es poden duplicar els actors
- [NEW] Ja es poden crear actors desde plantilla
- [NEW] Ja es pot afegir un actor com a plantilla
- [NEW] Ja es pot updatar una plantilla, usant un actor que tinga el mateix nom
2024-06-14 12:23:31 +02:00

757 lines
26 KiB
C++

#include "jgame.h"
#include "jdraw.h"
#include "jinput.h"
#include <SDL2/SDL.h>
#include "actor.h"
#include "room.h"
#include "jui.h"
#include "editor.h"
#include <vector>
#include <string>
enum sections { SECTION_GENERAL, SECTION_ROOM, SECTION_ACTOR };
draw::surface *surf;
int room_w = 2;
int room_h = 2;
int room_xp = -1;
int room_xn = -1;
int room_yp = -1;
int room_yn = -1;
int room_color = 9;
int room_floor = 0;
int room_walls = 0;
int room_doors = 0;
int room_walldoors = 0;
std::vector<std::string> gifs;
void restart()
{
room::load(0); //room_w, room_h, room_xp, room_xn, room_yp, room_yn, room_color, room_floor, room_walls, room_doors, room_walldoors);
/*
box = actor::create("ASCENSOR",{16,32,0}, {8,8,4}, {64,0,32,24}, {0,24});
box->flags = FLAG_MOVING;
box->movement = MOV_Z;
box->mov_push = PUSH_ZP;
actor::setDirty(box, true);
*/
//box = actor::create("HERO", {16,32,8}, {8,8,12}, {0,32,20,32}, {-6,38});
//box->flags = FLAG_HERO | FLAG_PUSHABLE | FLAG_GRAVITY | FLAG_ORIENTABLE | FLAG_ANIMATED;
//actor::setDirty(box, true);
//actor::reorder();
}
void game::init()
{
draw::init("The Pool", 520, 240, 3);
//room::init();
surf = draw::loadSurface("test.gif");
draw::setSource(surf);
draw::loadPalette("test.gif");
game::setUpdateTicks(64);
actor::templates::load();
FILE* f = fopen("data/gifs.txt", "r");
int buffer_len=255;
char buffer[buffer_len];
while(fgets(buffer, buffer_len, f)) {
auto len = strlen(buffer);
buffer[len-1]=0;
gifs.push_back(std::string(buffer));
}
actor::actor_t *hero = actor::create("HERO", {16,32,8}, {8,8,12}, "test.gif", {0,32,20,32}, {-6,38});
//actor::actor_t *hero = actor::create("HEROHEROHEROHER", {16,32,8}, {8,8,12}, "abad.gif", {0,0,20,35}, {-6,32});
hero->flags = FLAG_HERO | FLAG_PUSHABLE | FLAG_GRAVITY | FLAG_ORIENTABLE | FLAG_ANIMATED;
actor::setDirty(hero, true);
restart();
/*
actor::actor_t *box = actor::create("BOX", {32,32,16}, {8,8,8}, "test.gif", {32,0,32,32}, {0,32});
box->flags = FLAG_PUSHABLE | FLAG_GRAVITY;
box->movement = MOV_CW;
box->mov_push = PUSH_XN;
actor::setDirty(box, true);
box = actor::create("BOX2", {32,32,0}, {8,8,8}, "test.gif", {32,0,32,32}, {0,32});
box->flags = FLAG_PUSHABLE | FLAG_GRAVITY;
box->movement = MOV_CW;
box->mov_push = PUSH_XN;
actor::setDirty(box, true);
*/
actor::select(actor::find("BOX"));
}
int sx=1, sy=0;
void print(int x, int y, int num)
{
int digits=0;
bool sign = num < 0;
num = SDL_abs(num);
int n = num;
while (n>0) {n=n/10;digits++;}
if (sign) digits++;
x=x+digits*4;
if (num==0) draw::draw(x+4,y,5,7,0,120);
while (num>0)
{
draw::draw(x,y,5,7,(num%10)*5,120);
num=num/10;
x=x-4;
}
if (sign) draw::draw(x,y,5,7,50,120);
}
/*const bool btn(const char* label, const int x, const int y, int &var, int min, int max)
{
char buffer[100];
int result=0;
draw::print(label, x, y+3, 15, 0);
result=ui::button(SDL_itoa(var, buffer, 10), x+50, y, 28, 11, TEAL, LIGHT+TEAL, LIGHT+PURPLE);
if (result)
{
var=SDL_max(min, SDL_min(max, var-(result-2)));
return true;
}
return false;
}*/
const bool btn_small(const int x, const int y, int &var, int min, int max)
{
char buffer[100];
int result=0;
result=ui::spin(SDL_itoa(var, buffer, 10), x, y, 17, 11);
if (result)
{
var=SDL_max(min, SDL_min(max, var+result));
return true;
}
return false;
}
const bool btn_small(const int x, const int y, int &var, int min, int max, int width)
{
char buffer[100];
int result=0;
result=ui::spin(SDL_itoa(var, buffer, 10), x, y, width, 11);
if (result)
{
var=SDL_max(min, SDL_min(max, var+result));
return true;
}
return false;
}
/*
void btn_check(const int x, const int y, const char* label, uint8_t &flags, const uint8_t value)
{
int result=0;
if (flags & value) {
result=ui::check(label, x, y, 12, 11, true);
} else {
result=ui::check(label, x, y, 12, 11, false);
}
if (result)
{
if (flags & value) {
flags = flags & ~value;
} else {
flags = flags | value;
}
}
}
*/
const bool btn_check(const int x, const int y, const char* label, int &flags, const uint16_t value, const int width=24)
{
int result=0;
if (flags & value) {
result=ui::check(label, x, y, width, 11, true);
} else {
result=ui::check(label, x, y, width, 11, false);
}
if (result)
{
if (flags & value) {
flags = flags & ~value;
} else {
flags = flags | value;
}
return true;
}
return false;
}
const bool btn_opt(const char* label, const int x, const int y, int &var, std::vector<uint8_t> values, std::vector<std::string> labels, const int w=32)
{
//draw::print(label, x, y+3, 15, 0);
ui::label(label, x, y, w, 11);
int result = 0;
std::size_t pos = 0;
while (pos<values.size())
{
if (values[pos]==var) break;
pos++;
}
result = ui::combo(labels[pos].c_str(), x+w-1, y, 96-w, 11);
if (result)
{
pos++; if (pos==values.size()) pos=0;
var = values[pos];
return true;
}
return false;
}
bool btn_opt2(const char* label, const int x, const int y, char *var, std::vector<std::string> values)
{
//draw::print(label, x, y+3, PAPER, 0);
ui::label(label, x, y, 48, 11);
int result = 0;
std::size_t pos = 0;
std::string v = var;
while (pos < values.size() && v != values[pos])
{
pos++;
}
if (pos==values.size()) pos = 0;
result = ui::combo(var, x+47, y, 48, 11);
if (result)
{
pos++; if (pos==values.size()) pos=0;
strcpy(var,values[pos].c_str());
return true;
}
return false;
}
const uint8_t scancode_to_char(const uint8_t scancode)
{
if (scancode == SDL_SCANCODE_0) return '0';
if (scancode >= SDL_SCANCODE_1 && scancode <= SDL_SCANCODE_9) return scancode+19;
if (scancode >= SDL_SCANCODE_A && scancode <= SDL_SCANCODE_Z) return scancode+61;
return 32;
}
const bool btn_txt(const char* label, const int x, const int y, char *var)
{
//draw::print(label, x, y+3, PAPER, 0);
ui::label(label, x, y, 48, 11);
int result = 0;
result = ui::textbox(var, x+47, y, 48, 11);
if (result)
{
const int len = strlen(var);
if (result == SDL_SCANCODE_BACKSPACE) {
if (len>0) var[len-1] = 0;
} else {
if (len<15) {
var[len] = scancode_to_char(result);
var[len+1] = 0;
}
}
return true;
}
return false;
}
int section = SECTION_ROOM;
void editor_select_by_keyboard()
{
if ( !(input::keyDown(SDL_SCANCODE_LCTRL) || input::keyDown(SDL_SCANCODE_RCTRL)) ) return;
actor::actor_t *selected = actor::getSelected();
if ( input::keyPressed(SDL_SCANCODE_UP) )
{
if (!selected) {
actor::actor_t *first = actor::getFirst();
while (first && (first->flags&FLAG_IGNORE)) first=first->next;
actor::select(first);
} else {
if (selected->prev) {
actor::actor_t *prev = selected->prev;
while (prev && (prev->flags&FLAG_IGNORE)) prev=prev->prev;
actor::select(prev);
} else {
actor::actor_t *last = actor::getLast();
while (last && (last->flags&FLAG_IGNORE)) last=last->prev;
actor::select(last);
}
}
section=SECTION_ACTOR;
}
if ( input::keyPressed(SDL_SCANCODE_DOWN) )
{
if (!selected) {
actor::actor_t *last = actor::getLast();
while (last && (last->flags&FLAG_IGNORE)) last=last->prev;
actor::select(last);
} else {
if (selected->next) {
actor::actor_t *next = selected->next;
while (next && (next->flags&FLAG_IGNORE)) next=next->next;
if (next) {
actor::select(next);
} else {
actor::actor_t *first = actor::getFirst();
while (first && (first->flags&FLAG_IGNORE)) first=first->next;
actor::select(first);
}
} else {
actor::actor_t *first = actor::getFirst();
while (first && (first->flags&FLAG_IGNORE)) first=first->next;
actor::select(first);
}
}
section=SECTION_ACTOR;
}
}
void editor_move_selected()
{
actor::actor_t *selected = actor::getSelected();
if (!selected) return;
if ( input::keyDown(SDL_SCANCODE_LCTRL) || input::keyDown(SDL_SCANCODE_RCTRL) ) return;
vec3_t min = room::getMin();
vec3_t max = room::getMax();
if ( input::keyDown(SDL_SCANCODE_LEFT) && selected->pos.x>min.x ) { selected->pos.x--; actor::setDirty(selected); room::editor::modify(); }
if ( input::keyDown(SDL_SCANCODE_RIGHT) && selected->pos.x<max.x ) { selected->pos.x++; actor::setDirty(selected); room::editor::modify(); }
if ( input::keyDown(SDL_SCANCODE_UP) && selected->pos.y>min.y ) { selected->pos.y--; actor::setDirty(selected); room::editor::modify(); }
if ( input::keyDown(SDL_SCANCODE_DOWN) && selected->pos.y<max.y ) { selected->pos.y++; actor::setDirty(selected); room::editor::modify(); }
if ( input::keyDown(SDL_SCANCODE_PAGEDOWN) && selected->pos.z>min.z ) { selected->pos.z--; actor::setDirty(selected); room::editor::modify(); }
if ( input::keyDown(SDL_SCANCODE_PAGEUP) /*&& selected->pos.z<max.z*/ ) { selected->pos.z++; actor::setDirty(selected); room::editor::modify(); }
}
bool game::loop()
{
if (input::keyDown(SDL_SCANCODE_ESCAPE)) return false;
// WHILE EDITING...
if (editor::isEditing())
{
editor_move_selected();
actor::updateEditor(actor::getFirst());
}
else
{
actor::update(actor::getFirst());
}
actor::reorder();
editor_select_by_keyboard();
draw::resetViewport();
draw::cls(2);
draw::setViewport(100,0,320,240);
room::draw();
actor::draw(actor::getFirst());
room::draw2();
//draw::draw(148+sx*2-sy*2, 67+sx+sy,24,24,24,0);
/*
print(0,0,input::mouseX());
print(0,20,input::mouseY());
print(0,30,input::mouseBtn(1)?1:0);
print(0,40,input::mouseBtn(2)?1:0);
print(0,50,input::mouseBtn(3)?1:0);
*/
/*
if (section==0) {
draw::print("ROOM", 334, 13, YELLOW, LIGHT+BLACK);
if (ui::button("ACTORS", 365, 10, 30, 11, TEAL, LIGHT+TEAL, LIGHT+PURPLE)) section=1;
} else {
if (ui::button("ROOM", 330, 10, 30, 11, TEAL, LIGHT+TEAL, LIGHT+PURPLE)) section=0;
draw::print("ACTORS", 369, 13, YELLOW, BLACK);
}
*/
actor::actor_t *act = nullptr;
/*
switch (section) {
case 0:
*/
draw::setViewport(0,0,100,240);
draw::color(WHITE);
draw::fillrect(0, 0, 100, 240);
//if (ui::button("+ACTOR", 2, 2, 28, 11))
//{
//room::load(room::editor::getCurrentRoom());
//editor::setEditing(!editor::isEditing());
//}
int result = ui::combo(actor::templates::get(editor::getCurrentTemplate())->name, 2, 2, 76, 11);
if (result)
{
int new_current_template = editor::getCurrentTemplate() + (result-2);
if (new_current_template >= actor::templates::size()) new_current_template = 0;
if (new_current_template < 0) new_current_template = actor::templates::size()-1;
editor::setCurrentTemplate(new_current_template);
}
if (ui::button("NEW", 78, 2, 20, 11))
{
actor::actor_t *new_act = actor::duplicate(actor::templates::get(editor::getCurrentTemplate()));
actor::setUniqueName(new_act);
actor::setDirty(new_act, true);
}
draw::color(LIGHT+WHITE);
draw::fillrect(2, 15, 96, 223);
draw::color(PAPER);
draw::rect(2, 15, 96, 223);
draw::setViewport(0, 15, 100, 225);
const int mx = draw::getLocalX(input::mouseX());
const int my = draw::getLocalY(input::mouseY());
const bool btnDown = input::mouseBtn(1) || input::mouseBtn(3);
int line = 0;
if (section==SECTION_GENERAL)
{
draw::color(LIGHT+BLUE);
draw::fillrect(4, 2+line*9, 92, 9);
}
if ((mx>=2) && (mx<98) && (my>=2+line*9) && (my<2+9+line*9) && btnDown) {
section = SECTION_GENERAL;
}
draw::print("-THE POOL", 6, 4+line*9, LIGHT+WHITE, BLACK);
line++;
for (int i=0;i<64;++i)
{
if (room::editor::roomExists(i))
{
if (section==SECTION_ROOM && i == room::editor::getCurrentRoom())
{
draw::color(LIGHT+BLUE);
draw::fillrect(4, 2+line*9, 92, 9);
}
if ((mx>=2) && (mx<98) && (my>=2+line*9) && (my<2+9+line*9) && btnDown) {
room::load(i);
section = SECTION_ROOM;
}
char num[] = "+ROOM 00";
num[6] = int(i/10)+48;
num[7] = (i%10)+48;
draw::print(num, 10, 4+line*9, LIGHT+WHITE, BLACK); line++;
if (i==room::editor::getCurrentRoom())
{
act = actor::getFirst();
while (act) {
if ((act->flags&FLAG_NOEDITOR)!=FLAG_NOEDITOR && (act->flags&FLAG_HERO)!=FLAG_HERO) {
if (section==SECTION_ACTOR && act==actor::getSelected()) {
draw::color(LIGHT+BLUE);
draw::fillrect(4, 2+line*9, 92, 9);
}
if ((mx>=2) && (mx<98) && (my>=2+line*9) && (my<2+9+line*9) && btnDown) {
actor::select(act);
section = SECTION_ACTOR;
}
draw::print(act->name, 14, 4+line*9, LIGHT+WHITE, BLACK);
line++;
}
act = act->next;
}
}
}
}
/*
break;
case 1:
*/
draw::setViewport(420, 0, 100, 240);
draw::color(WHITE);
draw::fillrect(0, 0, 100, 240);
if (ui::button("EDITING", 2, 2, 96, 11, editor::isEditing()))
{
room::load(room::editor::getCurrentRoom());
editor::setEditing(!editor::isEditing());
}
//draw::color(PAPER); // el borde del propertyview es pinta al final de tot
//draw::rect(2, 22, 96, 216);
draw::setViewport(420, 15, 100, 225);
bool changed = false;
switch (section)
{
case SECTION_GENERAL:
break;
case SECTION_ROOM:
draw::color(LIGHT+WHITE);
draw::fillrect(2, 0, 96, 223);
line = 0;
//changed |= btn("ROOM WIDTH:", 10, 40, room::editor::refWidth(), 0, 3);
//changed |= btn("ROOM HEIGHT:", 10, 55, room::editor::refHeight(), 0, 3);
ui::label("ROOM DIMENSIONS", 2, line, 96, 11, GRAY); line+=10;
ui::label("WIDTH", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refWidth(), 0, 3, 50);
line += 10;
ui::label("HEIGHT", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refHeight(), 0, 3, 50);
line += 10;
ui::label("DOOR HEIGHTS", 2, line, 96, 11, GRAY); line+=10;
ui::label("XN", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refDoor(XN), -1, 5, 50);
line += 10;
ui::label("YP", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refDoor(YP), -1, 5, 50);
line += 10;
ui::label("XP", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refDoor(XP), -1, 5, 50);
line += 10;
ui::label("YN", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refDoor(YN), -1, 5, 50);
line += 10;
ui::label("TEXTURES", 2, line, 96, 11, GRAY); line+=10;
changed |= btn_opt("COLOR", 2, line, room::editor::refColor(), {5, 6, 7, 8, 9, 10, 11}, {"BLUE", "RED", "PURPLE", "GREEN", "CYAN", "YELLOW", "WHITE"}, 47); //ui::label("COLOR", 2, line, 64, 11);
//changed |= btn_small(64, line, room::editor::refColor(), 5, 11);
line += 10;
ui::label("FLOOR", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refFloorTex(), 0, 5, 50);
line += 10;
ui::label("WALL", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refWallTex(), 0, 5, 50);
line += 10;
ui::label("DOOR", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refDoorTex(), 0, 4, 50);
line += 10;
ui::label("UNDER DOOR", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refWallDoorTex(), 0, 5, 50);
ui::label("EXITS", 2, line, 96, 11, GRAY); line+=10;
ui::label("XN", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refExit(XN), -1, 64, 36);
if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(XN));
line += 10;
ui::label("YP", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refExit(YP), -1, 64, 36);
if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(YP));
line += 10;
ui::label("XP", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refExit(XP), -1, 64, 36);
if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(XP));
line += 10;
ui::label("YN", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refExit(YN), -1, 64, 36);
if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(YN));
line += 10;
ui::label("ZP", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refExit(ZP), -1, 64, 36);
if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(ZP));
line += 10;
ui::label("ZN", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refExit(ZN), -1, 64, 36);
if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(ZN));
line += 10;
/*changed |= btn("COLOR:", 10, 140, room::editor::refColor(), 5, 11);
changed |= btn("FLOOR:", 10, 155, room::editor::refFloorTex(), 0, 5);
changed |= btn("WALLS:", 10, 170, room::editor::refWallTex(), 0, 5);
changed |= btn("DOORS:", 10, 185, room::editor::refDoorTex(), 0, 4);
changed |= btn("WDOORS:", 10, 200, room::editor::refWallDoorTex(), 0, 5);*/
if (changed) { room::editor::modify(); room::update(); }
draw::color(PAPER);
draw::rect(2, 0, 96, 223);
break;
case SECTION_ACTOR:
draw::color(LIGHT+WHITE);
draw::fillrect(2, 0, 96, 153);
changed = false;
act = actor::getSelected();
if (act)
{
line = 0;
//draw::setViewport(420, 90, 100, 150);
changed |= btn_txt("NAME", 2, line, act->name); line+=10;
ui::label("LOCATION", 2, line, 96, 11, GRAY); line+=10;
ui::label("POS", 2, line, 48, 11);
changed |= btn_small(49, line, act->pos.x, 0, 512);
changed |= btn_small(65, line, act->pos.y, 0, 512);
changed |= btn_small(81, line, act->pos.z, 0, 512);
line+=10;
ui::label("SIZE", 2, line, 48, 11);
changed |= btn_small(49, line, act->size.x, 0, 512);
changed |= btn_small(65, line, act->size.y, 0, 512);
changed |= btn_small(81, line, act->size.z, 0, 512);
line+=10;
ui::label("BITMAP", 2, line, 96, 11, GRAY); line+=10;
if (btn_opt2("FILE", 2, line, act->bmp, gifs)) {
draw::freeSurface(act->surface);
act->surface = draw::loadSurface(act->bmp);
changed = true;
}
line+=10;
ui::label("POS", 2, line, 48, 11);
changed |= btn_small(49, line, act->bmp_rect.x, 0, 512, 25);
changed |= btn_small(73, line, act->bmp_rect.y, 0, 512, 25);
line+=10;
ui::label("SIZE", 2, line, 48, 11);
changed |= btn_small(49, line, act->bmp_rect.w, 0, 512, 25);
changed |= btn_small(73, line, act->bmp_rect.h, 0, 512, 25);
line+=10;
ui::label("OFFSET", 2, line, 48, 11);
changed |= btn_small(49, line, act->bmp_offset.x, -32, 64, 25);
changed |= btn_small(73, line, act->bmp_offset.y, -32, 64, 25);
line+=10;
ui::label("FLAGS", 2, line, 96, 11, GRAY); line+=10;
changed |= btn_check(2, line, "PICK", act->flags, FLAG_PICKABLE);
changed |= btn_check(26, line, "PUSH", act->flags, FLAG_PUSHABLE);
changed |= btn_check(50, line, "REAC", act->flags, FLAG_REACTIVE);
changed |= btn_check(74, line, "MOVI", act->flags, FLAG_MOVING);
line+=10;
changed |= btn_check(2, line, "ANIM", act->flags, FLAG_ANIMATED);
changed |= btn_check(26, line, "ORIE", act->flags, FLAG_ORIENTABLE);
changed |= btn_check(50, line, "DEAD", act->flags, FLAG_DEADLY);
changed |= btn_check(74, line, "GRAV", act->flags, FLAG_GRAVITY);
line+=11;
ui::label("PROPERTIES", 2, line, 96, 11, GRAY); line+=10;
if (btn_opt("ORIENT", 2, line, act->orient, {PUSH_NONE, PUSH_XP, PUSH_XN, PUSH_YP, PUSH_YN, PUSH_ZP, PUSH_ZN}, {"NONE", "XP", "XN", "YP", "YN", "ZP", "ZN"}, 48))
{
act->mov_push = act->orient;
changed = true;
}
line+=10;
changed |= btn_opt("MOVEMNT", 2, line, act->movement, {MOV_NONE, MOV_X, MOV_Y, MOV_Z, MOV_CW, MOV_CCW, MOV_RAND, MOV_HUNT}, {"NONE", "X", "Y", "Z", "CW", "CCW", "RAND", "HUNT"}, 48);
line+=10;
changed |= btn_opt("ANIMCYC", 2, line, act->anim_cycle, {0, 1}, {"0 1 0 2", "0 1 2 3"}, 48);
line+=10;
//draw::print("ANIM SPEED:", 2, 156, 15, 0);
ui::label("ANMSPED", 2, line, 49, 11);
changed |= btn_small(49, line, act->anim_wait, 0, 10, 49);
line+=10;
ui::label("MASKS", 2, line, 96, 11, GRAY); line+=10;
ui::label("RMASK", 2, line, 24, 11);
changed |= btn_check(24+2, line, "XP", act->react_mask, PUSH_XP, 12);
changed |= btn_check(24+14, line, "XN", act->react_mask, PUSH_XN, 12);
changed |= btn_check(24+26, line, "YP", act->react_mask, PUSH_YP, 12);
changed |= btn_check(24+38, line, "YN", act->react_mask, PUSH_YN, 12);
changed |= btn_check(24+50, line, "ZP", act->react_mask, PUSH_ZP, 12);
changed |= btn_check(24+62, line, "ZN", act->react_mask, PUSH_ZN, 12);
line+=11;
ui::label("RPUSH", 2, line, 24, 11);
changed |= btn_check(24+2, line, "XP", act->react_push, PUSH_XP, 12);
changed |= btn_check(24+14, line, "XN", act->react_push, PUSH_XN, 12);
changed |= btn_check(24+26, line, "YP", act->react_push, PUSH_YP, 12);
changed |= btn_check(24+38, line, "YN", act->react_push, PUSH_YN, 12);
changed |= btn_check(24+50, line, "ZP", act->react_push, PUSH_ZP, 12);
changed |= btn_check(24+62, line, "ZN", act->react_push, PUSH_ZN, 12);
line+=12;
if (changed) { room::editor::modify(); }
draw::color(PAPER);
draw::rect(2, 0, 96, 204);
if (ui::button("DUPLICATE", 2, line, 96, 11))
{
actor::actor_t *new_act = actor::duplicate(act);
actor::setUniqueName(new_act);
new_act->pos.x++; new_act->pos.y++;
actor::setDirty(new_act, true);
}
line+=10;
if (ui::button("ADD TO TEMPLATES", 2, line, 96, 11))
{
if (!actor::templates::getByName(act->name)) actor::templates::add(act);
}
//changed |= btn_opt("ANIMCYC", 2, 106, act->anim_cycle, {0, 1}, {"0 1 0 2", "0 1 2 3"});
}
break;
};
/*
break;
}
*/
/* case 2:
draw::setViewport(320, 38, 100, 100);
draw::color(LIGHT+WHITE);
draw::fillrect(2, 0, 96, 100);
draw::color(PAPER);
draw::rect(2, 0, 96, 100);
const int mx = draw::getLocalX(input::mouseX());
const int my = draw::getLocalY(input::mouseY());
const bool btnDown = input::mouseBtn(1) || input::mouseBtn(3);
int line = 0;
act = actor::getFirst();
while (act) {
if ((act->flags&FLAG_NOEDITOR)!=FLAG_NOEDITOR) {
if (act==actor::getSelected()) {
draw::color(LIGHT+BLUE);
draw::fillrect(4, 2+line*9, 92, 9);
}
if ((mx>=2) && (mx<98) && (my>=2+line*9) && (my<2+9+line*9) && btnDown) {
actor::select(act);
//section=1;
}
draw::print(act->name, 6, 4+line*9, LIGHT+WHITE, BLACK);
line++;
}
act = act->next;
}
break;
*/
draw::render();
return true;
}