#include "dev.hpp" #include "input.hpp" #include "objects.hpp" #include "id.hpp" #include "lisp.hpp" #include "light.hpp" #include "devsel.hpp" #include "dprint.hpp" #include "property.hpp" #include "pmenu.hpp" #include "filesel.hpp" #include "tools.hpp" #include "game.hpp" #include "pcxread.hpp" #include "lisp_gc.hpp" #include "demo.hpp" #include "profile.hpp" #include "sbar.hpp" #include "compiled.hpp" #include "chat.hpp" #include #define make_above_tile(x) ((x)|0x4000) extern int registered; char backw_on=0,forew_on=0,show_menu_on=0,ledit_on=0,pmenu_on=0,omenu_on=0,commandw_on=0,tbw_on=0, searchw_on=0,small_render_on=0,interpolate_draw=0,disable_autolight=0,fps_on=0,profile_on=0, show_names=0,fg_reversed=0, raise_all; char *symbol_str(char *name) { void *sym=make_find_symbol(name); if (symbol_value(sym) && item_type(symbol_value(sym))==L_STRING) return lstring_value(symbol_value(sym)); // maybe english.lsp was not loaded yet, let's try to do that int sp=current_space; current_space=PERM_SPACE; char prog[50]; char *cs=prog; strcpy(prog,"(setq section 'game_section)\n"); eval(compile(cs)); strcpy(prog,"(load \"lisp/english.lsp\")\n"); cs=prog; if (!eval(compile(cs))) { dprintf("unable to open file '%s'\n",lsf); exit(0); } current_space=sp; // check again to see if the symbol is there sym=make_find_symbol(name); if (symbol_value(sym) && item_type(symbol_value(sym))==L_STRING) return lstring_value(symbol_value(sym)); // check to see if there is a missing symbol definition sym=make_find_symbol("missing_sym"); if (symbol_value(sym) && item_type(symbol_value(sym))==L_STRING) return lstring_value(symbol_value(sym)); // last resort, return english string return "Missing language symbol!"; } static game_object *copy_object=NULL; pmenu *dev_menu=NULL; jwindow *mess_win=NULL,*warn_win=NULL; game_object *edit_object; dev_controll *dev_cont=NULL; image *small_render=NULL; int scale_mult,scale_div,dlastx,dlasty; int last_created_type=-1; char level_file[100]="levels/level00.spe"; void make_edit_mode_menu(); class cached_image : public visual_object { int id; public : cached_image(int Id) { id=Id; } virtual void draw(image *screen, int x, int y, window_manager *wm, filter *f) { if (f) f->put_image(screen,cash.img(id),x,y,1); else cash.img(id)->put_image(screen,x,y); } virtual int width(window_manager *wm) { return cash.img(id)->width(); } virtual int height(window_manager *wm) { return cash.img(id)->height(); } } ; #define DEV_MODES 3 cached_image *dev_mode_pict[DEV_MODES]; int dev_del,dev_move, dev_char_left,dev_char_right,dev_back,dev_front,dev_ok,dev_copy,dev_brain, dev_lights,dev_objects,dev_ai,dev_mode_icon[DEV_MODES], dev_forward,dev_backward; char *dev_mode_icon_names[DEV_MODES]={"pixel_mode","pick_mode", /* "fill_mode", "line_mode","rect_mode","bar_mode", */ "area_select"}; int dev_mode_ids[DEV_MODES]={ID_DMODE_DRAW,ID_DMODE_PICK, ID_DMODE_AREA}; int edit_mode=ID_DMODE_DRAW; dev_term *dev_console=NULL; int ldef_width=0,ldef_height=0,ldef_r1=1,ldef_r2=100; void make_screen_size(int w, int h); class amb_cont : public scroller { public : amb_cont(int X, int Y, ifield *Next) : scroller(X,Y,ID_NULL,100,eh->font()->height()+2,0,64,Next) { if (player_list) sx=player_list->ambient; } virtual void scroll_event(int newx, image *screen, window_manager *wm) { screen->bar(x,y,x+l-1,y+h-1,wm->dark_color()); char st[100]; sprintf(st,"%d",newx); wm->font()->put_string(screen,x+30,y+1,st,eh->bright_color()); if (player_list) player_list->ambient=newx; the_game->need_refresh(); } } ; int confirm_quit() { image *ok_image=cash.img(cash.reg("art/frame.spe","dev_ok",SPEC_IMAGE,1))->copy(), *cancel_image=cash.img(cash.reg("art/frame.spe","cancel",SPEC_IMAGE,1))->copy(); jwindow *quitw=eh->new_window(xres/2+40,yres/2,90,-1, new button(WINDOW_FRAME_LEFT+10,WINDOW_FRAME_TOP+20,ID_QUIT_OK,ok_image, new button(WINDOW_FRAME_LEFT+38,WINDOW_FRAME_TOP+20,ID_CANCEL,cancel_image, new info_field(WINDOW_FRAME_LEFT,WINDOW_FRAME_TOP,ID_NULL,symbol_str("sure?"),NULL))), symbol_str("quit_title")); eh->grab_focus(quitw); int fin=0,quit=0; do { eh->flush_screen(); event ev; eh->get_event(ev); if (ev.type==EV_MESSAGE && ev.message.id==ID_QUIT_OK) fin=quit=1; else if (ev.type==EV_MESSAGE && ev.message.id==ID_CANCEL) fin=1; else if (ev.type==EV_KEY && toupper(ev.key)==toupper(*symbol_str("YES"))) fin=quit=1; else if (ev.type==EV_KEY && toupper(ev.key)==toupper(*symbol_str("NO"))) fin=1; if ((ev.type==EV_KEY && ev.key==JK_ESC) || ev.type==EV_CLOSE_WINDOW) fin=1; } while (!fin); delete ok_image; delete cancel_image; the_game->reset_keymap(); eh->close_window(quitw); eh->flush_screen(); return quit; } void show_object_number (game_object *who) { int total=0,number=0; game_object *c; for (c=current_level->first_object();c;c=c->next) { if (c->otype==who->otype) total++; if (c==who) number=total; } char msg[100]; sprintf(msg,"%s : %d of %d",object_names[who->otype],number,total); } void dev_controll::search_backward() { ; } void single_render() { // enlarge clip area the_game->first_view->cx2=the_game->first_view->cx1+ (the_game->first_view->cx2-the_game->first_view->cx1+1)*2; the_game->first_view->cy2=the_game->first_view->cy1+ (the_game->first_view->cy2-the_game->first_view->cy1+1)*2; delete small_render; small_render=NULL; small_render_on=0; } void double_render() { small_render_on=1; // reduce clip area the_game->first_view->cx2=the_game->first_view->cx1+ (the_game->first_view->cx2-the_game->first_view->cx1+1)/2; the_game->first_view->cy2=the_game->first_view->cy1+ (the_game->first_view->cy2-the_game->first_view->cy1+1)/2; small_render=new image((the_game->first_view->cx2-the_game->first_view->cx1+1), (the_game->first_view->cy2-the_game->first_view->cy1+1),NULL,2); } void dev_controll::search_forward() { if (search_window) // if no window then we can't get the object name { char *name=search_window->read(ID_SEARCH_TEXT); int type=-1; // see if this type exsists int i; for (i=0;ishow_help(msg); the_game->need_refresh(); } else { game_object *first,*find=NULL; if (!search_object || search_object->otype!=type) first=current_level->first_object(); else first=search_object->next; for (;!find && first;first=first->next) if (first->otype==type) find=first; int loop=0; if (!find) { for (first=current_level->first_object();first && !find;first=first->next) { if (first->otype==type) find=first; } loop=1; } if (find) { search_object=find; show_object_number(search_object); } else { the_game->show_help("No object matching name exsist in level\n"); } } } } long dev_controll::snap_x(long x) { if (eh->key_pressed(JK_CTRL_L) || eh->key_pressed(JK_CTRL_R)) return x-(x%the_game->ftile_width()); else if (eh->key_pressed(JK_ALT_L) || eh->key_pressed(JK_ALT_R)) return x-(x%the_game->ftile_width())+the_game->ftile_width()/2; else return x; } long dev_controll::snap_y(long y) { if (eh->key_pressed(JK_CTRL_L) || eh->key_pressed(JK_CTRL_R)) return y-(y%the_game->ftile_height())-1; else if (eh->key_pressed(JK_ALT_L) || eh->key_pressed(JK_ALT_R)) return y-(y%the_game->ftile_height())+the_game->ftile_height()/2-1; else return y; } void dev_controll::make_ambient() { if (!ambw) ambw=eh->new_window(prop->getd("ambient x",-1), prop->getd("ambient y",-1),-1,-1, new amb_cont(WINDOW_FRAME_LEFT,WINDOW_FRAME_TOP,NULL),"ambient"); } void dev_term::execute(char *st) { if (!strcmp(st,"?")) { put_string("unchop x y, size x y,\n" "load, esave, name\n"); } else { event ev; dv->do_command(st,ev); } } void load_dev_icons() { char *artf="art/dev.spe"; dev_del=cash.reg(artf,"dev_del",SPEC_IMAGE,0); dev_move=cash.reg(artf,"dev_move",SPEC_IMAGE,0); dev_char_left=cash.reg(artf,"dev_char_left",SPEC_IMAGE,0); dev_char_right=cash.reg(artf,"dev_char_right",SPEC_IMAGE,0); dev_back=cash.reg(artf,"dev_back",SPEC_IMAGE,0); dev_front=cash.reg(artf,"dev_front",SPEC_IMAGE,0); dev_ok=cash.reg(artf,"dev_ok",SPEC_IMAGE,0); dev_copy=cash.reg(artf,"dev_copy",SPEC_IMAGE,0); dev_brain=cash.reg(artf,"brain",SPEC_IMAGE,0); dev_lights=cash.reg(artf,"lights",SPEC_IMAGE,0); dev_objects=cash.reg(artf,"objects",SPEC_IMAGE,0); dev_ai=cash.reg(artf,"ai",SPEC_IMAGE,0); dev_forward=cash.reg(artf,"forward",SPEC_IMAGE,0); dev_backward=cash.reg(artf,"backward",SPEC_IMAGE,0); for (int i=0;iwidth()<<16)/new_width, ystep=(im->height()<<16)/new_height,iy,ix,sx,ix_start,iy_start; screen->add_dirty(x,y,x+new_width-1,y+new_height-1); short cx1,cy1,cx2,cy2; screen->get_clip(cx1,cy1,cx2,cy2); if (cx1>cx2 || cy1>cy2 || x>cx2 || y>cy2 || x+new_width<=cx1 || y+new_height<=cy1) return ; if (x=cx2) new_width-=x+new_width-1-cx2; if (ycy2) new_height-=y+new_height-cy2; for (iy=iy_start;new_height>0;new_height--,y++,iy+=ystep) { sl1=im->scan_line(iy>>16); sl2=screen->scan_line(y)+x; for (ix=ix_start,sx=0;sx>16]; } } void scale_put_trans(image *im, image *screen, int x, int y, short new_width, short new_height) { unsigned char *sl1,*sl2; long xstep=(im->width()<<16)/new_width, ystep=(im->height()<<16)/new_height,iy,ix,sx,ix_start,iy_start; screen->add_dirty(x,y,x+new_width-1,y+new_height-1); short cx1,cy1,cx2,cy2; screen->get_clip(cx1,cy1,cx2,cy2); if (cx1>cx2 || cy1>cy2 || x>cx2 || y>cy2 || x+new_width<=cx1 || y+new_height<=cy1) return ; if (x=cx2) new_width-=x+new_width-1-cx2; if (ycy2) new_height-=y+new_height-cy2; uchar d; for (iy=iy_start;new_height>0;new_height--,y++,iy+=ystep) { sl1=im->scan_line(iy>>16); sl2=screen->scan_line(y)+x; for (ix=ix_start,sx=0;sx>16]; if (d) *sl2=d; } } } int dev_controll::need_plus_minus() { if (state==DEV_MOVE_LIGHT) return 1; else return 0; } int dev_controll::need_arrows() { if (state==DEV_MOVE_LIGHT) return 1; else return 0; } int dev_controll::repeat_key_mode() { if (state==DEV_MOVE_LIGHT) return 1; else return 0; } int last_link_x=0,last_link_y=0; void dev_controll::dev_draw(view *v) { long x1,y1,x2,y2; if (dev&EDIT_MODE) { long vx=v->xoff(),vy=v->yoff(); if (dev&DRAW_LINKS) { for (light_source *f=first_light_source;f;f=f->next) { if (f->x-vx>=0 && f->x-vx<=(v->cx2-v->cx1+1) && f->y-vy>=0 && f->y-vy<=(v->cy2-v->cy1+1)) { image *im=cash.img(light_buttons[f->type]); im->put_image(screen,f->x-vx+v->cx1-im->width()/2,f->y-vy+v->cy1-im->height()/2,1); screen->rectangle(f->x1-vx+v->cx1,f->y1-vy+v->cy1,f->x2-vx+v->cx1,f->y2-vy+v->cy1, eh->medium_color()); } } } if (link_object) { long rx1,ry1; the_game->game_to_mouse(link_object->x,link_object->y,v,rx1,ry1); screen->line(rx1,ry1,dlastx,dlasty,yellow); } if (selected_light) { image *i=cash.img(light_buttons[0]); int l=i->width()/2,h=i->height()/2; long rx1,ry1; the_game->game_to_mouse(selected_light->x,selected_light->y,v,rx1,ry1); screen->rectangle(rx1-l,ry1-h,rx1+l,ry1+h,eh->bright_color()); } game_object *o; if (show_names) for (o=current_level->first_object();o;o=o->next) { the_game->game_to_mouse(o->x,o->y,current_view,x1,y1); char *nm=object_names[o->otype]; console_font->put_string(screen,x1-strlen(nm)*console_font->width()/2,y1+2,nm); } if (dev&DRAW_LINKS) { // draw connections between objects for (o=current_level->first_object();o;o=o->next) { the_game->game_to_mouse(o->x,o->y,current_view,x1,y1); int i=0; for (;itotal_objects();i++) { game_object *other=o->get_object(i); the_game->game_to_mouse(other->x,other->y,current_view,x2,y2); screen->line(x1,y1,x2,y2,eh->bright_color()); } for (i=0;itotal_lights();i++) { light_source *l=o->get_light(i); the_game->game_to_mouse(l->x,l->y,current_view,x2,y2); screen->line(x1,y1,x2,y2,light_connection_color); } } } if (selected_object) { selected_object->picture_space(x1,y1,x2,y2); long rx1,ry1,rx2,ry2; the_game->game_to_mouse(x1,y1,v,rx1,ry1); the_game->game_to_mouse(x2,y2,v,rx2,ry2); screen->rectangle(rx1,ry1,rx2,ry2,eh->bright_color()); the_game->game_to_mouse(selected_object->x,selected_object->y,current_view,x1,y1); for (int i=0;itotal_objects();i++) { game_object *other=selected_object->get_object(i); the_game->game_to_mouse(other->x,other->y,current_view,x2,y2); screen->line(x1,y1,x2,y2,light_connection_color); } } } update_memprof(); } light_source *find_light(long x, long y) { image *i=cash.img(light_buttons[0]); int l=i->width()/2,h=i->height()/2; for (light_source *f=first_light_source;f;f=f->next) { if (x>=f->x-l && x<=f->x+l && y>=f->y-h && y<=f->y+h) return f; } return NULL; } extern void small_static_allocation_summary(int &total, int *&static_list, int *&cache_list); void dev_controll::update_memprof() { if (memprof) { int i,largest=0; int total,*st,*ch; small_static_allocation_summary(total,st,ch); int x=WINDOW_FRAME_LEFT; int y=WINDOW_FRAME_TOP; memprof->clear(); for (i=0;iscreen->bar(x,y,x,y+h,eh->bright_color()); h=ch[i]*100/3000; memprof->screen->bar(x,y,x,y+h,eh->medium_color()); x++; } jfree(st); jfree(ch); char buf[100]; sprintf(buf,"%8d %8d",j_allocated(),j_available()); eh->font()->put_string(memprof->screen,memprof->x1(),memprof->y2()-eh->font()->height(),buf); } } void dev_controll::toggle_memprof() { if (memprof) { prop->setd("memprof x",memprof->x); prop->setd("memprof y",memprof->y); eh->close_window(memprof); memprof=NULL; } else { int total,*st,*ch; small_static_allocation_summary(total,st,ch); jfree(st); jfree(ch); memprof=eh->new_window(0,0,total*2+20,100,NULL); update_memprof(); } } void dev_controll::toggle_toolbar() { if (tbw) { tbw_on=0; prop->setd("toolbar x",tbw->x); prop->setd("toolbar y",tbw->y); eh->close_window(tbw); tbw=NULL; } else { tbw_on=1; int setx=0; for (int i=0;inew_window(prop->getd("toolbar x",-1), prop->getd("toolbar y",-1),-1,-1,tp); tp->set_x(setx,tbw->screen,eh); } } void dev_controll::toggle_show_menu() { if (show_menu) { show_menu_on=0; prop->setd("layer x",show_menu->x); prop->setd("layer y",show_menu->y); eh->close_window(show_menu); show_menu=NULL; } else { show_menu_on=1; int sx=WINDOW_FRAME_LEFT,sy=WINDOW_FRAME_TOP; button *lnb=new button(sx,sy+100,SHOW_LINKS, symbol_str("l_links"),NULL); if (dev&DRAW_LINKS) lnb->push(); button *lb=new button(sx,sy+80, SHOW_LIGHT, symbol_str("l_light"),lnb); if (dev&DRAW_LIGHTS) lb->push(); button *cb=new button(sx,sy+60, SHOW_CHARACTERS, symbol_str("l_char"),lb); if (dev&DRAW_PEOPLE_LAYER) cb->push(); button *bb=new button(sx,sy+40, SHOW_BACKGROUND, symbol_str("l_back"),cb); if (dev&DRAW_BG_LAYER) bb->push(); button *bdb=new button(sx,sy+20, SHOW_FOREGROUND_BOUND, symbol_str("l_bound"),bb); if (dev&DRAW_FG_BOUND_LAYER) bdb->push(); button *fb=new button(sx,sy+ 0, SHOW_FOREGROUND, symbol_str("l_fore"),bdb); if (dev&DRAW_FG_LAYER) fb->push(); show_menu=eh->new_window(prop->getd("layer x",-1), prop->getd("layer y",-1), -1,-1,fb,symbol_str(symbol_str("SHOW?"))); } } char **listable_objs=NULL; int total_listable; void dev_controll::toggle_omenu() { if (omenu) { omenu_on=0; prop->setd("objects x",omenu->x); prop->setd("objects y",omenu->y); eh->close_window(omenu); omenu=NULL; jfree(listable_objs); listable_objs=NULL; } else { omenu_on=1; total_listable=0; int i=0; for (;iget_cflag(CFLAG_UNLISTABLE)) total_listable++; listable_objs=(char **)jmalloc(sizeof(char *)*total_listable,"omenu list"); int c=0; for (i=0;iget_cflag(CFLAG_UNLISTABLE)) { listable_objs[c]=object_names[i]; c++; } omenu=eh->new_window(prop->getd("objects x",0), prop->getd("objects y",0),-1,-1, new pick_list(WINDOW_FRAME_LEFT, WINDOW_FRAME_TOP,DEV_CREATE,yres/eh->font()->height()/2, listable_objs,total_listable,0,NULL,cash.img(window_texture))); } } int get_omenu_item(int x) { for (int i=0;isetd("pal x",pmenu->x); prop->setd("pal y",pmenu->y); eh->close_window(pmenu); pmenu=NULL; jfree(pwin_list); } else if (total_pals) { pmenu_on=1; pwin_list=(char **)jmalloc(total_pals*sizeof(char *),"pal pick list"); int i; for (i=0;iname; pmenu=eh->new_window(prop->getd("pal x",0), prop->getd("pal y",-1), -1,-1, new pick_list(WINDOW_FRAME_LEFT, WINDOW_FRAME_TOP,DEV_PALETTE,yres/eh->font()->height()/2, pwin_list,total_pals,0,NULL,cash.img(window_texture))); } else the_game->show_help(symbol_str("no_pals")); } void dev_controll::toggle_fgw() { if (!forew) { forew_on=0; int maxh=(yres-25)/(the_game->ftile_height()/fg_scale); int tw=the_game->ftile_width()*fg_w/fg_scale, th=the_game->ftile_height()/fg_scale; tile_picker *f_tp=new tile_picker(WINDOW_FRAME_LEFT+1,WINDOW_FRAME_TOP+1, DEV_FG_PICKER,SPEC_FORETILE,eh,fg_scale,maxh,fg_w,NULL); f_tp->reverse(); forew=eh->new_window(prop->getd("fore x",-30), prop->getd("fore y",0), -1,-1, f_tp,symbol_str("l_fg")); } else { forew_on=1; prop->setd("fore x",forew->x); prop->setd("fore y",forew->y); eh->close_window(forew); forew=NULL; } } void dev_controll::toggle_music_window() { /* if (!music_window) { music_window=eh->new_window(-1,30,0,0, new pick_list(WINDOW_FRAME_LEFT,WINDOW_FRAME_TOP, DEV_MUSIC_PICKLIST,10,song_list,total_songs,0,NULL)); eh->fnt->put_string(music_window->screen,WINDOW_FRAME_LEFT,1,"songs"); } else { eh->close_window(music_window); music_window=NULL; }*/ } void dev_controll::toggle_bgw() { if (!backw) { backw_on=0; int maxh=(yres-25)/(the_game->btile_height()/bg_scale); int tw=the_game->btile_width()*bg_w/bg_scale, th=the_game->btile_height()/bg_scale; backw=eh->new_window(prop->getd("back x",-30), prop->getd("back y",0), -1,-1, new tile_picker(WINDOW_FRAME_LEFT+1,WINDOW_FRAME_TOP+1, DEV_BG_PICKER,SPEC_BACKTILE,eh,bg_scale,maxh,bg_w,NULL),symbol_str("l_bg")); } else { backw_on=1; prop->setd("back x",backw->x); prop->setd("back y",backw->y); eh->close_window(backw); backw=NULL; } } void dev_controll::toggle_search_window() { if (!search_window) { int wl=WINDOW_FRAME_LEFT+1, wh=WINDOW_FRAME_TOP+1; int bh=cash.img(dev_forward)->height(), bw=cash.img(dev_forward)->width(); search_window=eh->new_window(prop->getd("searchw x",-30), prop->getd("searchw y",0), -1,-1, new text_field(wl,wh,ID_SEARCH_TEXT,"object name>", "***************************", prop->get("search name",""), new button(wl+bw*1,wh+eh->font()->height()+5,ID_SEARCH_BACKWARD, cash.img(dev_backward), new button(wl+bw*3,wh+eh->font()->height()+5,ID_SEARCH_FOREWARD, cash.img(dev_forward),NULL))),"SEARCH"); searchw_on=0; } else { searchw_on=1; prop->setd("searchw x",search_window->x); prop->setd("searchw y",search_window->y); prop->set("search name",search_window->read(ID_SEARCH_TEXT)); eh->close_window(search_window); search_window=NULL; search_object=NULL; } } int open_owin=0,open_fwin=0,open_bwin=0,start_edit=0,start_nodelay=0,start_doubled=0,start_mem=0; int get_option(char *name); void dev_init(int argc, char **argv) { scale_mult=1; scale_div=1; dev=0; int i; prop=new property_manager; prop->load("defaults.prp"); for (i=1;igetd("fg_reversed",0); mouse_scrolling=prop->getd("mouse_scrolling",0); palettes_locked=prop->getd("palettes_locked",0); view_shift_disabled=prop->getd("view_shift_disabled",0); fps_on=prop->getd("fps_on",0); show_names=prop->getd("show_names",0); raise_all=prop->getd("raise_all",0); } static pmenu *make_menu(int x, int y); dev_controll::dev_controll() { area_win=NULL; current_area=NULL; fg_w=bg_w=1; commandw=NULL; bg_scale=fg_scale=1; pal_wins=NULL; total_pals=0; state=DEV_SELECT; aiw=NULL; edit_light=NULL; selected_light=NULL; tbw=NULL; modew=NULL; link_object=NULL; selected_object=NULL; edit_object=NULL; ai_object=NULL; memprof=NULL; oedit=NULL; forew=NULL; backw=NULL; omenu=NULL; ledit=NULL; pmenu=NULL; lightw=NULL; search_window=NULL; show_menu=NULL; music_window=NULL; ambw=NULL; load_dev_icons(); if (open_owin) toggle_omenu(); if (open_fwin) toggle_fgw(); if (open_bwin) toggle_bgw(); if (start_nodelay) the_game->toggle_delay(); yellow=pal->find_closest(255,255,0); if (start_edit) { the_game->load_level(level_file); the_game->draw(); } dev_console=new dev_term(50,18,this); if (start_edit) make_edit_mode_menu(); if (get_option("-nolight")) dev=dev^DRAW_LIGHTS; if (start_mem) toggle_memprof(); } void dev_controll::set_state(int new_state) { if (start_doubled && new_state==RUN_STATE && !small_render) double_render(); } void dev_controll::load_stuff() { if (dev & EDIT_MODE) { char prog[100],*cs; strcpy(prog,"(compile-file \"edit.lsp\")"); cs=prog; void *p=compile(cs); l_user_stack.push(p); eval(p); l_user_stack.pop(1); for (int i=0;iclose_window(); } } void dev_controll::do_command(char *command, event &ev) { char fword[50],*st; int l,h,x,y,i; if (command[0]=='(') // is this a lisp command? { eval(compile(command)); return ; } sscanf(command,"%s",fword); for (st=command;*st && *st!=' ';st++); if (*st) st++; if (!strcmp(fword,"active")) { if (current_level && current_level->first_active_object()) { game_object *o=current_level->first_active_object(); while (o) { dprintf("%s %d %d %d %d\n",object_names[o->otype],o->x,o->y, figures[o->otype]->rangex, figures[o->otype]->rangey ); o=o->next_active; } } } if (!strcmp(fword,"clear_weapons")) { view *f=NULL; for (f=player_list;f;f=f->next) { int i; for (i=0;iweapons[i]=-1; if (total_weapons) f->weapons[0]=0; } } if (!strcmp(fword,"reload")) { if (current_level && player_list && player_list->focus) { edit_object=selected_object=NULL; long cx=player_list->focus->x,cy=player_list->focus->y; // save the old weapon array long *w=(long *)jmalloc(total_weapons*sizeof(long),"tmp weapon array"); memcpy(w,player_list->weapons,total_weapons*sizeof(long)); char tmp[100]; strcpy(tmp,current_level->name()); the_game->load_level(tmp); current_level->unactivate_all(); if (screen) // don't draw if graphics haven't been setup yet. the_game->draw(); player_list->reset_player(); player_list->focus->x=cx; player_list->focus->y=cy; memcpy(player_list->weapons,w,total_weapons*sizeof(long)); jfree(w); the_game->need_refresh(); } } if (!strcmp(fword,"unchop")) { long rx,ry; the_game->btile_on(dlastx,dlasty,rx,ry); if (rx>=0 && ry>=0) { if (sscanf(command,"%s%d%d",fword,&l,&h)==3) { dprintf("unchopped %dx%d to ",l,h); l=(l+the_game->btile_width()-1)/the_game->btile_width(); h=(h+the_game->btile_height()-1)/the_game->btile_height(); for (y=0,i=cur_bg;yput_bg(rx+x,ry+y,i++); dprintf("%dx%d\n",l,h); } else dprintf(symbol_str("unchop1")); } } if (!strcmp(fword,"center")) { view *v=the_game->first_view; for (;v;v=v->next) { v->pan_x=0; v->pan_y=0; } the_game->need_refresh(); } if (!strcmp(fword,"size")) { int l,w; if (sscanf(command,"%s%d%d",fword,&l,&w)==3) { current_level->set_size(l,w); dprintf("level is now %dx%d\n",l,w); } else dprintf(symbol_str("size1")); } if (!strcmp(fword,"name")) { while (*command && *command!=' ') command++; if (*command) current_level->set_name(command+1); dprintf(symbol_str("name_now"),current_level->name()); } if (!strcmp(fword,"set_first_level")) { strcpy(level_file,st); dprintf("first level will be '%s'\n",level_file); } if (!strcmp(fword,"load")) { if (!strcmp(st,"STARTING_LEVEL")) st=level_file; dprintf("loading '%s'\n",st); the_game->load_level(st); current_level->unactivate_all(); the_game->need_refresh(); } if (!strcmp(fword,"mem")) { if (st[0]) show_char_mem(st); else show_mem(); } if (!strcmp(fword,"esave")) { dprintf(symbol_str("esave")); save(); } if (!strcmp(fword,"delete")) { if (selected_object) { if (!(dev&EDIT_MODE) && current_level->is_attacker(selected_object)) the_game->show_help(symbol_str("nd_player")); else { if (selected_object->controller()) the_game->show_help(symbol_str("nd_player")); else { current_level->delete_object(selected_object); if (S_DELETE_SND>0) cash.sfx(S_DELETE_SND)->play(sfx_volume/2); selected_object=NULL; } } } else if (selected_light) { if (!edit_light) { if (current_level) { current_level->remove_light(selected_light); if (S_DELETE_SND>0) cash.sfx(S_DELETE_SND)->play(sfx_volume/2); } else delete_light(selected_light); selected_light=NULL; } } else the_game->show_help(symbol_str("d_nosel")); the_game->need_refresh(); } if (!strcmp(fword,"create")) { char oname[100]; sscanf(command,"%s%s",fword,oname); // read the type of object to create int x,t=-1; for (x=0;x=0) // did we find it? { long rx,ry; the_game->mouse_to_game(dlastx,dlasty,rx,ry); edit_object=create(t,rx,ry); current_level->add_object(edit_object); the_game->need_refresh(); last_created_type=t; } else { sprintf(fword,"No such object type : %s\n",oname); the_game->show_help(fword); } } if (!strcmp(fword,"move")) { if (selected_object) edit_object=selected_object; if (edit_object) state=DEV_MOVE_OBJECT; else the_game->show_help("No object selected"); } if (!strcmp(fword,"move_light")) { if (selected_light) edit_light=selected_light; if (edit_light) state=DEV_MOVE_LIGHT; else the_game->show_help("No light selected"); } if (!strcmp(fword,"clear_auto")) { long i,j; for (i=0;iforeground_width();i++) for (j=0;jforeground_height();j++) current_level->clear_fg(i,j); } if (!strcmp(fword,"fg_select")) { long x,y; the_game->ftile_on(dlastx,dlasty,x,y); if (x>=0 && y>=0 && xforeground_width() && yforeground_height()) { cur_fg=current_level->get_fg(x,y); if (forew) ((tile_picker *)forew->read(DEV_FG_PICKER))->recenter(forew->screen,eh); the_game->need_refresh(); } } if (!strcmp(fword,"toggle_fg_raise")) { long x,y; the_game->ftile_on(dlastx,dlasty,x,y); if (x>=0 && y>=0 && xforeground_width() && yforeground_height()) current_level->fg_set_raised(x,y,!current_level->fg_raised(x,y)); } if (!strcmp(fword,"fg_add")) { int x; if (sscanf(st,"%d",&x)) { cur_fg++; if (cur_fg<0) cur_fg=0; if (cur_fg>=nforetiles) cur_fg=nforetiles-1; if (forew) ((tile_picker *)forew->read(DEV_FG_PICKER))->recenter(forew->screen,eh); } } if (!strcmp(fword,"mem_report")) mem_report("memory.report"); if (!strcmp(fword,"restart")) { current_level->restart(); } if (!strcmp(fword,"quit")) { the_game->end_session(); } if (!strcmp(fword,"to_front")) { game_object *which=selected_object; if (!selected_object) which=edit_object; if (which) current_level->to_front(which); else the_game->show_help(symbol_str("forward?")); } if (!strcmp(fword,"to_back")) { game_object *which=selected_object; if (!selected_object) which=edit_object; if (which) current_level->to_back(which); else the_game->show_help(symbol_str("back?")); } if (!strcmp(fword,"set_aitype")) { game_object *which=selected_object; if (!selected_object) which=edit_object; if (which) { int x; if (*st && sscanf(st,"%d",&x)!=EOF) which->change_aitype(x); else { switch (ev.key) { case '0' : which->change_aitype(0); break; case '1' : which->change_aitype(1); break; case '2' : which->change_aitype(2); break; case '3' : which->change_aitype(3); break; case '4' : which->change_aitype(4); break; case '5' : which->change_aitype(5); break; case '6' : which->change_aitype(6); break; case '7' : which->change_aitype(7); break; case '8' : which->change_aitype(8); break; case '9' : which->change_aitype(9); break; case ')' : which->change_aitype(10); break; case '!' : which->change_aitype(11); break; case '@' : which->change_aitype(12); break; case '#' : which->change_aitype(13); break; case '$' : which->change_aitype(14); break; case '%' : which->change_aitype(15); break; case '^' : which->change_aitype(16); break; case '&' : which->change_aitype(17); break; case '*' : which->change_aitype(18); break; case '(' : which->change_aitype(19); break; } } the_game->need_refresh(); } else the_game->show_help(symbol_str("aitype")); } } void dev_controll::toggle_light_window() { if (!lightw) { int wl=WINDOW_FRAME_LEFT,wh=WINDOW_FRAME_TOP,bh=16+6,bw=20+6,th=eh->font()->height()+4; lightw=eh->new_window(prop->getd("light create x",0), prop->getd("light create y",0), -1,-1,new button_box(wl,wh,DEV_LIGHT_BUTTON_BOX,1, new button(wl+bw*0,wh+bh*0,DEV_LIGHT0,cash.img(light_buttons[0]), new button(wl+bw*1,wh+bh*0,DEV_LIGHT1,cash.img(light_buttons[1]), new button(wl+bw*2,wh+bh*0,DEV_LIGHT2,cash.img(light_buttons[2]), new button(wl+bw*0,wh+bh*1,DEV_LIGHT3,cash.img(light_buttons[3]), new button(wl+bw*1,wh+bh*1,DEV_LIGHT4,cash.img(light_buttons[4]), new button(wl+bw*2,wh+bh*1,DEV_LIGHT5,cash.img(light_buttons[5]), new button(wl+bw*0,wh+bh*2,DEV_LIGHT6,cash.img(light_buttons[6]), new button(wl+bw*1,wh+bh*2,DEV_LIGHT7,cash.img(light_buttons[7]), new button(wl+bw*2,wh+bh*2,DEV_LIGHT8,cash.img(light_buttons[8]), new button(wl+bw*0,wh+bh*3,DEV_LIGHT9,cash.img(light_buttons[9]), new button(wl+bw*1,wh+bh*3,DEV_AMBIENT,cash.img(light_buttons[11]), NULL))))))))))), new text_field(wl,wh+bh*4,DEV_LIGHTW, "W ","******", prop->getd("light create w",0), new text_field(wl,wh+bh*4+th*1,DEV_LIGHTH, "H ","******", prop->getd("light create h",0), new text_field(wl,wh+bh*4+th*2,DEV_LIGHTR1,"R1","******", prop->getd("light create r1",1), new text_field(wl,wh+bh*4+th*3,DEV_LIGHTR2,"R2","******", prop->getd("light create r2",100), NULL))))), symbol_str("l_light")); } else { prop->setd("light create x",lightw->x); prop->setd("light create y",lightw->y); prop->setd("light create w",atoi(lightw->read(DEV_LIGHTW))); prop->setd("light create h",atoi(lightw->read(DEV_LIGHTH))); prop->setd("light create r1",atoi(lightw->read(DEV_LIGHTR1))); prop->setd("light create r2",atoi(lightw->read(DEV_LIGHTR2))); eh->close_window(lightw); lightw=NULL; } } void dev_controll::make_ai_window(game_object *o) { ai_object=o; int th=eh->font()->height()+4,wl=WINDOW_FRAME_LEFT,wh=WINDOW_FRAME_TOP+20; if (figures[o->otype]->total_fields) { ifield *next=NULL; int maxl=0; int i=0; for (;iotype]->total_fields;i++) if (strlen(figures[o->otype]->fields[i]->descript_name)>maxl) maxl=strlen(figures[o->otype]->fields[i]->descript_name); int owh=wh; ifield *first,*last=NULL; for (i=0;iotype]->total_fields;i++) { char tmp[200]; strcpy(tmp,figures[o->otype]->fields[i]->descript_name); for (int j=maxl-strlen(figures[o->otype]->fields[i]->descript_name);j;j--) strcat(tmp," "); int er; ifield *p=new text_field(wl,wh,ID_NULL,tmp,"######", (double)o->get_var_by_name(figures[o->otype]->fields[i]->real_name,er), NULL); if (last) last->next=p; else first=p; last=p; wh+=th; } aiw=eh->new_window(prop->getd("ai x",0), prop->getd("ai y",0), -1,-1, new button(wl,owh-20,DEV_AI_OK,cash.img(dev_ok),first),"ai"); } else { aiw=eh->new_window(prop->getd("ai x",0), prop->getd("ai y",0), -1,-1, new button(wl,wh-20,DEV_AI_OK,cash.img(dev_ok), new text_field(wl,wh+th*0, DEV_AI_XVEL, symbol_str("ai_xvel"),"#####",(double)o->xvel(), new text_field(wl,wh+th*1, DEV_AI_YVEL, symbol_str("ai_yvel"),"#####",(double)o->yvel(), new text_field(wl,wh+th*2, DEV_AI_XACEL, symbol_str("ai_xacel"),"#####",(double)o->xacel(), new text_field(wl,wh+th*3, DEV_AI_YACEL, symbol_str("ai_yacel"),"#####",(double)o->yacel(), new text_field(wl,wh+th*4, DEV_AI_STTIME, symbol_str("ai_stime"),"####",(double)o->aistate_time(), new text_field(wl,wh+th*5, DEV_AI_GRAVITY, symbol_str("ai_gravity"),"####",(double)o->gravity(), new text_field(wl,wh+th*6, DEV_AI_HEALTH, symbol_str("ai_health"),"####",(double)o->hp(), new text_field(wl,wh+th*7, DEV_AI_MORPHPR, symbol_str("ai_morph"),"####",(double)o->mp(), new text_field(wl,wh+th*8, DEV_AI_TYPE, symbol_str("ai_type"),"####",(double)o->aitype(), new text_field(wl,wh+th*9,DEV_AI_STATE, symbol_str("ai_state"),"####",(double)o->aistate(), new text_field(wl,wh+th*10,DEV_AI_FADE, symbol_str("ai_fade"),"####",(double)o->fade_count(), NULL)))))))))))),"ai"); } eh->grab_focus(aiw); } void dev_controll::notify_deleted_light(light_source *l) { if (l==edit_light) { if (ledit) { prop->setd("ledit x",ledit->x); prop->setd("ledit y",ledit->y); eh->close_window(ledit); ledit=NULL; } edit_light=NULL; } if (l==selected_light) selected_light=NULL; } void dev_controll::notify_deleted_object(game_object *o) { if (o==edit_object) { state=DEV_SELECT; close_oedit_window(); } if (o==ai_object) close_ai_window(); if (o==search_object) { if (search_window) toggle_search_window(); search_object=NULL; } if (o==link_object) link_object=NULL; if (o==selected_object) { selected_object=NULL; state=DEV_SELECT; } } void dev_controll::close_ai_window() { if (aiw) { game_object *o=ai_object; long x; if (o) { if (figures[o->otype]->total_fields) { ifield *f=aiw->inm->get(DEV_AI_OK)->next; for (int i=0;iotype]->total_fields;i++) { x=atoi(f->read()); char *v=figures[o->otype]->fields[i]->real_name; int er; if (o->get_var_by_name(v,er)!=x) o->set_var_by_name(v,x); f=f->next; } } else { x=atoi(aiw->read(DEV_AI_XVEL)); if (x!=o->xvel()) o->set_xvel(x); x=atoi(aiw->read(DEV_AI_YVEL)); if (x!=o->yvel()) o->set_yvel(x); x=atoi(aiw->read(DEV_AI_XACEL)); if (x!=o->xacel()) o->set_xacel(x); x=atoi(aiw->read(DEV_AI_YACEL)); if (x!=o->yacel()) o->set_yacel(x); x=atoi(aiw->read(DEV_AI_STTIME)); if (x!=o->aistate_time()) o->set_aistate_time(x); x=atoi(aiw->read(DEV_AI_GRAVITY)); if (x!=o->gravity()) o->set_gravity(x); x=atoi(aiw->read(DEV_AI_HEALTH)); if (x!=o->hp()) o->set_hp(x); x=atoi(aiw->read(DEV_AI_MORPHPR)); if (x!=o->mp()) o->set_mp(x); x=atoi(aiw->read(DEV_AI_TYPE)); if (x!=o->aitype()) o->set_aitype(x); x=atoi(aiw->read(DEV_AI_STATE)); if (x!=o->aistate()) o->set_aistate(x); x=atoi(aiw->read(DEV_AI_FADE)); if (x!=o->fade_count()) o->set_fade_count(x); } } prop->setd("ai x",aiw->x); prop->setd("ai y",aiw->y); eh->close_window(aiw); aiw=NULL; ai_object=NULL; the_game->need_refresh(); } } void dev_controll::area_handle_input(event &ev) { if (ev.type==EV_MOUSE_BUTTON && ev.mouse_button) { long gx,gy; the_game->mouse_to_game(last_demo_mx,last_demo_my,gx,gy); if (!current_level) return ; current_area=current_level->area_list=new area_controller(gx,gy, the_game->ftile_width(), the_game->ftile_height(), current_level->area_list); the_game->need_refresh(); state=DEV_DRAG_AREA_BOTTOM; } } void dev_controll::close_area_win(int read_values) { if (area_win) { prop->setd("area_box x",area_win->x); prop->setd("area_box y",area_win->y); if (current_area && read_values) { current_area->ambient=atoi(area_win->read(DEV_AREA_AMBIENT)); current_area->ambient_speed=atoi(area_win->read(DEV_AREA_AMBIENT_SPEED)); current_area->view_xoff=atoi(area_win->read(DEV_AREA_VIEW_XOFF)); current_area->view_yoff=atoi(area_win->read(DEV_AREA_VIEW_YOFF)); current_area->view_xoff_speed=atoi(area_win->read(DEV_AREA_VIEW_XOFF_SPEED)); current_area->view_yoff_speed=atoi(area_win->read(DEV_AREA_VIEW_YOFF_SPEED)); } eh->close_window(area_win); area_win=NULL; } } void dev_controll::pick_handle_input(event &ev) { area_controller *find=NULL; int find_top=0; if (!current_level) return; if (ev.type==EV_MOUSE_BUTTON && ev.mouse_button) { long mx=last_demo_mx,my=last_demo_my; view *v=the_game->view_in(mx,my); for (area_controller *a=current_level->area_list;a;a=a->next) { long x1,y1,x2,y2; the_game->game_to_mouse(a->x,a->y,v,x1,y1); the_game->game_to_mouse(a->x+a->w,a->y+a->h,v,x2,y2); if (abs(x1-mx)<2 && abs(y1-my)<2) { find=a; find_top=1; } else if (abs(x2-mx)<2 && abs(y2-my)<2) { find=a; find_top=0; } } time_marker now; int dc=now.diff_time(&last_area_click)<0.5; last_area_click.get_time(); if (find && current_area && dc) { if (area_win) close_area_win(0); int wl=WINDOW_FRAME_LEFT; int wh=WINDOW_FRAME_TOP,th=eh->font()->height()+12,bw=cash.img(dev_ok)->width()+10; area_win=eh->new_window(prop->getd("area_box x",0), prop->getd("area_box y",0), -1,-1, new button(wl+bw*0,wh-8,DEV_AREA_OK,cash.img(dev_ok), new button(wl+bw*1,wh-8,DEV_AREA_DELETE,cash.img(dev_del), new text_field(wl,wh+th*1,DEV_AREA_AMBIENT, symbol_str("a_ambient"),"******",current_area->ambient, new text_field(wl,wh+th*2,DEV_AREA_AMBIENT_SPEED, symbol_str("a_aspeed"),"******",current_area->ambient_speed, new text_field(wl,wh+th*3,DEV_AREA_VIEW_XOFF, symbol_str("a_view_xoff"),"******",current_area->view_xoff, new text_field(wl,wh+th*4,DEV_AREA_VIEW_YOFF, symbol_str("a_view_yoff"),"******",current_area->view_yoff, new text_field(wl,wh+th*5,DEV_AREA_VIEW_XOFF_SPEED, symbol_str("a_view_xspd"),"******",current_area->view_xoff_speed, new text_field(wl,wh+th*6,DEV_AREA_VIEW_YOFF_SPEED, symbol_str("a_view_yspd"),"******",current_area->view_yoff_speed, NULL))))))))); } else if (find) { current_area=find; current_area->active=1; if (find_top) state=DEV_DRAG_AREA_TOP; else state=DEV_DRAG_AREA_BOTTOM; the_game->need_refresh(); } else if (current_area) { current_area->active=0; current_area=NULL; the_game->need_refresh(); } } } void dev_controll::close_oedit_window() { if (oedit) { prop->setd("oedit x",oedit->x); prop->setd("oedit y",oedit->y); eh->close_window(oedit); oedit=NULL; edit_object=NULL; } } int screen_shot_on=1; int sshot_fcount=-1; void dev_controll::event_move_object(event &ev) { if (!edit_object) { state=DEV_SELECT; } else { if (ev.type==EV_MOUSE_MOVE) { the_game->mouse_to_game(last_demo_mx,last_demo_my,edit_object->x,edit_object->y); edit_object->x=snap_x(edit_object->x); edit_object->y=snap_y(edit_object->y); the_game->need_refresh(); } else if (ev.mouse_button==1 && ev.window==NULL) { state=DEV_MOUSE_RELEASE; selected_object=edit_object=NULL; } if (ev.window==NULL && ev.type==EV_KEY && ev.key=='d') { long xv=0,yv=100; edit_object->try_move(edit_object->x,edit_object->y,xv,yv,1); edit_object->y+=yv; state=DEV_SELECT; selected_object=edit_object=NULL; } } } void dev_controll::event_move_light(event &ev) { if (edit_light) { if (ev.type==EV_MOUSE_MOVE) { the_game->mouse_to_game(last_demo_mx,last_demo_my,edit_light->x,edit_light->y); edit_light->x=snap_x(edit_light->x); edit_light->y=snap_y(edit_light->y); edit_light->calc_range(); the_game->need_refresh(); } else if (ev.type==EV_KEY) { int rd=0; switch (ev.key) { case '+' : { if (edit_light->type==9) { if (edit_light->inner_radius<64) { edit_light->inner_radius++; rd=1; } } else { edit_light->outer_radius++; rd=1; } } break; case '-' : { if (edit_light->type==9) { if (edit_light->inner_radius>0) { edit_light->inner_radius--; rd=1; } } else if (edit_light->outer_radius>edit_light->inner_radius+1) { edit_light->outer_radius--; rd=1; } } break; case JK_RIGHT : { if (edit_light->type==9) { edit_light->xshift++; rd=1; } else if (edit_light->xshift>0) { edit_light->xshift--; rd=1; } } break; case JK_LEFT : { if (edit_light->type==9) { if (edit_light->xshift>1) { edit_light->xshift--; rd=1; } } else { edit_light->xshift++; rd=1; } } break; case JK_UP : { if (edit_light->type==9) { edit_light->yshift++; rd=1; } else if (edit_light->yshift>0) { edit_light->yshift--; rd=1; } } break; case JK_DOWN : { if (edit_light->type==9) { if (edit_light->yshift>1) { edit_light->yshift--; rd=1; } } else { edit_light->yshift++; rd=1; } } break; } if (rd) { edit_light->calc_range(); the_game->need_refresh(); } } } if ((ev.mouse_button==1 && ev.window==NULL) || !edit_light) state=DEV_MOUSE_RELEASE; } void dev_controll::event_drag_area_bottom(event &ev) { if (current_area) { long gx,gy; the_game->mouse_to_game(last_demo_mx,last_demo_my,gx,gy); if (gx>current_area->x && gy>current_area->y) { if (gx-current_area->x!=current_area->w || gy-current_area->y!=current_area->h) { the_game->need_refresh(); current_area->w=gx-current_area->x; current_area->h=gy-current_area->y; } } if (ev.type==EV_MOUSE_BUTTON && !ev.mouse_button) { current_area->active=0; state=DEV_SELECT; } } } void dev_controll::event_drag_area_top(event &ev) { if (current_area) { long gx,gy; the_game->mouse_to_game(last_demo_mx,last_demo_my,gx,gy); if (gxx+current_area->w && gyy+current_area->h) { if (gx!=current_area->x || gy!=current_area->y) { the_game->need_refresh(); current_area->x=gx; current_area->y=gy; } } if (ev.type==EV_MOUSE_BUTTON && !ev.mouse_button) { current_area->active=0; state=DEV_SELECT; } } } void dev_controll::event_select(event &ev) { long x,y; if (dev&EDIT_MODE) { game_object *old=selected_object; selected_object=NULL; if (ev.window==NULL) { long rx,ry; the_game->mouse_to_game(last_demo_mx,last_demo_my,rx,ry); if (!(dev & MAP_MODE)) { if (dev&DRAW_PEOPLE_LAYER) selected_object=current_level->find_object(rx,ry); light_source *old_light=selected_light; if (selected_object) selected_light=NULL; else selected_light=find_light(rx,ry); if (selected_light!=old_light) the_game->need_refresh(); } else { selected_light=NULL; } if (edit_mode==ID_DMODE_DRAW) { if (ev.mouse_button==1 && !selected_object && !selected_light) { long xs,ys; the_game->ftile_on(last_demo_mx,last_demo_my,xs,ys); if (xs>=0 && ys>=0 && xsforeground_width() && ysforeground_height()) current_level->put_fg(xs,ys,raise_all ? make_above_tile(cur_fg) : cur_fg); the_game->need_refresh(); } else if (ev.mouse_button==1 && !selected_object && !selected_light) { long xs,ys; the_game->btile_on(last_demo_mx,last_demo_my,xs,ys); if (xs>=0 && ys>=0 && xsbackground_width() && ysbackground_height()) current_level->put_bg(xs,ys,cur_fg); the_game->need_refresh(); } } else if (edit_mode==ID_DMODE_AREA) area_handle_input(ev); else if (edit_mode==ID_DMODE_PICK) pick_handle_input(ev); } if (old!=selected_object) the_game->need_refresh(); if (ev.mouse_button) { if (selected_object) { if (edit_object && edit_object!=selected_object) edit_object->add_object(selected_object); if (oedit) close_oedit_window(); int bw=20+6,bh=16+6,wl=WINDOW_FRAME_LEFT,wh=WINDOW_FRAME_TOP,th=eh->font()->height()+4; oedit=eh->new_window(prop->getd("oedit x",0), prop->getd("oedit y",0), -1,-1,new button_box(wl,wh,ID_NULL,1, new button(wl+bw*0,wh,DEV_OEDIT_OK,cash.img(dev_ok), new button(wl+bw*1,wh,DEV_OEDIT_MOVE,cash.img(dev_move), new button(wl+bw*2,wh,DEV_OEDIT_FRONT,cash.img(dev_front), new button(wl+bw*3,wh,DEV_OEDIT_BACK,cash.img(dev_back), new button(wl+bw*4,wh,DEV_OEDIT_COPY,cash.img(dev_copy), new button(wl+bw*0,wh+bh*1,DEV_OEDIT_DELETE,cash.img(dev_del), NULL)))))), new button(wl+bw*5,wh+bh*0,DEV_OEDIT_AI,cash.img(dev_ai), new button_box(wl+bw*1,wh+bh*1,DEV_OEDIT_CHAR_BOX,0, new button(wl+bw*1,wh+bh*1,DEV_OEDIT_LEFT,cash.img(dev_char_left), new button(wl+bw*2,wh+bh*1,DEV_OEDIT_RIGHT,cash.img(dev_char_right),NULL)), new button(wl+bw*3,wh+bh*1,DEV_OBJECTS_DELETE,cash.img(dev_objects), new button(wl+bw*4,wh+bh*1,DEV_LIGHTS_DELETE,cash.img(dev_lights),NULL))))), symbol_str("l_EDIT")); edit_object=selected_object; } else if (selected_light) { if (ledit) { prop->setd("ledit x",ledit->x); prop->setd("ledit x",ledit->y); eh->close_window(ledit); } int bw=20+6,bh=16+6,wl=WINDOW_FRAME_LEFT,wh=WINDOW_FRAME_TOP,th=eh->font()->height()+4; edit_light=selected_light; if (edit_object) { edit_object->add_light(edit_light); edit_light->known=1; } ledit=eh->new_window(prop->getd("ledit x",0), prop->getd("ledit y",0), -1,-1, new button_box(wl,wh,ID_NULL,1, new button(wl+bw*0,wh,DEV_LEDIT_OK,cash.img(dev_ok), new button(wl+bw*1,wh,DEV_LEDIT_MOVE,cash.img(dev_move), new button(wl+bw*2,wh,DEV_LEDIT_COPY,cash.img(dev_copy), new button(wl+bw*3,wh,DEV_LEDIT_DEL,cash.img(dev_del),NULL)))), new text_field(wl,wh+bh,DEV_LEDIT_W, "W ","******",edit_light->xshift, new text_field(wl,wh+bh+th*1,DEV_LEDIT_H, "H ","******",edit_light->yshift, new text_field(wl,wh+bh+th*2,DEV_LEDIT_R1,"R1","******",(int)(edit_light->inner_radius), new text_field(wl,wh+bh+th*3,DEV_LEDIT_R2,"R2","******",(int)(edit_light->outer_radius), NULL)))))); } else if (ev.window==NULL) { if (dlastx>=0 && dlasty>=0 && edit_mode==ID_DMODE_DRAW) { if ((dev & DRAW_FG_LAYER) && ev.mouse_button==1) { the_game->ftile_on(last_demo_mx,last_demo_my,x,y); if (x>=0 && y>=0 && xforeground_width() && yforeground_height()) the_game->put_fg(x,y,raise_all ? make_above_tile(cur_fg) : cur_fg); } if ((dev & DRAW_BG_LAYER) && ev.mouse_button==2) { the_game->btile_on(last_demo_mx,last_demo_my,x,y); if (x>=0 && y>=0 && xbackground_width() && ybackground_height()) the_game->put_bg(x,y,cur_bg); } } } } } } void dev_controll::event_key(event &ev) { long x,y; if (backw && ev.window==backw) { if (ev.key=='-' && bg_scalebtile_height()/2) { toggle_bgw(); bg_scale++; toggle_bgw(); } else if (ev.key=='+' && bg_scale>1) { toggle_bgw(); bg_scale--; toggle_bgw(); } else if (ev.key=='b') toggle_bgw(); else if (ev.key=='B') { toggle_bgw(); bg_w++; if (bg_w>6) bg_w=1; toggle_bgw(); } } if (forew && ev.window==forew) { if (ev.key=='-' && fg_scaleftile_height()/2) { toggle_fgw(); fg_scale++; toggle_fgw(); } else if (ev.key=='+' && fg_scale>1) { toggle_fgw(); fg_scale--; toggle_fgw(); } else if (ev.key=='i') { toggle_fgw(); fg_reversed=!fg_reversed; prop->setd("fg_reversed",fg_reversed); toggle_fgw(); } else if (ev.key=='f') toggle_fgw(); else if (ev.key=='F') { toggle_fgw(); fg_w++; if (fg_w>6) fg_w=1; toggle_fgw(); } } if (ev.window==NULL || ev.window==pmenu || ev.window==forew || is_pal_win(ev.window)) // main window actions { switch (ev.key) { case JK_CTRL_L : if (!edit_object && !link_object) { link_object=selected_object; } case 'n' : current_level->next_focus(); break; // case '/' : if (dev_console) dev_console->toggle(); break; case 't' : { if (ev.window==NULL || ev.window==forew) { the_game->ftile_on(last_demo_mx,last_demo_my,x,y); fg_fill(cur_fg,x,y,NULL); } } break; case 'f' : toggle_fgw(); break; case 'M' : toggle_music_window(); break; case 'b' : toggle_bgw(); break; case 'a' : toggle_toolbar(); break; case 'A' : { if (selected_object) { if (oedit) eh->push_event(new event(DEV_OEDIT_OK,NULL)); make_ai_window(selected_object); } } break; case 'o' : toggle_omenu(); break; case '<' : do_command("to_back",ev); break; case '>' : do_command("to_front",ev); break; case 'p' : toggle_pmenu(); break; case 'P' : profile_toggle(); break; case '|' : toggle_memprof(); break; case '.' : { if (last_created_type>=0) { int val=last_created_type; char cmd[100]; sprintf(cmd,"create %s",object_names[val]); do_command(cmd,ev); state=DEV_CREATE_OBJECT; dev|=(EDIT_MODE | DRAW_PEOPLE_LAYER); } } break; case 'd' : { do_command("delete",ev); the_game->need_refresh(); } break; case 'i' : { fg_reversed=!fg_reversed; prop->setd("fg_reversed",fg_reversed); if (forew) { toggle_fgw(); toggle_fgw(); } } break; case 'l' : toggle_light_window(); break; case '!' : case '@' : case '#' : case '$' : case '%' : case '^' : case '&' : case '*' : case '(' : case ')' : case '0' : case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : do_command("set_aitype",ev); break; case 'c' : do_command("center",ev); break; case 'C' : if (selected_object && selected_object->controller()==NULL) { copy_object=selected_object; eh->push_event(new event(DEV_OEDIT_COPY,NULL)); } break; case 'D' : the_game->toggle_delay(); break; case 'L' : toggle_show_menu(); break; case '`' : do_command("fg_select",ev); break; case 'r' : { do_command("toggle_fg_raise",ev); the_game->need_refresh(); } break; case '[' : do_command("fg_add -1",ev); break; case ']' : do_command("fg_add 1",ev); break; case 'R' : do_command("reload",ev); break; case 'w' : { long rx,ry; the_game->mouse_to_game(dlastx,dlasty,rx,ry); char msg[100]; sprintf(msg,symbol_str("mouse_at"),rx,ry); the_game->show_help(msg); the_game->need_refresh(); } break; case 'k' : { if (selected_object && selected_object->total_objects()) selected_object->remove_object(selected_object->get_object(0)); the_game->need_refresh(); } break; case 'K' : { if (selected_object && selected_object->total_objects()) selected_object->remove_object(selected_object->get_object(selected_object->total_objects()-1)); the_game->need_refresh(); } break; case 'j' : { if (current_level && player_list && player_list->focus) { long rx,ry; the_game->mouse_to_game(dlastx,dlasty,rx,ry); player_list->focus->x=rx; player_list->focus->y=ry; do_command("center",ev); the_game->need_refresh(); } } break; case 'z' : do_command("clear_weapons",ev); break; case 'Z' : if (dev&EDIT_MODE) { view *v=the_game->view_in(last_demo_mx,last_demo_my); if (v) { v->god=!v->god; sbar.redraw(screen); } } break; case ' ' : { if (dev & EDIT_MODE) { if (selected_object) { if (oedit) close_oedit_window(); edit_object=selected_object; do_command("move",ev); } else if (selected_light) { if (ledit) { eh->close_window(ledit); ledit=NULL; } edit_light=selected_light; do_command("move_light",ev); } } break; } case 'x' : { if (selected_object) { if (selected_object->direction>0) selected_object->direction=-1; else selected_object->direction=1; } } break; } } } void dev_controll::event_close_window(event &ev) { if (ev.window) { if (ev.window==commandw) { prop->setd("commandw x",commandw->x); prop->setd("commandw y",commandw->y); eh->close_window(commandw); commandw=NULL; } else if (ev.window==oedit) close_oedit_window(); else if (ev.window==ambw) { eh->close_window(ambw); ambw=NULL; } else if (ev.window==backw) toggle_bgw(); else if (ev.window==forew) toggle_fgw(); else if (ev.window==lightw) toggle_light_window(); else if (ev.window==show_menu) toggle_show_menu(); else if (ev.window==pmenu) toggle_pmenu(); else if (ev.window==tbw) toggle_toolbar(); else if (ev.window==omenu) toggle_omenu(); else if (ev.window==memprof) toggle_memprof(); else if (ev.window==search_window) toggle_search_window(); else if (profile_handle_event(ev)) profile_on=!profile_on; else if (chat->chat_event(ev)) chat->toggle(); } } void dev_controll::event_oedit_copy(event &ev) { game_object *use=copy_object; if (!use) use=edit_object; if (use) { game_object *old=use; close_oedit_window(); if (use->controller()) the_game->show_help(symbol_str("no_clone")); else { edit_object=old->copy(); current_level->add_object(edit_object); the_game->need_refresh(); state=DEV_MOVE_OBJECT; close_oedit_window(); copy_object=NULL; } } } void dev_controll::event_ledit_ok(event &ev) { edit_light->xshift=atoi(ledit->read(DEV_LEDIT_W)); edit_light->yshift=atoi(ledit->read(DEV_LEDIT_H)); edit_light->inner_radius=atoi(ledit->read(DEV_LEDIT_R1)); edit_light->outer_radius=atoi(ledit->read(DEV_LEDIT_R2)); if (edit_light->outer_radius<=edit_light->inner_radius) { edit_light->inner_radius=edit_light->outer_radius-1; if (edit_light->inner_radius<1) { edit_light->inner_radius=1; edit_light->outer_radius=2; } } edit_light->calc_range(); edit_light=NULL; prop->setd("ledit x",ledit->x); prop->setd("ledit y",ledit->y); eh->close_window(ledit); ledit=NULL; the_game->need_refresh(); } void dev_controll::event_ledit_del(event &ev) { prop->setd("ledit x",ledit->x); prop->setd("ledit y",ledit->y); eh->close_window(ledit); ledit=NULL; if (current_level) current_level->remove_light(edit_light); else delete_light(edit_light); edit_light=NULL; the_game->need_refresh(); } void dev_controll::handle_event(event &ev) { long x,y; if (link_object && (dlastx!=last_link_x || dlasty!=last_link_y)) { last_link_x=dlastx; last_link_y=dlasty; the_game->need_refresh(); } if (dev_menu && dev_menu->handle_event(ev,screen,eh)) return ; if (!current_level) return ; for (x=0;xhandle_event(ev); if (ev.type==EV_MOUSE_MOVE) { dlastx=last_demo_mx; dlasty=last_demo_my; } if (dev_console && dev_console->handle_event(ev,eh)) return; if (ev.type==EV_KEY && ev.key==JK_F2) write_PCX(screen,pal,"scrnshot.pcx"); else if (ev.type==EV_KEY && ev.key==JK_F3) { char name[100]; sprintf(name,"shot%04d.pcx",screen_shot_on++); write_PCX(screen,pal,name); } else if (ev.type==EV_KEY && ev.key==JK_F5) { if (sshot_fcount!=-1) { sshot_fcount=-1; the_game->show_help(symbol_str("seqs_off")); } else { sshot_fcount=0; the_game->show_help(symbol_str("seqs_on")); } } switch (state) { case DEV_MOUSE_RELEASE : { if (!ev.mouse_button) state=DEV_SELECT; } break; case DEV_CREATE_OBJECT : { if (!ev.mouse_button) state=DEV_MOVE_OBJECT; } break; case DEV_MOVE_OBJECT : { event_move_object(ev); } break; case DEV_MOVE_LIGHT : { event_move_light(ev); } break; case DEV_DRAG_AREA_BOTTOM : { event_drag_area_bottom(ev); } break; case DEV_DRAG_AREA_TOP : { event_drag_area_top(ev); } break; case DEV_SELECT : { event_select(ev); } } switch (ev.type) { case EV_MESSAGE : { switch (ev.message.id) { case ID_DMODE_DRAW : case ID_DMODE_PICK : case ID_DMODE_FILL : case ID_DMODE_LINE : case ID_DMODE_RECT : case ID_DMODE_BAR : case ID_DMODE_AREA : { edit_mode=ev.message.id; } break; /* case ID_ENLARGE_RENDER : { if (!small_render) double_render(); else single_render(); view_shift_disabled=!view_shift_disabled; } break; */ case ID_SEARCH : { toggle_search_window(); } break; case ID_SEARCH_FOREWARD : { search_forward(); } break; case ID_SEARCH_BACKWARD : { search_forward(); } break; case ID_CANCEL : { if (mess_win) { eh->close_window(mess_win); mess_win=NULL; } break; } break; case ID_LEVEL_LOAD : { if (!mess_win) { mess_win=file_dialog(eh,symbol_str("level_name"),current_level ? current_level->name() : "", ID_LEVEL_LOAD_OK,symbol_str("ok_button"),ID_CANCEL,symbol_str("cancel_button"), symbol_str("FILENAME"),ID_MESS_STR1); eh->grab_focus(mess_win); } } break; case ID_LEVEL_LOAD_OK : { char cmd[100]; sprintf(cmd,"load %s",mess_win->read(ID_MESS_STR1)); dev_cont->do_command(cmd,ev); eh->push_event(new event(ID_CANCEL,NULL)); // close window } break; case ID_GAME_SAVE : { current_level->save("savegame.spe",1); the_game->show_help(symbol_str("saved_game")); the_game->need_refresh(); } break; case ID_LEVEL_SAVE : { if (current_level) { if (current_level->save(current_level->name(),0)) { char msg[100]; sprintf(msg,symbol_str("saved_level"),current_level->name()); the_game->show_help(msg); the_game->need_refresh(); } } else the_game->show_help("no current level, cannot save"); } break; case ID_LEVEL_SAVEAS : { if (!mess_win) { mess_win=file_dialog(eh,symbol_str("saveas_name"),current_level ? current_level->name() : "untitled.spe", ID_LEVEL_SAVEAS_OK,symbol_str("ok_button"), ID_CANCEL,symbol_str("cancel_button"), symbol_str("FILENAME"),ID_MESS_STR1); eh->grab_focus(mess_win); } } break; case ID_LEVEL_SAVEAS_OK : { if (current_level) { current_level->set_name(mess_win->read(ID_MESS_STR1)); eh->push_event(new event(ID_CANCEL,NULL)); // close window after save eh->push_event(new event(ID_LEVEL_SAVE,NULL)); } } break; case ID_EDIT_SAVE : { do_command("esave",ev); the_game->show_help(symbol_str("edit_saved")); } break; case ID_CACHE_PROFILE : { if (current_level && !cash.prof_is_on()) { cash.prof_init(); the_game->show_help("Cache profiling is now on."); } else the_game->show_help("Cache profiling is already on!"); } break; case ID_CACHE_PROFILE_END : // ask the user for a file name to save as { if (cash.prof_is_on()) { cash.prof_uninit(); the_game->show_help(symbol_str("prof_off")); } else the_game->show_help(symbol_str("prof")); } break; case ID_LEVEL_NEW : { if (!mess_win) { mess_win=eh->new_window(xres/2,yres/2,-1,-1, new button(WINDOW_FRAME_LEFT+10,WINDOW_FRAME_TOP+20,ID_LEVEL_NEW_OK,symbol_str("YES"), new button(WINDOW_FRAME_LEFT+40,WINDOW_FRAME_TOP+20,ID_CANCEL,symbol_str("NO"), new info_field(WINDOW_FRAME_LEFT,WINDOW_FRAME_TOP,ID_NULL,symbol_str("sure?"),NULL))),symbol_str("New?")); eh->grab_focus(mess_win); } } break; case ID_LEVEL_NEW_OK : { eh->push_event(new event(ID_CANCEL,NULL)); // close_window if (current_level) delete current_level; current_level=new level(100,100,"untitled.spe"); } break; case ID_LEVEL_RESIZE : { if (!mess_win) { int wl=WINDOW_FRAME_LEFT,wt=WINDOW_FRAME_TOP,h=eh->font()->height()+8; mess_win=eh->new_window(xres/2,yres/2,-1,-1, new text_field(wl,wt+h*0,ID_MESS_STR1,symbol_str("width_"),"****", current_level ? current_level->foreground_width() : 100, new text_field(wl,wt+h*1,ID_MESS_STR2,symbol_str("height_"),"****", current_level ? current_level->foreground_height() : 100, new button(wl+10,wt+h*4,ID_LEVEL_RESIZE_OK,symbol_str("ok_button"), new button(wt+40,wt+h*4,ID_CANCEL,symbol_str("cancel_button"),NULL)))),symbol_str("_scroll")); } } break; case ID_LEVEL_RESIZE_OK : { if (current_level) { current_level->set_size(atoi(mess_win->read(ID_MESS_STR1)), atoi(mess_win->read(ID_MESS_STR2))); } else the_game->show_help("Create a level first!"); eh->push_event(new event(ID_CANCEL,NULL)); // close_window } break; case ID_SUSPEND : { dev^=SUSPEND_MODE; if (dev&SUSPEND_MODE) the_game->show_help(symbol_str("suspend_on")); else the_game->show_help(symbol_str("suspend_off")); } break; case ID_PLAY_MODE : { dev^=EDIT_MODE; } break; case ID_QUIT : { if (confirm_quit()) do_command("quit",ev); } ; case ID_TOGGLE_MAP : { if (dev&MAP_MODE) dev-=MAP_MODE; else dev|=MAP_MODE; the_game->need_refresh(); } break; case ID_TOGGLE_LIGHT : { dev^=DRAW_LIGHTS; the_game->need_refresh(); } break; case ID_RECORD_DEMO : { if (!mess_win) { int wl=WINDOW_FRAME_LEFT,wt=WINDOW_FRAME_TOP,h=eh->font()->height()+8; mess_win=eh->new_window(xres/2,yres/2,-1,-1, new text_field(wl,wt+h*0,ID_RECORD_DEMO_FILENAME, "demo filename","*******************", "demo.dat", new button(wl+10,wt+h*2,ID_RECORD_DEMO_OK,symbol_str("ok_button"), new button(wt+40,wt+h*2,ID_CANCEL,symbol_str("cancel_button"),NULL)))); } } break; case ID_RECORD_DEMO_OK : { demo_man.set_state(demo_manager::RECORDING,mess_win->read(ID_RECORD_DEMO_FILENAME)); eh->push_event(new event(ID_CANCEL,NULL)); // close window } break; case ID_PLAY_DEMO : { if (!mess_win) { int wl=WINDOW_FRAME_LEFT,wt=WINDOW_FRAME_TOP,h=eh->font()->height()+8; mess_win=eh->new_window(xres/2,yres/2,-1,-1, new text_field(wl,wt+h*0,ID_PLAY_DEMO_FILENAME, "demo filename","*******************", "demo.dat", new button(wl+10,wt+h*2,ID_PLAY_DEMO_OK,symbol_str("ok_button"), new button(wt+40,wt+h*2,ID_CANCEL,symbol_str("cancel_button"),NULL)))); } } break; case ID_PLAY_DEMO_OK : { demo_man.set_state(demo_manager::PLAYING,mess_win->read(ID_PLAY_DEMO_FILENAME)); eh->close_window(mess_win); mess_win=NULL; } break; case ID_SET_SCROLL : { if (!mess_win) { int wl=WINDOW_FRAME_LEFT,wt=WINDOW_FRAME_TOP,h=eh->font()->height()+8; mess_win=eh->new_window(xres/2,yres/2,-1,-1, new text_field(wl,wt+h*0,ID_MESS_STR1,symbol_str("x_mul"),"****",bg_xmul, new text_field(wl,wt+h*1,ID_MESS_STR2,symbol_str("x_div"),"****",bg_xdiv, new text_field(wl,wt+h*2,ID_MESS_STR3,symbol_str("y_mul"),"****",bg_ymul, new text_field(wl,wt+h*3,ID_MESS_STR4,symbol_str("y_div"),"****",bg_ydiv, new button(wl+10,wt+h*4,ID_SET_SCROLL_CHECK,symbol_str("ok_button"), new button(wt+40,wt+h*4,ID_CANCEL,symbol_str("cancel_button"),NULL)))))),symbol_str("_scroll")); } } break; case ID_SET_SCROLL_CHECK : { int tbg_xmul=atoi(mess_win->read(ID_MESS_STR1)); int tbg_xdiv=atoi(mess_win->read(ID_MESS_STR2)); int tbg_ymul=atoi(mess_win->read(ID_MESS_STR3)); int tbg_ydiv=atoi(mess_win->read(ID_MESS_STR4)); if ( (((float)tbg_xmul/(float)tbg_xdiv) < ((float)bg_xmul/(float)bg_xdiv)) || (((float)tbg_ymul/(float)tbg_ydiv) < ((float)bg_ymul/(float)bg_ydiv))) { int wl=WINDOW_FRAME_LEFT,wt=WINDOW_FRAME_TOP,h=eh->font()->height()+8; warn_win=eh->new_window(xres/2-40,yres/2-40,-1,-1, new info_field(wl,wt,ID_NULL, symbol_str("back_loss"), new button(wl+10,wt+h*4,ID_SET_SCROLL_OK,symbol_str("ok_button"), new button(wt+40,wt+h*4,ID_WARN_CANCEL,symbol_str("cancel_button"),NULL))), symbol_str("WARNING")); eh->grab_focus(warn_win); } else eh->push_event(new event(ID_SET_SCROLL_OK,NULL)); } break; case ID_WARN_CANCEL : { eh->close_window(warn_win); warn_win=NULL; eh->push_event(new event(ID_CANCEL,NULL)); } break; case ID_SET_SCROLL_OK : { if (warn_win) { eh->close_window(warn_win); warn_win=NULL; } bg_xmul=atoi(mess_win->read(ID_MESS_STR1)); bg_xdiv=atoi(mess_win->read(ID_MESS_STR2)); bg_ymul=atoi(mess_win->read(ID_MESS_STR3)); bg_ydiv=atoi(mess_win->read(ID_MESS_STR4)); eh->push_event(new event(ID_CANCEL,NULL)); // close window } break; case ID_CENTER_PLAYER : { do_command("center",ev); break; } break; case ID_INTERPOLATE_DRAW : { interpolate_draw=!interpolate_draw; } break; case ID_DISABLE_AUTOLIGHT : { disable_autolight=!disable_autolight; } break; case ID_ADD_PALETTE : { if (!mess_win) { int wl=WINDOW_FRAME_LEFT,wt=WINDOW_FRAME_TOP,h=eh->font()->height()+8; mess_win=eh->new_window(xres/2,yres/2,-1,-1, new text_field(wl,wt+h*0,ID_MESS_STR1,symbol_str("ap_width"),"****",2, new text_field(wl,wt+h*1,ID_MESS_STR2,symbol_str("ap_height"),"****",2, new text_field(wl,wt+h*2,ID_MESS_STR3,symbol_str("ap_name"),"***********","pal", new button(wl+10,wt+h*3,ID_ADD_PALETTE_OK,symbol_str("ok_button"), new button(wt+40,wt+h*3,ID_CANCEL,symbol_str("cancel_button"),NULL))))),symbol_str("ap_pal")); } } break; case ID_ADD_PALETTE_OK : { char name[70]; sprintf(name,"(add_palette \"%s\" %d %d)",mess_win->read(ID_MESS_STR3), atoi(mess_win->read(ID_MESS_STR1)), atoi(mess_win->read(ID_MESS_STR2))); char *s=name; eval(compile(s)); eh->push_event(new event(ID_CANCEL,NULL)); // close window } break; case ID_TOGGLE_DELAY : { the_game->toggle_delay(); break; } break; case ID_SMALL_MODE : { make_screen_size(311,160); break; } break; case ID_CLEAR_WEAPONS : { event ev; do_command("clear_weapons",ev); } break; case ID_GOD_MODE : { for (view *v=player_list;v;v=v->next) v->god=!v->god; } break; case ID_MOUSE_SCROLL : { mouse_scrolling=!mouse_scrolling; prop->setd("mouse_scrolling",mouse_scrolling); if (mouse_scrolling) the_game->show_help(symbol_str("ms_on")); else the_game->show_help(symbol_str("ms_off")); } break; case ID_LOCK_PALETTES : { palettes_locked=!palettes_locked; prop->setd("palettes_locked",palettes_locked); if (palettes_locked) the_game->show_help(symbol_str("pal_lock")); else the_game->show_help(symbol_str("pal_unlock")); } break; case ID_DISABLE_VIEW_SHIFT : { view_shift_disabled=!view_shift_disabled; prop->setd("view_shift_disabled",view_shift_disabled); if (view_shift_disabled) the_game->show_help(symbol_str("vs_dis")); else the_game->show_help(symbol_str("vs_en")); } break; case ID_WIN_FORE : { toggle_fgw(); } break; case ID_WIN_BACK : { toggle_bgw(); } break; case ID_WIN_OBJECTS : { toggle_omenu(); } break; case ID_WIN_PALETTES : { toggle_pmenu(); } break; case ID_WIN_LIGHTING : { toggle_light_window(); } break; case ID_WIN_LAYERS : { toggle_show_menu(); } break; case ID_WIN_CONSOLE : { if (dev_console) dev_console->toggle(); } break; case ID_WIN_TOOLBAR : { toggle_toolbar(); } break; case DEV_AMBIENT : { if (!ambw) make_ambient(); } break; case DEV_AREA_OK : { close_area_win(1); } break; case DEV_AREA_DELETE : { close_area_win(0); if (current_area && current_level) { if (current_level->area_list==current_area) current_level->area_list=current_level->area_list->next; else { area_controller *a=current_level->area_list,*l=NULL; for (;a!=current_area && a;a=a->next) { l=a; } l->next=a->next; delete a; } current_area=NULL; the_game->need_refresh(); } } break; case DEV_AI_OK : close_ai_window(); break; case DEV_OEDIT_AI : make_ai_window(edit_object); break; case DEV_OBJECTS_DELETE : { if (edit_object) { for (int i=0;itotal_objects();i++) edit_object->remove_object(edit_object->get_object(0)); the_game->need_refresh(); } } break; case DEV_LIGHTS_DELETE : { if (edit_object) { for (int i=0;itotal_lights();i++) edit_object->remove_light(edit_object->get_light(0)); the_game->need_refresh(); } } break; case DEV_LEDIT_DEL : { event_ledit_del(ev); } break; case DEV_LEDIT_OK : { event_ledit_ok(ev); } break; case DEV_LEDIT_MOVE : { prop->setd("ledit x",ledit->x); prop->setd("ledit y",ledit->y); eh->close_window(ledit); ledit=NULL; state=DEV_MOVE_LIGHT; } break; case DEV_LEDIT_COPY : { edit_light=edit_light->copy(); prop->setd("ledit x",ledit->x); prop->setd("ledit y",ledit->y); eh->close_window(ledit); ledit=NULL; state=DEV_MOVE_LIGHT; } break; case DEV_LIGHT0 : case DEV_LIGHT1 : case DEV_LIGHT2 : case DEV_LIGHT3 : case DEV_LIGHT4 : case DEV_LIGHT5 : case DEV_LIGHT6 : case DEV_LIGHT7 : case DEV_LIGHT8 : case DEV_LIGHT9 : { long lx,ly; the_game->mouse_to_game(last_demo_mx,last_demo_my,lx,ly); lx=snap_x(lx); ly=snap_y(ly); edit_light=add_light_source(ev.message.id-DEV_LIGHT0,lx,ly, atoi(lightw->read(DEV_LIGHTR1)), atoi(lightw->read(DEV_LIGHTR2)), atoi(lightw->read(DEV_LIGHTW)), atoi(lightw->read(DEV_LIGHTH))); state=DEV_MOVE_LIGHT; } break; case ID_RAISE_ALL : { raise_all=!raise_all; prop->setd("raise_all",raise_all); if (raise_all) the_game->show_help(symbol_str("fg_r")); else the_game->show_help(symbol_str("fg_l")); } break; case DEV_OEDIT_COPY : { event_oedit_copy(ev); } break; case DEV_OEDIT_LEFT : { if (edit_object) { the_game->need_refresh(); edit_object->direction=-1; } } break; case DEV_OEDIT_RIGHT : { if (edit_object) { the_game->need_refresh(); edit_object->direction=1; } } break; case DEV_COMMAND_OK : { char cmd[100]; strcpy(cmd,commandw->inm->get(DEV_COMMAND)->read()); prop->setd("commandw x",commandw->x); prop->setd("commandw y",commandw->y); eh->close_window(commandw); commandw=NULL; do_command(cmd,ev); } break; case ID_SHOW_FPS : { fps_on=!fps_on; } break; case ID_PROFILE : { profile_toggle(); profile_on=!profile_on; } break; case ID_TOGGLE_NAMES : { show_names=!show_names; } break; case DEV_QUIT : the_game->end_session(); break; case DEV_EDIT_FG : dev=1; break; //the_game->draw(); break; case DEV_EDIT_BG : dev=2; break; //the_game->draw(); break; case DEV_EDIT_FGBG : dev=3; break; //the_game->draw(); break; case DEV_PLAY : dev=0; break; //the_game->draw(); break; case SHOW_FOREGROUND : { dev=dev^DRAW_FG_LAYER; the_game->need_refresh(); } break; case SHOW_FOREGROUND_BOUND : { dev=dev^DRAW_FG_BOUND_LAYER; the_game->need_refresh(); } break; case SHOW_BACKGROUND : { dev=dev^DRAW_BG_LAYER; the_game->need_refresh(); } break; case SHOW_CHARACTERS : { dev=dev^DRAW_PEOPLE_LAYER; the_game->need_refresh(); } break; case SHOW_LIGHT : { dev=dev^DRAW_LIGHTS; the_game->need_refresh(); } break; case SHOW_LINKS : { dev=dev^DRAW_LINKS; the_game->need_refresh(); } break; case DEV_CREATE : { int val=get_omenu_item(((pick_list *)ev.message.data)->get_selection()); char cmd[100]; sprintf(cmd,"create %s",object_names[val]); do_command(cmd,ev); state=DEV_CREATE_OBJECT; dev|=(EDIT_MODE | DRAW_PEOPLE_LAYER); } break; case DEV_PALETTE : { int val=((pick_list *)ev.message.data)->get_selection(); pal_wins[val]->open_window(); } break; case DEV_MUSIC_PICKLIST : { /* int *val=((int *)((pick_list *)ev.message.data)->read()); if (current_song) delete current_song; current_song=new song(song_list[*val]); current_song->play(); */ } break; case DEV_OEDIT_OK : { close_oedit_window(); } break; case DEV_OEDIT_DELETE : { selected_object=edit_object; do_command("delete",ev); close_oedit_window(); } break; case DEV_OEDIT_FRONT : { do_command("to_front",ev); close_oedit_window(); } break; case DEV_OEDIT_BACK : { do_command("to_back",ev); close_oedit_window(); } break; case DEV_OEDIT_MOVE : { game_object *o=edit_object; close_oedit_window(); edit_object=o; do_command("move",ev); } break; } } break; case EV_CLOSE_WINDOW : { event_close_window(ev); } break; case EV_KEYRELEASE : { if (ev.key==JK_CTRL_L) { if (!edit_object && link_object && selected_object && link_object!=selected_object) { link_object->add_object(selected_object); if (S_LINK_SND>0) cash.sfx(S_LINK_SND)->play(sfx_volume/2); the_game->need_refresh(); } link_object=NULL; } } break; case EV_KEY : { event_key(ev); } } } void dev_controll::add_palette(void *args) { total_pals++; pal_wins=(pal_win **)jrealloc(pal_wins,sizeof(pal_win *)*total_pals,"edit pal array"); pal_wins[total_pals-1]=new pal_win(args); } pal_win::pal_win(void *args) { int i=0; Cell *ao=(Cell *)args; name=strcpy((char *)jmalloc(strlen(lstring_value(CAR(args)))+1, "pal name"),lstring_value(CAR(args))); ao=CDR(ao); scale=w=h=1; x=y=0; if (!NILP(ao)) { w=lnumber_value(CAR(ao)); ao=CDR(ao); if (!NILP(ao)) { h=lnumber_value(CAR(ao)); ao=CDR(ao); if (!NILP(ao)) { x=lnumber_value(CAR(ao)); ao=CDR(ao); if (!NILP(ao)) { y=lnumber_value(CAR(ao)); ao=CDR(ao); if (!NILP(ao)) scale=lnumber_value(CAR(ao)); ao=CDR(ao); } } } } if (w<=0) w=0; if (h<=0) h=0; pat=(unsigned short *)jmalloc(w*h*sizeof(unsigned short),"palwin::pat"); memset(pat,0,sizeof(unsigned short)*w*h); // set the palette to black if no parameters are given while (!NILP(ao)) // loop until we run out of parameters { if (i>w*h) { lbreak("to many parameters to add_palette "); exit(0); } pat[i]=lnumber_value(CAR(ao)); // make sure the tile that they suggested exists if (pat[i]<=0 || pat[i]>nforetiles || foretiles[pat[i]]<0) pat[i]=0; ao=CDR(ao); i++; } last_selected=-1; me=NULL; open_window(); } void pal_win::open_window() { if (me) close_window(); me=eh->new_window(x,y,w*f_wid/scale,h*f_hi/scale,NULL,name); draw(); } void pal_win::close_window() { if (me) // dont' close the window if the window is already closed { x=me->x; // save the old poisition of the window so that when we open it // it will be in the same spot y=me->y; eh->close_window(me); me=NULL; } } #ifdef __MAC__ #pragma global_optimizer on #endif void pal_win::draw() { int i,find=-1,d=cur_fg; if (me) { me->clear(); image *im=new image(the_game->ftile_width(),the_game->ftile_height()); int th=the_game->ftile_height()/scale,tw=the_game->ftile_width()/scale; for (i=0;iclear(); the_game->get_fg(pat[i])->im->put_image(im,0,0); scale_put(im,me->screen,me->x1()+(i%w)*tw, me->y1()+(i/w)*th,tw,th); if (d==pat[i]) { find=i; me->screen->rectangle(me->x1()+(i%w)*tw, me->y1()+(i/w)*th, me->x1()+(i%w)*tw+tw-1, me->y1()+(i/w)*th+th-1,eh->bright_color()); } } delete im; last_selected=d; } } #ifdef __MAC__ #pragma global_optimizer reset #endif void pal_win::handle_event(event &ev) { int d=cur_fg; if (d!=last_selected) // if so see if we need to hilight any of our tiles. { int i,dr=0; for (i=0;ix-me->x1())/(the_game->ftile_width()/scale), sely=(last_demo_my-me->y-me->y1())/(the_game->ftile_height()/scale); if (selx>=0 && sely>=0 && selxforew) ((tile_picker *)dev_cont->forew-> read(DEV_FG_PICKER))->recenter(dev_cont->forew->screen,eh); } } else if (ev.mouse_button==2) { if (palettes_locked) the_game->show_help(symbol_str("pal_lock")); else { int selx=(last_demo_mx-me->x-me->x1())/(the_game->ftile_width()/scale), sely=(last_demo_my-me->y-me->y1())/(the_game->ftile_height()/scale); if (selx>=0 && sely>=0 && selx1) { close_window(); scale--; open_window(); } } break; case '-' : { if (scaleftile_height()/2) { close_window(); scale++; open_window(); } } break; case JK_LEFT : { if (palettes_locked) the_game->show_help(symbol_str("pal_lock")); else if (w>1) resize(-1,0); } break; case JK_RIGHT : { if (palettes_locked) the_game->show_help(symbol_str("pal_lock")); else resize(1,0); } break; case JK_UP : { if (palettes_locked) the_game->show_help(symbol_str("pal_lock")); else if (h>1) resize(0,-1); } break; case JK_DOWN : { if (palettes_locked) the_game->show_help(symbol_str("pal_lock")); else resize(0,1); } break; case JK_ESC : close_window(); break; case ' ' : { long xs,ys,xx,yy; the_game->ftile_on(me->x,me->y,xs,ys); for (xx=xs;xx=0 && yy>=0 && xxforeground_width() && yyforeground_height()) the_game->put_fg(xx,yy,raise_all ? make_above_tile(pat[xx-xs+(yy-ys)*w]) : pat[xx-xs+(yy-ys)*w] ); } } } break; case 't' : { long xs,ys,xx,yy; the_game->ftile_on(me->x,me->y,xs,ys); dev_cont->fg_fill(-1,xs,ys,this); } break; } } break; case EV_CLOSE_WINDOW : close_window(); break; } } } void pal_win::resize(int xa, int ya) { int i,j; unsigned short *npat; if (w+xa<1 || y+ya<1) return ; npat=(unsigned short *)jmalloc(sizeof(unsigned short)*(w+xa)*(h+ya),"resized pal_win"); memset(npat,0,sizeof(unsigned short)*(w+xa)*(h+ya)); for (i=0;i<(w+xa);i++) for (j=0;j<(h+ya);j++) if (i+j*wx; y=me->y; } fprintf(fp,"(add_palette \"%s\" %d %d %d %d %d ",name,w,h,x,y,scale); int i; for (i=0;ishow_help(symbol_str("no_edit.lsp")); else { fprintf(fp,"(set_zoom %d)\n",the_game->zoom); int i; for (i=0;isave(fp); } fprintf(fp,"\n"); fclose(fp); } } int dev_controll::is_pal_win(jwindow *win) { int i; for (i=0;ime) return 1; return 0; } class fill_rec { public : short x,y; fill_rec *last; fill_rec(short X, short Y, fill_rec *Last) { x=X; y=Y; last=Last; } } ; static int get_color(int color, int x, int y, pal_win *p) { if (p) { while (x<0) x+=p->width(); while (y<0) y+=p->height(); return p->get_pat(x%p->width(),y%p->height()); } else return color; } void dev_controll::fg_fill(int color, int x, int y, pal_win *p) { unsigned short *sl,*above,*below; fill_rec *recs=NULL,*r; unsigned short fcolor; sl=current_level->get_fgline(y); fcolor=fgvalue(sl[x]); int startx=x,starty=y; if (fcolor==color) return ; do { if (recs) { r=recs; recs=recs->last; x=r->x; y=r->y; delete r; } sl=current_level->get_fgline(y); if (fgvalue(sl[x])==fcolor) { while (x>0 && fgvalue(sl[x])==fcolor) x--; if (fgvalue(sl[x])!=fgvalue(fcolor) && xforeground_width()-1) x++; if (y>0) { above=current_level->get_fgline(y-1); if (fgvalue(above[x])==fcolor) { r=new fill_rec(x,y-1,recs); recs=r; } } if (yforeground_height()-1) { above=current_level->get_fgline(y+1); if (above[x]==fcolor) { r=new fill_rec(x,y+1,recs); recs=r; } } do { sl[x]=get_color(color,x-startx,y-starty,p); if (y>0) { above=current_level->get_fgline(y-1); if (x>0 && fgvalue(above[x-1])!=fgvalue(fcolor) && fgvalue(above[x])==fgvalue(fcolor)) { r=new fill_rec(x,y-1,recs); recs=r; } } if (yforeground_height()-1) { below=current_level->get_fgline(y+1); if (x>0 && fgvalue(below[x-1])!=fgvalue(fcolor) && fgvalue(below[x])==fgvalue(fcolor)) { r=new fill_rec(x,y+1,recs); recs=r; } } x++; } while (fgvalue(sl[x])==fgvalue(fcolor) && xforeground_width()); x--; if (y>0) { above=current_level->get_fgline(y-1); if (fgvalue(above[x])==fgvalue(fcolor)) { r=new fill_rec(x,y-1,recs); recs=r; } } if (yforeground_height()-1) { above=current_level->get_fgline(y+1); if (fgvalue(above[x])==fgvalue(fcolor)) { r=new fill_rec(x,y+1,recs); recs=r; } } } } while (recs); the_game->need_refresh(); } int get_char_mem(int type, int print) { int t=0; for (int j=0;jhas_sequence((character_state)j)) { int s=figures[type]->get_sequence((character_state)j)->size(); if (print) dprintf("(%s=%d)",state_names[j],s); t+=s; } } if (print) dprintf("\ntotal=%d\n",t); return t; } void dev_controll::show_char_mem(char *name) { int find=-1; for (int i=0;i=0) { if (cash.loaded(foretiles[i])) { t++; s+=cash.foret(foretiles[i])->size(); } } } dprintf("%d loaded foretiles=%d bytes\n",t,s); t=0; s=0; for (i=0;i=0) { if (cash.loaded(foretiles[i])) { t++; s+=cash.backt(backtiles[i])->size(); } } } dprintf("%d loaded backtiles=%d bytes\n",t,s); t=0; s=0; for (i=0;isave("defaults.prp"); delete prop; if (listable_objs) { jfree(listable_objs); listable_objs=NULL; } crc_man.clean_up(); } struct pmi { char *name; int id; char *on_off; int key; } ; static pmi fm[]={ {"menu1_load", ID_LEVEL_LOAD,NULL,-1}, {NULL,0,NULL,-1}, {"menu1_save", ID_LEVEL_SAVE,NULL,-1}, {"menu1_saveas", ID_LEVEL_SAVEAS,NULL,-1}, {"menu1_savegame", ID_GAME_SAVE,NULL,-1}, {"menu1_new", ID_LEVEL_NEW,NULL,-1}, {"menu1_resize", ID_LEVEL_RESIZE,NULL,-1}, {NULL,0,NULL,-1}, {"menu1_suspend",ID_SUSPEND,NULL,-1}, {"menu1_toggle",ID_PLAY_MODE,NULL,-1}, {NULL,0,NULL,-1}, {"menu1_savepal",ID_EDIT_SAVE,NULL,-1}, // {"menu1_startc",ID_CACHE_PROFILE,NULL,-1}, // {"menu1_endc",ID_CACHE_PROFILE_END,NULL,-1}, {NULL,0,NULL,-1}, {"menu1_quit", ID_QUIT,NULL,-1}, {NULL,-1,NULL,-1} }; static pmi em[]={ {"menu2_light", ID_TOGGLE_LIGHT,NULL,-1}, {"menu2_scroll", ID_SET_SCROLL,NULL,-1}, {"menu2_center", ID_CENTER_PLAYER,NULL,-1}, {"menu2_addpal", ID_ADD_PALETTE,NULL,-1}, {"menu2_delay", ID_TOGGLE_DELAY,NULL,-1}, {"menu2_god", ID_GOD_MODE,NULL,-1}, {"menu2_clear", ID_CLEAR_WEAPONS,NULL,-1}, {"menu2_mscroll", ID_MOUSE_SCROLL,&mouse_scrolling,-1}, {"menu2_lock", ID_LOCK_PALETTES,&palettes_locked,-1}, {"menu2_raise", ID_RAISE_ALL,&raise_all,-1}, {"menu2_names", ID_TOGGLE_NAMES,&show_names,-1}, {NULL,0,NULL,-1}, {"menu2_map", ID_TOGGLE_MAP,NULL,-1}, // {"Shrink to 320x200 (F10)", ID_SMALL_MODE,NULL,-1}, {"menu2_view", ID_DISABLE_VIEW_SHIFT,&view_shift_disabled,-1}, // {"Ultra Smooth draw (U)", ID_INTERPOLATE_DRAW, &interpolate_draw,'U'}, {"menu2_alight", ID_DISABLE_AUTOLIGHT, &disable_autolight,'A'}, {"menu2_fps", ID_SHOW_FPS, &fps_on,-1}, // {NULL,0,NULL,-1}, // {"Record demo", ID_RECORD_DEMO,NULL,-1}, // {"Play demo", ID_PLAY_DEMO,NULL,-1}, {NULL,-1,NULL,-1} }; // Window Menus static pmi wm[]={ {"menu3_fore", ID_WIN_FORE, &forew_on,-1}, {"menu3_back", ID_WIN_BACK, &backw_on,-1}, {"menu3_layers", ID_WIN_LAYERS, &show_menu_on,-1}, {"menu3_light", ID_WIN_LIGHTING,&ledit_on,-1}, {"menu3_pal", ID_WIN_PALETTES,&pmenu_on,-1}, {"menu3_objs", ID_WIN_OBJECTS, &omenu_on,-1}, // {"menu3_console", ID_WIN_CONSOLE, &commandw_on,-1}, {"menu3_toolbar", ID_WIN_TOOLBAR, &tbw_on,-1}, // {"Search (s)", ID_SEARCH, &searchw_on,-1}, {"menu3_prof", ID_PROFILE, &profile_on,-1}, {"menu3_save", ID_SAVE_WINDOWS,NULL,-1}, {NULL,-1,NULL,-1} }; /* static pmi fm[]={ {"Load Level", ID_LEVEL_LOAD,NULL,-1}, {NULL,0,NULL,-1}, {"Save Level (S)", ID_LEVEL_SAVE,NULL,-1}, {"Save level as", ID_LEVEL_SAVEAS,NULL,-1}, {"Save game", ID_GAME_SAVE,NULL,-1}, {"New level", ID_LEVEL_NEW,NULL,-1}, {"Resize map", ID_LEVEL_RESIZE,NULL,-1}, {NULL,0,NULL,-1}, {"Suspend non-players",ID_SUSPEND,NULL,-1}, {"Play mode toggle (TAB)",ID_PLAY_MODE,NULL,-1}, {NULL,0,NULL,-1}, {"Save Palettes ",ID_EDIT_SAVE,NULL,-1}, {"Start cache profile ",ID_CACHE_PROFILE,NULL,-1}, {"End cache profile ",ID_CACHE_PROFILE_END,NULL,-1}, {NULL,0,NULL,-1}, {"Quit (Q)", ID_QUIT,NULL,-1}, {NULL,-1,NULL,-1} }; static pmi em[]={ {"Toggle light", ID_TOGGLE_LIGHT,NULL,-1}, {"Set scroll rate", ID_SET_SCROLL,NULL,-1}, {"Center on player (c)", ID_CENTER_PLAYER,NULL,-1}, {"Add palette", ID_ADD_PALETTE,NULL,-1}, {"Toggle Delays (D)", ID_TOGGLE_DELAY,NULL,-1}, {"God mode", ID_GOD_MODE,NULL,-1}, {"Clear weapons (z)", ID_CLEAR_WEAPONS,NULL,-1}, {"Mouse scroll", ID_MOUSE_SCROLL,&mouse_scrolling,-1}, {"Lock palette windows", ID_LOCK_PALETTES,&palettes_locked,-1}, {"Raise all foreground", ID_RAISE_ALL,&raise_all,-1}, {"Toggle object names", ID_TOGGLE_NAMES,&show_names,-1}, {NULL,0,NULL,-1}, {"Toggle map (m)", ID_TOGGLE_MAP,NULL,-1}, // {"Shrink to 320x200 (F10)", ID_SMALL_MODE,NULL,-1}, {"Disable view shifts", ID_DISABLE_VIEW_SHIFT,&view_shift_disabled,-1}, // {"Ultra Smooth draw (U)", ID_INTERPOLATE_DRAW, &interpolate_draw,'U'}, {"Disable Autolight (A)", ID_DISABLE_AUTOLIGHT, &disable_autolight,'A'}, {"Show FPS/Obj count", ID_SHOW_FPS, &fps_on,-1}, // {NULL,0,NULL,-1}, // {"Record demo", ID_RECORD_DEMO,NULL,-1}, // {"Play demo", ID_PLAY_DEMO,NULL,-1}, {NULL,-1,NULL,-1} }; // Window Menus static pmi wm[]={ {"Foreground (f)", ID_WIN_FORE, &forew_on,-1}, {"Background (b)", ID_WIN_BACK, &backw_on,-1}, {"Draw layers (L)", ID_WIN_LAYERS, &show_menu_on,-1}, {"Lighting (l)", ID_WIN_LIGHTING,&ledit_on,-1}, {"Palettes (p)", ID_WIN_PALETTES,&pmenu_on,-1}, {"Objects (o)", ID_WIN_OBJECTS, &omenu_on,-1}, {"Console (/)", ID_WIN_CONSOLE, &commandw_on,-1}, {"Tool Bar (a)", ID_WIN_TOOLBAR, &tbw_on,-1}, // {"Search (s)", ID_SEARCH, &searchw_on,-1}, {"Profile (P)", ID_PROFILE, &profile_on,-1}, {"Save positions", ID_SAVE_WINDOWS,NULL,-1}, {NULL,-1,NULL,-1} }; */ static pmenu_item *i_recurse(pmi *first) { if (first->id==-1) return NULL; else return new pmenu_item(first->id,first->name ? symbol_str(first->name) : 0,first->on_off,first->key,i_recurse(first+1)); } static pmenu *make_menu(int x, int y) { return new pmenu(x,y, new pmenu_item(symbol_str("file_top"),new psub_menu(i_recurse(fm),NULL), new pmenu_item(symbol_str("edit_top"),new psub_menu(i_recurse(em),NULL), new pmenu_item(symbol_str("window_top"),new psub_menu(i_recurse(wm),NULL),NULL))),screen,eh); } void make_edit_mode_menu() { if (!dev_menu && (dev&EDIT_MODE)) dev_menu=make_menu(0,yres-eh->font()->height()-5); } void kill_edit_mode_menu() { if (dev_menu) delete dev_menu; dev_menu = 0; } void toggle_edit_mode() { dev=dev^EDIT_MODE; if (dev&EDIT_MODE) { eh->set_mouse_shape(cash.img(c_normal)->copy(),1,1); pal->load(); make_edit_mode_menu(); } else { if (dev&MAP_MODE) dev-=MAP_MODE; // no map mode while playing! eh->set_mouse_shape(cash.img(c_target)->copy(),8,8); kill_edit_mode_menu(); } } int dev_controll::ok_to_scroll() { if (state==DEV_MOVE_LIGHT || state==DEV_MOVE_OBJECT || mouse_scrolling) return 1; else return 0; } dev_controll::~dev_controll() { for (int i=0;i