- Versió del Update dels actors per al Editor - [NEW] gui::TextBox - [NEW] input::getKeyPressed() - Acabant el editor...
369 lines
12 KiB
C++
369 lines
12 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 <vector>
|
|
#include <string>
|
|
|
|
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()
|
|
{
|
|
//actor::clear();
|
|
actor::remove(actor::find("DOOR_YP1"));
|
|
actor::remove(actor::find("DOOR_YP2"));
|
|
actor::remove(actor::find("DOOR_XP1"));
|
|
actor::remove(actor::find("DOOR_XP2"));
|
|
|
|
room::load(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", 420, 240, 3);
|
|
|
|
//room::init();
|
|
surf = draw::loadSurface("test.gif");
|
|
draw::setSource(surf);
|
|
draw::loadPalette("test.gif");
|
|
game::setUpdateTicks(64);
|
|
|
|
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);
|
|
|
|
actor::clear();
|
|
|
|
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);
|
|
|
|
restart();
|
|
|
|
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);
|
|
}
|
|
|
|
void 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)));
|
|
restart();
|
|
}
|
|
}
|
|
|
|
void btn_small(const int x, const int y, int &var, int min, int max, bool restrt=false)
|
|
{
|
|
char buffer[100];
|
|
int result=0;
|
|
result=ui::button(SDL_itoa(var, buffer, 10), x, y, 15, 11, TEAL, LIGHT+TEAL, LIGHT+PURPLE);
|
|
if (result)
|
|
{
|
|
var=SDL_max(min, SDL_min(max, var-(result-2)));
|
|
if (restrt) restart();
|
|
}
|
|
}
|
|
|
|
void btn_check(const int x, const int y, const char* label, uint16_t &flags, const uint16_t value)
|
|
{
|
|
int result=0;
|
|
if (flags & value) {
|
|
result=ui::button(label, x, y, 20, 11, TEAL, LIGHT+TEAL, LIGHT+PURPLE);
|
|
} else {
|
|
result=ui::button(label, x, y, 20, 11, BLACK, WHITE, LIGHT+PURPLE);
|
|
}
|
|
if (result)
|
|
{
|
|
if (flags & value) {
|
|
flags = flags & ~value;
|
|
} else {
|
|
flags = flags | value;
|
|
}
|
|
}
|
|
}
|
|
|
|
void btn_opt(const char* label, const int x, const int y, uint8_t &var, std::vector<uint8_t> values, std::vector<std::string> labels)
|
|
{
|
|
draw::print(label, x, y+3, 15, 0);
|
|
int result = 0;
|
|
std::size_t pos = 0;
|
|
while (pos<values.size())
|
|
{
|
|
if (values[pos]==var) break;
|
|
pos++;
|
|
}
|
|
|
|
result = ui::button(labels[pos].c_str(), x+32, y, 56, 11, TEAL, LIGHT+TEAL, LIGHT+PURPLE);
|
|
if (result)
|
|
{
|
|
pos++; if (pos==values.size()) pos=0;
|
|
var = values[pos];
|
|
}
|
|
}
|
|
|
|
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, 15, 0);
|
|
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::button(var, x+32, y, 56, 11, TEAL, LIGHT+TEAL, LIGHT+PURPLE);
|
|
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;
|
|
}
|
|
|
|
void btn_txt(const char* label, const int x, const int y, char *var)
|
|
{
|
|
draw::print(label, x, y+3, 15, 0);
|
|
int result = 0;
|
|
result = ui::textbox(var, x+22, y, 66, 11, WHITE, LIGHT+WHITE);
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int section = 0;
|
|
|
|
void editor_move_selected()
|
|
{
|
|
actor::actor_t *selected = actor::getSelected();
|
|
if (!selected) 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--;
|
|
if ( input::keyDown(SDL_SCANCODE_RIGHT) && selected->pos.x<max.x ) selected->pos.x++;
|
|
if ( input::keyDown(SDL_SCANCODE_UP) && selected->pos.y>min.y ) selected->pos.y--;
|
|
if ( input::keyDown(SDL_SCANCODE_DOWN) && selected->pos.y<max.y ) selected->pos.y++;
|
|
if ( input::keyDown(SDL_SCANCODE_PAGEDOWN) && selected->pos.z>min.z ) selected->pos.z--;
|
|
if ( input::keyDown(SDL_SCANCODE_PAGEUP) /*&& selected->pos.z<max.z*/ ) selected->pos.z++;
|
|
}
|
|
|
|
bool game::loop()
|
|
{
|
|
if (input::keyDown(SDL_SCANCODE_ESCAPE)) return false;
|
|
|
|
// WHILE EDITING...
|
|
editor_move_selected();
|
|
actor::updateEditor(actor::getFirst());
|
|
|
|
//actor::update(actor::getFirst());
|
|
|
|
actor::reorder();
|
|
|
|
draw::cls(2);
|
|
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=2;
|
|
} 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:
|
|
btn("ROOM WIDTH:", 330, 40, room_w, 0, 3);
|
|
btn("ROOM HEIGHT:", 330, 55, room_h, 0, 3);
|
|
|
|
draw::print("DOORS:", 330, 80, 15, 0);
|
|
btn_small(352, 80, room_xn, -1, 5, true);
|
|
btn_small(369, 80, room_yp, -1, 5, true);
|
|
btn_small(386, 80, room_xp, -1, 5, true);
|
|
btn_small(403, 80, room_yn, -1, 5, true);
|
|
|
|
btn("COLOR:", 330, 140, room_color, 5, 11);
|
|
btn("FLOOR:", 330, 155, room_floor, 0, 5);
|
|
btn("WALLS:", 330, 170, room_walls, 0, 5);
|
|
btn("DOORS:", 330, 185, room_doors, 0, 4);
|
|
btn("WDOORS:", 330, 200, room_walldoors, 0, 5);
|
|
break;
|
|
case 1:
|
|
act = actor::getSelected();
|
|
if (act)
|
|
{
|
|
btn_txt("NAME:", 330, 40, act->name);
|
|
if (btn_opt2("BMP:", 330, 55, act->bmp, gifs)) {
|
|
draw::freeSurface(act->surface);
|
|
act->surface = draw::loadSurface(act->bmp);
|
|
}
|
|
draw::print("RECT:", 330, 73, 15, 0);
|
|
btn_small(352, 70, act->bmp_rect.x, 0, 512);
|
|
btn_small(369, 70, act->bmp_rect.y, 0, 512);
|
|
btn_small(386, 70, act->bmp_rect.w, 0, 512);
|
|
btn_small(403, 70, act->bmp_rect.h, 0, 512);
|
|
|
|
draw::print("OFFSET:", 330, 88, 15, 0);
|
|
btn_small(386, 85, act->bmp_offset.x, -32, 64);
|
|
btn_small(403, 85, act->bmp_offset.y, -32, 64);
|
|
|
|
draw::print("POS:", 330, 108, 15, 0);
|
|
btn_small(369, 105, act->pos.x, 0, 512);
|
|
btn_small(386, 105, act->pos.y, 0, 512);
|
|
btn_small(403, 105, act->pos.z, 0, 512);
|
|
|
|
draw::print("SIZE:", 330, 123, 15, 0);
|
|
btn_small(369, 120, act->size.x, 0, 512);
|
|
btn_small(386, 120, act->size.y, 0, 512);
|
|
btn_small(403, 120, act->size.z, 0, 512);
|
|
|
|
btn_opt("ORIENT:", 330, 135, act->orient, {PUSH_NONE, PUSH_XP, PUSH_XN, PUSH_YP, PUSH_YN}, {"NONE", "XP", "XN", "YP", "YN"});
|
|
|
|
btn_check(330, 150, "HERO", act->flags, FLAG_HERO);
|
|
btn_check(352, 150, "PUSH", act->flags, FLAG_PUSHABLE);
|
|
btn_check(374, 150, "REAC", act->flags, FLAG_REACTIVE);
|
|
btn_check(396, 150, "MOVI", act->flags, FLAG_MOVING);
|
|
btn_check(330, 165, "ANIM", act->flags, FLAG_ANIMATED);
|
|
btn_check(352, 165, "ORIE", act->flags, FLAG_ORIENTABLE);
|
|
btn_check(374, 165, "DEAD", act->flags, FLAG_DEADLY);
|
|
btn_check(396, 165, "GRAV", act->flags, FLAG_GRAVITY);
|
|
|
|
btn_opt("MOVEMNT:", 330, 180, 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"});
|
|
btn_opt("ANIMCYC:", 330, 195, act->anim_cycle, {0, 1}, {"0 1 0 2", "0 1 2 3"});
|
|
|
|
draw::print("ANIM SPEED:", 330, 213, 15, 0);
|
|
btn_small(403, 210, act->anim_wait, 0, 10);
|
|
|
|
break;
|
|
}
|
|
case 2:
|
|
draw::color(TEAL);
|
|
draw::rect(328, 38, 67, 94);
|
|
const int mx = input::mouseX();
|
|
const int my = 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(TEAL);
|
|
draw::fillrect(330, 40+line*9, 63, 9);
|
|
}
|
|
if ((mx>=330) && (mx<394) && (my>=40+line*9) && (my<40+9+line*9) && btnDown) {
|
|
actor::select(act);
|
|
section=1;
|
|
}
|
|
draw::print(act->name, 332, 42+line*9, WHITE, BLACK);
|
|
line++;
|
|
}
|
|
act = act->next;
|
|
}
|
|
break;
|
|
}
|
|
|
|
draw::render();
|
|
|
|
return true;
|
|
} |