bool Shot_gun::Action(Game_Manager* gm_) { if(valid) { int coll_ = pre_collution(3); if(gm_) { for(list<Unit*>::iterator it = gm_->unit_list.begin();it != gm_->unit_list.end();it++) { if((*it)->isLive() && !(*it)->isNonTarget() && (*it)->GetTeam() != GetTeam()) { if(unit_collution((*it)->GetPos(), (*it)->GetSize()+((*it)->isPlayer()?0.0f:3.0f) )) { if (gm_->isPlayerCanHear(GetPos())) { PlaySE(se_bullet_flesh); } (*it)->SetKnockback(power, max_power, angle); if(slow_turn) (*it)->SlowApply(slow_ratio,slow_turn, SK_GUN); int final_damge_ = (*it)->SetDamage(gm_, GetFirstPos(), DT_BULLET, damage, GetTeam(), sniper, unit?unit->GetCritical():0); if(unit) unit->GiveDamage(gm_, (*it), DT_BULLET, final_damge_); valid = false; break; } } } } if(coll_) { SetPos(GetPos()+coord_def(cos(angle)*coll_, sin(angle)*coll_)); valid = false; delay++; } else Move(); distance -= const_speed; if(distance<0) valid = false; } if(valid && delay) { delay--; } else { delay_pos += GetSpeed(); if(!valid) { if(const_delay < delay++) return true; } } return false; }
void MainLoop() { int a=0,b=0; while(1) { you.player_move = true; if(you.s_timestep) { turn_skip(); Sleep(16); continue; } int char_ = waitkeyinput(); you.prev_hp[1] = you.hp; you.prev_mp[1] = you.mp; switch(char_) { case 'j': Move(coord_def(you.position.x,you.position.y-1)); //위 break; case 'k': Move(coord_def(you.position.x,you.position.y+1)); //아래 break; case 'h': Move(coord_def(you.position.x-1,you.position.y)); //왼쪽 break; case 'l': Move(coord_def(you.position.x+1,you.position.y)); //오른쪽 break; case 'b': Move(coord_def(you.position.x-1,you.position.y+1)); break; case 'n': Move(coord_def(you.position.x+1,you.position.y+1)); break; case 'y': Move(coord_def(you.position.x-1,you.position.y-1)); break; case 'u': Move(coord_def(you.position.x+1,you.position.y-1)); break; case 'x': //주위탐색 Search(); break; case 's': //턴스킵 case '.': //턴스킵 turn_skip(); break; case 'g': case ',': //줍기 PickUp(); break; case 'i': //아이템확인 iteminfor(); break; case 'd': //아이템버리기 iteminfor_discard(); break; case 'D': //마지막에 먹은 아이템 버리기 fast_discard(); break; case 'w': //무기장착 Equip_Weapon(); break; case 'W': //방어구장착 Equip_Armor(); break; case 'T': //방어구해제 Unequip_Armor(); break; case 'C': //문닫기 Close_door(); break; case 'O': //문열기 Open_door(); break; case 'o': //자동이동 auto_Move(); break; case '5': //100턴넘기기 long_rest(); break; case 0x88: //컨트롤P - 로그 view_log(); break; case 15: //컨트롤o if(isNormalGame()) dungeonView(); break; case 'e': //먹기 Eatting(); break; case 'q': //마시기 Drinking(); break; case 'r': //읽기 Reading(); break; case 'm': //스킬정보창 skill_view(); break; case 'P': //장신구장착 Equip_Jewelry(); break; case 'R': //장신구해제 Unequip_Jewelry(); break; case 'S': //체크후 종료 saveandcheckexit(); break; case 0x89: //강제종료 nosaveandexit(); break; case 0x8A: //저장과 종료 saveandexit(); break; case 'X': //넓은탐색 Wide_Search(); break; case 'f': //던지기(빠른) Quick_Throw(you.GetThrowIter(),you.GetTargetIter()); break; case 'F': //던지기(선택) Select_Throw(); break; case '\\': //식별템 확인 Iden_Show(); break; case '>': Stair_move(true); break; case '<': Stair_move(false); break; case '%': stat_view(); break; case '}': Weapon_Show(); break; case '[': Armour_Show(); break; case ']': rune_Show(); break; case '\"': Amulet_Show(); break; case '@': Simple_State_Show(); break; case 'N': //sendScore(); break; case 'E': Experience_Show(); break; //case 'c': // Spelllcard_Declare(); // //Eat_Power(); // break; case 'v': case 'V': Spelllcard_Evoke(); break; case 'p': Pray(); break; case '#': if(isNormalGame() && Dump(0,NULL)) printlog("덤프에 성공했습니다.",true,false,false,CL_normal); break; case 'Z': case 'z': SpellUse(); break; case 'I': SpellView(); break; case 'a': SkillUse(); break; case 'A': PropertyView(); break; case 'M': run_spell(); break; case 't': shout(); break; case '^': God_show(); break; case '&': //위자드모드! //waitkeyinput(); wiz_mode(); break; case '_': save_mode(); break; case 0x8B: auto_pick_onoff(false); break; case '?'://도움말 Help_Show(); break; case VK_ESCAPE://esc escape(); break; case VK_TAB: auto_battle(); break; default: break; } } }
Shot_gun::Shot_gun(Texture* texture_, Unit* unit_, float damage_, float sniper_, float power_, float max_power_, int team_, coord_def pos_, float angle_, float speed_, float distance_, int slow_turn_, float slow_ratio_, int delay_): Shot_base(texture_, unit_, team_, pos_, coord_def(cos(angle_)*speed_, sin(angle_)*speed_)), damage(damage_), sniper(sniper_), power(power_), max_power(max_power_), const_delay(delay_), distance(distance_), delay(delay_), delay_pos(pos_), valid(true), angle(angle_), slow_turn(slow_turn_), slow_ratio(slow_ratio_),const_speed(speed_) { }
float Sub_Trap::Shot(Game_Manager* gm_, Unit* User_, int team_, const coord_def& start_, const coord_def& pos_, float focus_) { float angle_ = GetAngleToTarget(start_, pos_); float x_ = start_.x + cos(angle_)*15.0f; float y_ = start_.y + sin(angle_)*15.0f; gm_->shot_list.push_back(new Shot_trap(&tex_trap, User_, 0.2f, 150, 70, 1200, team_, coord_def(x_,y_))); if(!UpDownNum(-1)) { GetPlayer()->DeleteSubWeapon(this, -1); delete this; //끝나면 이걸 지움. 제대로 동작되나? } return 10; }
bool PixedMap(map_dummy* map, char *temp) { map->tiles = new dungeon_tile_type*[map->size_x*2+1]; for(int i=0;i<map->size_x*2+1;i++) map->tiles[i] = new dungeon_tile_type[map->size_y*2+1]; for(int i=0,j=0;temp[j]!='\0';j++) { if(i>=(map->size_x*2+1)*(map->size_y*2+1)) { break; } if(temp[j]!=' ') { switch(temp[j]) { case '.': map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = map->floor_tex; break; case '#': map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = map->wall_tex; break; case ',': map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = DG_FLOOR; break; case '_': map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = DG_GRASS; break; case '@': map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = DG_WALL; break; case '$': map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = DG_METAL_WALL; break; case '[': map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = DG_BAMBOO_WALL; break; case '+': map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = DG_CLOSE_DOOR; break; case '=': map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = DG_GLASS; break; case '&': map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = DG_STATUE; break; case 'E': map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = DG_BOOK_WALL; break; case '~': map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = DG_SEA; break; case 'i': //각 던전에서 드랍되는 아이템을 넣음 { item_infor t; CreateFloorItem(map->floor,&t); map->item_list.push_back(mapdummy_item(t,coord_def(i%(map->size_x*2+1)-map->size_x,i/(map->size_x*2+1)-map->size_y))); map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = map->floor_tex; } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = map->sp_tile_list[temp[j]-'0']; if(map->sp_tile_list[temp[j]-'0']>= DG_SUB_STAIR_FIRST && map->sp_tile_list[temp[j]-'0'] < DG_SUB_STAIR_MAX) {//특수 지형이 만약 서브던젼 계단입구일 경우 int stiar_enter_ = map->sp_tile_list[temp[j]-'0'] - DG_SUB_STAIR_FIRST; if(stiar_enter_>=SUBTERRANEAN) stiar_enter_--; if(stiar_enter_>=PANDEMONIUM) stiar_enter_--; //map_list.dungeon_enter[stiar_enter_].detected = true; map_list.dungeon_enter[stiar_enter_].pos = coord_def(i%(map->size_x*2+1)-map->size_x,i/(map->size_x*2+1)-map->size_y); map_list.dungeon_enter[stiar_enter_].pos += map->pos; } break; } default: map->tiles[i%(map->size_x*2+1)][i/(map->size_x*2+1)] = DG_FLOOR2; break; } i++; } } map->m_entrance+=map->pos; map->m_exit+=map->pos; return true; }
float SdfRenderer::y2_def(QDomElement &element) { return coord_def(element, "y2", current_size_y, first_size_y) + mStartY; }
float SdfRenderer::x2_def(QDomElement &element) { return coord_def(element, "x2", current_size_x, first_size_x) + mStartX; }
Shot_net::Shot_net(Texture* texture_, Unit* unit_, int net_time_, int team_, coord_def pos_, float angle_, float speed_, float distance_): Shot_base(texture_, unit_, team_, pos_, coord_def(cos(angle_)*speed_, sin(angle_)*speed_)), net_time(net_time_), distance(distance_), valid(true), angle(angle_), const_speed(speed_) { }