void OreMineDeletionRequest::execute() { int size = subject->constructionGroup->size; int x = subject->x; int y = subject->y; subject->detach(); delete subject; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { world(x + j, y + i)->flags &= ~(FLAG_POWER_CABLES_0 | FLAG_POWER_CABLES_90); if (world(x+j,y+i)->ore_reserve < ORE_RESERVE / 2) { world(x+j,y+i)->setTerrain(GROUP_WATER); world(x+j,y+i)->flags |= (FLAG_HAS_UNDERGROUND_WATER | FLAG_ALTERED); connect_rivers(x+j,y+i); } //update mps display if (mps_x == x + j && mps_y == y + i) { mps_set(x + j, y + i, MPS_MAP);} } } // update adjacencies connect_transport(x - 2, y - 2, x + size + 1, y + size + 1); desert_water_frontiers(x - 1, y - 1, size + 2, size + 2); }
void mps_handler(int x, int y, int button) { if (button == LC_MOUSE_LEFTBUTTON) { if (mps_style == MPS_GLOBAL) { mps_global_advance(); } else { mps_set(0,0,MPS_GLOBAL); } } else if (button == LC_MOUSE_RIGHTBUTTON) { /* XXX: Pop help here, depending on selected style */ } }
void SetOnFire::execute() { unsigned short size = subject->constructionGroup->size; int x = subject->x; int y = subject->y; subject->detach(); delete subject; for (unsigned short i = 0; i < size; ++i) { for (unsigned short j = 0; j < size; ++j) { world(x + j, y + i)->flags &= ~(FLAG_POWER_CABLES_0 | FLAG_POWER_CABLES_90); fireConstructionGroup.placeItem(x+j, y+i); //update mps display if (mps_x == x + j && mps_y == y + i) { mps_set(x + j, y + i, MPS_MAP);} } } // update adjacencies connect_transport(x - 2, y - 2, x + size + 1, y + size + 1); desert_water_frontiers(x - 1, y - 1, size + 2, size + 2); }
void ConstructionDeletionRequest::execute() { //std::cout << "deleting: " << subject->constructionGroup->name //<< " (" << subject->x << "," << subject->y << ")" << std::endl; unsigned short size = subject->constructionGroup->size; int x = subject->x; int y = subject->y; subject->detach(); delete subject; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { //update mps display world(x + j, y + i)->flags &= ~(FLAG_POWER_CABLES_0 | FLAG_POWER_CABLES_90); if (mps_x == x + j && mps_y == y + i) { mps_set(x + j, y + i, MPS_MAP);} } } // update adjacencies connect_transport(x - 2, y - 2, x + size + 1, y + size + 1); desert_water_frontiers(x - 1, y - 1, size + 2, size + 2); }
MainState Game::run() { SDL_Event event; running = true; Uint32 fpsTicks = SDL_GetTicks(); Uint32 lastticks = fpsTicks; Desktop* desktop = dynamic_cast<Desktop*> (gui.get()); if(!desktop) { throw std::runtime_error("Toplevel component is not a Desktop");} gui->resize(getConfig()->videoX, getConfig()->videoY); int frame = 0; while(running) { getGameView()->scroll(); while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_VIDEORESIZE: initVideo(event.resize.w, event.resize.h); gui->resize(event.resize.w, event.resize.h); getConfig()->videoX = event.resize.w; getConfig()->videoY = event.resize.h; break; case SDL_KEYUP: { Event gui_event(event); if( gui_event.keysym.sym == SDLK_ESCAPE ){ getButtonPanel()->selectQueryTool(); break; } if( gui_event.keysym.sym == SDLK_b ){ getButtonPanel()->toggleBulldozeTool(); break; } /* //FIXME hack for monitoring constructionCount if( gui_event.keysym.sym == SDLK_c ){ std::cout << "ConstructionCount.size() = " << constructionCount.size() << std::endl; int i, j; for (i = 0, j = 0; i < constructionCount.size(); i++) {constructionCount[i]?j++:j;} std::cout << "for a total of " << j << " active constructions" << std::endl; break; } */ if( gui_event.keysym.sym == SDLK_p ){ static int i = 0; while(i < constructionCount.size() && !constructionCount[i]) {i++;} if (i < constructionCount.size()) { main_screen_originx = constructionCount[i]->x; main_screen_originy = constructionCount[i]->y; getGameView()->readOrigin(true); mps_set( main_screen_originx, main_screen_originy, MPS_MAP); mps_update(); mps_refresh(); i++; } else { i = 0; } break; } if( gui_event.keysym.sym == SDLK_F1 ){ helpWindow->showTopic("help"); break; } if( gui_event.keysym.sym == SDLK_F12 ){ quickSave(); break; } if( gui_event.keysym.sym == SDLK_F9 ){ quickLoad(); break; } #ifdef DEBUG if( gui_event.keysym.sym == SDLK_F5 ){ testAllHelpFiles(); break; } #endif int need_break=true; switch(gui_event.keysym.sym) { case SDLK_BACKQUOTE: getMiniMap()->mapViewChangeDisplayMode(MiniMap::NORMAL); break; case SDLK_1: getMiniMap()->mapViewChangeDisplayMode(MiniMap::STARVE); break; case SDLK_2: getMiniMap()->mapViewChangeDisplayMode(MiniMap::UB40); break; case SDLK_3: getMiniMap()->mapViewChangeDisplayMode(MiniMap::POWER); break; case SDLK_4: getMiniMap()->mapViewChangeDisplayMode(MiniMap::FIRE); break; case SDLK_5: getMiniMap()->mapViewChangeDisplayMode(MiniMap::CRICKET); break; case SDLK_6: getMiniMap()->mapViewChangeDisplayMode(MiniMap::HEALTH); break; case SDLK_7: getMiniMap()->mapViewChangeDisplayMode(MiniMap::TRAFFIC); break; case SDLK_8: getMiniMap()->mapViewChangeDisplayMode(MiniMap::POLLUTION); break; case SDLK_9: getMiniMap()->mapViewChangeDisplayMode(MiniMap::COAL); break; case SDLK_0: getMiniMap()->mapViewChangeDisplayMode(MiniMap::COMMODITIES); break; default: need_break=false; } if (need_break) break; gui->event(gui_event); break; } case SDL_MOUSEMOTION: case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONDOWN: case SDL_KEYDOWN: { Event gui_event(event); gui->event(gui_event); break; } case SDL_ACTIVEEVENT: if( event.active.gain == 1 ){ gui->resize( gui->getWidth(), gui->getHeight() ); } break; case SDL_VIDEOEXPOSE: gui->resize( gui->getWidth(), gui->getHeight() ); break; case SDL_QUIT: saveCityNG( "9_currentGameNG.scn" ); running = false; quitState = QUIT; break; default: break; } } // create update Event Uint32 ticks = SDL_GetTicks(); float elapsedTime = ((float) (ticks - lastticks)) / 1000.0; gui->event(Event(elapsedTime)); lastticks = ticks; helpWindow->update(); if(desktop->needsRedraw()) { desktop->draw(*painter); flipScreenBuffer(); } frame++; // Slow down cpu consumption in pause mode if(ticks - fpsTicks > 1000 && lincitySpeed) { #ifdef DEBUG_FPS printf("FPS: %d.\n", (frame*1000) / (ticks - fpsTicks)); #endif getEconomyGraph()->newFPS( frame ); frame = 0; fpsTicks = ticks; } else if(!lincitySpeed) { frame = 0;} /* SDL_Delay is done in execute_timestep */ execute_timestep (); } return quitState; }
void editMap (MapPoint point, int button) { if( !getGameView()->inCity( point ) ){ return; } int x = point.x; int y = point.y; int selected_module_group = get_group_of_type(selected_module_type); int size; // int x, y; /* mappoint */ int mod_x, mod_y; /* upper left coords of module clicked on */ int mps_result; if (MP_TYPE(x,y) == CST_USED) { mod_x = MP_INFO(x,y).int_1; mod_y = MP_INFO(x,y).int_2; } else { mod_x = x; mod_y = y; } /* Bring up mappoint_stats for any right mouse click */ if (button == SDL_BUTTON_RIGHT) { mps_set( x, y, MPS_ENV); return; } /* Handle bulldozing */ if (selected_module_type == CST_GREEN && button != SDL_BUTTON_RIGHT) { check_bulldoze_area (x, y); mps_result = mps_set( mod_x, mod_y, MPS_MAP ); // Update mps on bulldoze #ifdef DEBUG DBG_TileInfo(x, y); #endif return; } /* Bring up mappoint_stats for certain left mouse clicks */ /* Check market and port double-clicks here */ /* Check rocket launches */ if( !GROUP_IS_BARE(MP_GROUP( x,y )) ) { if(mapMPS) mapMPS->playBuildingSound( mod_x, mod_y ); mps_result = mps_set( mod_x, mod_y, MPS_MAP ); //query Tool #ifdef DEBUG DBG_TileInfo(x, y); #endif if( mps_result >= 1 ){ if( MP_GROUP( mod_x,mod_y ) == GROUP_MARKET ){ clicked_market_cb (mod_x, mod_y); return; } else if (MP_GROUP(mod_x,mod_y) == GROUP_PORT) { clicked_port_cb (mod_x, mod_y); return; } else if (MP_TYPE(mod_x,mod_y) >= CST_ROCKET_5 && MP_TYPE(mod_x,mod_y) <= CST_ROCKET_7){ //Dialogs delete themself new Dialog( ASK_LAUNCH_ROCKET, mod_x,mod_y ); return; } } //to be here we are not in bulldoze-mode and the tile //under the cursor is not empty. //to allow up/downgrading of Tracks,Roads,Rails and bridges we can't always return. if( ( selected_module_type != CST_TRACK_LR ) && ( selected_module_type != CST_ROAD_LR ) && ( selected_module_type != CST_RAIL_LR ) ) { return; //not building a transport } if( ( MP_GROUP(x,y) != GROUP_WATER ) && ( !( MP_INFO(x,y).flags & FLAG_IS_TRANSPORT ))){ return; //target area is neither water not a transport } if( selected_module_type == CST_TRACK_LR ) { if( MP_GROUP( x, y ) == GROUP_TRACK || MP_GROUP( x, y ) == GROUP_TRACK_BRIDGE || MP_GROUP( x, y ) == GROUP_ROAD || MP_GROUP( x, y ) == GROUP_ROAD_BRIDGE || MP_GROUP( x, y ) == GROUP_RAIL || MP_GROUP( x, y ) == GROUP_RAIL_BRIDGE ) return; } else if( selected_module_type == CST_ROAD_LR ) { if ( MP_GROUP( x, y ) == GROUP_ROAD || MP_GROUP( x, y ) == GROUP_ROAD_BRIDGE || MP_GROUP( x, y ) == GROUP_RAIL || MP_GROUP( x, y ) == GROUP_RAIL_BRIDGE ) return; } else if( selected_module_type == CST_RAIL_LR ) { if( MP_GROUP( x, y ) == GROUP_RAIL || MP_GROUP( x, y ) == GROUP_RAIL_BRIDGE ) return; } } //query Tool if(selected_module_type==CST_NONE) { if (mapMPS) { mapMPS->playBuildingSound( mod_x, mod_y ); mapMPS->setView(MapPoint( mod_x, mod_y )); } mps_result = mps_set( mod_x, mod_y, MPS_MAP ); //query Tool on CST_NONE #ifdef DEBUG DBG_TileInfo(x, y); #endif return; } /* OK, by now we are certain that the user wants to place the item. Set the origin based on the size of the selected_module_type, and see if the selected item will fit. */ size = main_groups[selected_module_group].size; /* if (px > (mw->x + mw->w) - size*16) px = (mw->x + mw->w) - size*16; if (py > (mw->y + mw->h) - size*16) py = (mw->y + mw->h) - size*16; pixel_to_mappoint(px, py, &x, &y); */ //Check if we are too close to the border if( x + size > WORLD_SIDE_LEN - 1 || y + size > WORLD_SIDE_LEN - 1 || x < 1 || y < 1 ) return; if (size >= 2) { if (!GROUP_IS_BARE(MP_GROUP(x + 1,y)) || !GROUP_IS_BARE(MP_GROUP(x,y + 1)) || !GROUP_IS_BARE(MP_GROUP(x + 1,y + 1))) return; } if (size >= 3) { if (!GROUP_IS_BARE(MP_GROUP(x + 2,y)) || !GROUP_IS_BARE(MP_GROUP(x + 2,y + 1)) || !GROUP_IS_BARE(MP_GROUP(x + 2,y + 2)) || !GROUP_IS_BARE(MP_GROUP(x + 1,y + 2)) || !GROUP_IS_BARE(MP_GROUP(x,y + 2))) return; } if (size == 4) { if (!GROUP_IS_BARE(MP_GROUP(x + 3,y)) || !GROUP_IS_BARE(MP_GROUP(x + 3,y + 1)) || !GROUP_IS_BARE(MP_GROUP(x + 3,y + 2)) || !GROUP_IS_BARE(MP_GROUP(x + 3,y + 3)) || !GROUP_IS_BARE(MP_GROUP(x + 2,y + 3)) || !GROUP_IS_BARE(MP_GROUP(x + 1,y + 3)) || !GROUP_IS_BARE(MP_GROUP(x,y + 3))) return; } //how to build a lake in the park? //just hold 'W' key on build ;-) if( selected_module_group == GROUP_PARKLAND ){ Uint8 *keystate = SDL_GetKeyState(NULL); if ( keystate[SDLK_w] ) selected_module_type = CST_PARKLAND_LAKE; else selected_module_type = CST_PARKLAND_PLANE; } /* Place the selected item . Warning messages are managed by place_item(...) */ last_message_group = place_item (x, y, selected_module_type); switch (last_message_group) { case 0: /* Success */ getSound()->playSound( "Build" ); mps_result = mps_set( mod_x, mod_y, MPS_MAP ); // Update mps on well-built #ifdef DEBUG DBG_TileInfo(x, y); #endif break; case -1000: /* ouch group does not exist */ case -1: /* Not enough money */ case -2: /* Improper port placement */ case -3: /* too many windmills/substations */ case -4: /* too many market */ case -5: /* previous tip here, cannot build tip here */ case -6: /* previous tip here, cannot build oremine */ case -7: /* no ore reserve. cannot build oremine here */ default: /* warning messages are managed by place item */ last_message_group = 0; } }