void AppBody() { bool done = false; bool redraw = false; TileMap map("data/maps/test1.tmx"); Sprite sprt("data/sprites/demo.adf"); sprt.SendNewState(AnimState::IDLE, AnimDir::DOWN); ALLEGRO_TRANSFORM camera; int x_offset = 0, y_offset = 0; int x_delta, y_delta; int key_state[2] = {0, 0}; x_delta = applicationConfig.iDispW - al_get_bitmap_width(map.GetFullMap()); y_delta = applicationConfig.iDispH - al_get_bitmap_height(map.GetFullMap()); Vec2D playerPos {0, 0}; Vec2D playerVel {0, 0}; al_start_timer(timer); while (!done) { ALLEGRO_EVENT ev; al_wait_for_event(queue, &ev); switch (ev.type) { case ALLEGRO_EVENT_TIMER: al_identity_transform(&camera); x_offset += key_state[0]; y_offset += key_state[1]; if (x_delta > 0) { x_offset = x_delta / 2; } else { if (x_offset < x_delta) x_offset = x_delta; if (x_offset > 0) x_offset = 0; } if (y_delta > 0) { y_offset = y_delta / 2; } else { if (y_offset < y_delta) y_offset = y_delta; if (y_offset > 0) y_offset = 0; } if (map.CanWalktoTileAt(playerPos, sprt.GetSize(), {0.0f, 32.0f}) == true) { playerPos = playerPos + playerVel; } else { Vec2D backtracing = playerVel; playerVel = {0, 0}; // we delete player velocitity to stop oscillating in place during collision. if (backtracing == playerVel) // If for whatever reason we are stuck and cannot determine orig vector... MAGIC! { backtracing.x = 2.0f; backtracing.y = 2.0f; float angle = rand() % 359 + 1; backtracing.rotate(angle * (ALLEGRO_PI / 180)); std::cerr << "Warning: Unknown velocity vector. Will use [" << backtracing.x << "," << backtracing.y << "] as direction to solve collision." << std::endl; } while (map.CanWalktoTileAt(playerPos, sprt.GetSize(), {0.0f, 32.0f}) == false) { playerPos = playerPos - backtracing; } } sprt.Update(); redraw = true; break; case ALLEGRO_EVENT_DISPLAY_CLOSE: done = true; break; case ALLEGRO_EVENT_KEY_DOWN: if (ev.keyboard.keycode == ALLEGRO_KEY_ESCAPE) { done = true; } switch (ev.keyboard.keycode) { case ALLEGRO_KEY_LEFT: key_state[0] = 4; break; case ALLEGRO_KEY_RIGHT: key_state[0] = -4; break; case ALLEGRO_KEY_UP: key_state[1] = 4; break; case ALLEGRO_KEY_DOWN: key_state[1] = -4; break; case ALLEGRO_KEY_A: playerVel.x = -2; sprt.SendNewState(AnimState::MOVE, AnimDir::LEFT); break; case ALLEGRO_KEY_D: playerVel.x = 2; sprt.SendNewState(AnimState::MOVE, AnimDir::RIGHT); break; case ALLEGRO_KEY_W: playerVel.y = -2; sprt.SendNewState(AnimState::MOVE, AnimDir::UP); break; case ALLEGRO_KEY_S: playerVel.y = 2; sprt.SendNewState(AnimState::MOVE, AnimDir::DOWN); break; } break; case ALLEGRO_EVENT_KEY_UP: switch (ev.keyboard.keycode) { case ALLEGRO_KEY_LEFT: case ALLEGRO_KEY_RIGHT: key_state[0] = 0; break; case ALLEGRO_KEY_UP: case ALLEGRO_KEY_DOWN: key_state[1] = 0; break; case ALLEGRO_KEY_A: playerVel.x = 0; sprt.SendNewState(AnimState::IDLE, AnimDir::LEFT); break; case ALLEGRO_KEY_D: playerVel.x = 0; sprt.SendNewState(AnimState::IDLE, AnimDir::RIGHT); break; case ALLEGRO_KEY_W: playerVel.y = 0; sprt.SendNewState(AnimState::IDLE, AnimDir::UP); break; case ALLEGRO_KEY_S: playerVel.y = 0; sprt.SendNewState(AnimState::IDLE, AnimDir::DOWN); break; } break; default: break; } if (redraw && al_is_event_queue_empty(queue)) { al_translate_transform(&camera, x_offset, y_offset); al_use_transform(&camera); redraw = false; al_clear_to_color(styleConfig.colBackgroundColor); map.DrawLayerMap("Background"); map.DrawLayerMap("Foreground"); /* Playable characters should draw on this position */ sprt.Render(playerPos.x, playerPos.y); map.DrawLayerMap("Top"); al_flip_display(); } } }
SHELL uint editor() { char buf[80+1]; uint retcode; /* dbmsgout("ed_start"); */ ed.c='\0'; ed.fpe=op_temp("w+"); if (ed.fpe ==NULL) error(""); disp_text("editline"); retcode=TRUE; if (iscall()) { ch.frug.monitor=0; hcputs("--- 唯今 書き込み中 ---\r\n"); } for(;;) { /* dbprt("ed_main:",lpu(ftell(ed.fpe),0),"\n",NULL); */ /*dbmsgout("ed_main");*/ ed.c=getestr(buf); /* dbprintf("Editor:[%s]\n",buf);*/ if (iscntrl(ed.c)) ed.c='\0'; if (strchr(buf,'<')!=NULL) { sprt(where.param,"<verb>",buf,NULL); ed_write(); continue; } switch(*buf) { case '.': if (buf[1]=='\0' ||buf[1]=='.') { fclose(ed.fpe); goto ret; } continue; case '/': if (strlen(buf)<4) { switch(buf[1]) { case 'b': /* アーティクルにバイナリを付属する。*/ msgout(art.file!=ERROR?IC_err "一つのアーティクルに複数のファイルを付加できません。": pool_upload()? IC_ok "バイナリファイルをアップロードしました。" : IC_stop"バイナリの添付を中止しました。"); continue; case 'u': if (file_upload(ed.fpe)) msgout(IC_ok "テキストアップロードしました。"); fflush(ed.fpe); continue; case '/': fclose(ed.fpe); goto ret; case 'a': case 'q': /*dbmsgout("ed_abort");*/ fclose(ed.fpe); retcode=FALSE; goto ret; case 't': msgout("最初から読みだします。"); rewind(ed.fpe); while(fgets(buf,sizeof(buf),ed.fpe)) putz(buf); clearerr(ed.fpe); continue; case '?': disp_text("ed.hlp"); continue; } } case '\\': case '^': case '*': sprt(where.param,"<verb>",buf,NULL); ed_write(); continue; } strcpy(where.param,buf); ed_write(); } ret: if (iscall()) ch.frug.monitor=1; return retcode; }
void name_localdir(char *dir) { sprt(dir,sys.home,"\\local\\",NULL); }
SHELL void chat() { char buf[LN_buf+1],temp[LN_buf+1]; char chat_id[LN_id+1]; time_t t; /* if (!iscall()) { msgout("自分とチャットは出来ません。"); return; }*/ msgout("チャットをします。要件は何でしょうか?"); getstr(buf); if (*buf=='\0') { msgout("中止しました。"); return; } sprt(temp,"| chat call (",buf,")",NULL); sys_log(temp); msgout("ではシスオペを呼び出します。"); timer_res(t); /* rsbufs(FLWSIG_ON2);*/ for(;;) { hcputc(_BEEP); if (kbhit()) { getch(); break; } if (rsgetc()!=ERROR) { msgout("やめました。"); /* rsbufs(FLWSIG_OFF);*/ return; } if (timer_pas(t)>30) { msgout("いないみたいですね・・・・。"); return; } } /* dbmsgout("chat_start"); */ strcpy(chat_id,"SYSOP"); ed.c='\0'; disp_text("chat"); srand(getdatime()&0xffff); for(;;) { /*dbmsgout("chat_main");*/ prt("[",nps(chat_id,8),"]",NULL); ed.c=getestr(buf); if (iscntrl(ed.c)) ed.c='\0'; switch(*buf) { case '\0': strcpy(chat_id,chat_chid(chat_id)); continue; case '.': if (buf[1]=='\0' ||buf[1]=='.') return ; continue; case '!': /* バトルチャットシステム(笑)。 */ prt("げしっ!! ",chat_chid(chat_id),"は",lpu(rand()%256+1,0) ,"のダメージを受けた\n",NULL); continue; case '/': switch(buf[1]) { case '/': return ; case '?': disp_text("chat.hlp"); continue; } default: continue; } } }
void name_pooldir(char *dir) { sprt(dir,sys.home,"\\pool\\",NULL); }