#define OLC_PGE_APPLICATION #define OLC_SOUNDWAVE #define OLC_PGEX_TRANSFORMEDVIEW #define AUDIO_LISTENER_IMPLEMENTATION #define AUDIO_SOURCE_IMPLEMENTATION #define OLC_PGEX_QUICKGUI //#define SPLASH_ENABLED #ifdef SPLASH_ENABLED #define OLC_PGEX_SPLASHSCREEN #endif #include "olcUTIL_Geometry2D.h" #include "TileManager.h" #include "util.h" #include "VirusAttack.h" VirusAttack::VirusAttack() { // Name your application sAppName = "olcCodeJam 2023 Entry"; } void VirusAttack::InitializeImages(){ auto LoadImage=[&](Image img,std::string filepath,bool filter=false,bool clamp=true){ IMAGES[img]=std::make_unique(); IMAGES[img]->Load(filepath,nullptr,filter,clamp); }; LoadImage(TILE,"assets/tile.png",false,false); LoadImage(MINIMAP_HUD,"assets/minimap_hud.png"); LoadImage(OUTLINE,"assets/outline.png"); LoadImage(VIRUS_IMG1,"assets/unit.png"); LoadImage(SELECTION_CIRCLE,"assets/selection_circle.png"); LoadImage(MEMORY_COLLECTION_POINT,"assets/memory_collection_point.png"); LoadImage(LEFT_SHIFTER,"assets/left_shifter.png"); LoadImage(RIGHT_SHIFTER,"assets/right_shifter.png"); LoadImage(BIT_RESTORER,"assets/bit_restorer.png"); LoadImage(MEMORY_SWAPPER,"assets/memory_swapper.png"); LoadImage(CORRUPTER,"assets/corrupter.png"); LoadImage(UNIT_ALLOCATOR,"assets/shell.png"); LoadImage(RAM_BANK,"assets/ram_bank.png"); LoadImage(RANGE_INDICATOR,"assets/range_indicator.png"); LoadImage(DOWN_ARROW,"assets/down_arrow.png"); LoadImage(RED_X,"assets/red_x.png"); LoadImage(RLD,"assets/rld.png"); LoadImage(PRC,"assets/prc.png"); LoadImage(RNG,"assets/rng.png"); LoadImage(SPD,"assets/spd.png"); LoadImage(TARGETING_LINE,"assets/targetLine.png"); LoadImage(ATTACKING_LINE,"assets/attackLine.png"); LoadImage(RLD_ICON,"assets/rld_icon.png"); LoadImage(PRC_ICON,"assets/prc_icon.png"); LoadImage(RNG_ICON,"assets/rng_icon.png"); LoadImage(SPD_ICON,"assets/spd_icon.png"); LoadImage(RESOURCE,"assets/material.png"); LoadImage(MEMORY_COLLECTION_POINT_HIGHLIGHT,"assets/memory_collection_point_highlight.png"); } void VirusAttack::InitializeLevelData(){ #pragma region Stage 1 //Stage 1 data. levelData[STAGE1].size={64,64}; levelData[STAGE1].bgm=Sound::GRAVITY; levelData[STAGE1].player_starting_resources={5,5,5,5,5}; levelData[STAGE1].enemy_starting_resources={0,0,0,0,0}; { std::vector&units=levelData[STAGE1].unitPlacement; std::vector&collectionPoints=levelData[STAGE1].cpPlacement; units.push_back({UnitType::LeftShifter,vf2d{128,128},true}); units.push_back({UnitType::RightShifter,vf2d{129,129},true}); units.push_back({UnitType::BitRestorer,vf2d{130,130},true}); units.push_back({UnitType::BitRestorer,vf2d{130,140},true}); units.push_back({UnitType::MemorySwapper,vf2d{131,131},true}); units.push_back({UnitType::Corrupter,vf2d{132,132},true}); units.push_back({UnitType::MemoryAllocator,vf2d{133,133},true}); units.push_back({UnitType::RAMBank,vf2d{134,134},true}); for(int i=0;i<5;i++){ collectionPoints.push_back({vf2d{32.f+48*i,32.f},0,MemoryType(i)}); collectionPoints.push_back({vf2d{32.f,32.f+48*i},-PI/2,MemoryType(i)}); } units.push_back({UnitType::RAMBank,vf2d{1200,1200},false}); units.push_back({UnitType::RightShifter,vf2d{1260,1200},false}); units.push_back({UnitType::RightShifter,vf2d{360,300},false}); units.push_back({UnitType::RightShifter,vf2d{361,300},false}); } #pragma endregion #pragma region Stage 2 //Stage 2 data. levelData[STAGE2].size={16,16}; levelData[STAGE2].bgm=Sound::COSMOS; levelData[STAGE2].player_starting_resources={10,10,10,10,10}; levelData[STAGE2].enemy_starting_resources={0,0,0,0,0}; { std::vector&units=levelData[STAGE2].unitPlacement; std::vector&collectionPoints=levelData[STAGE2].cpPlacement; units.push_back({UnitType::RAMBank,vf2d{134,134},true}); units.push_back({UnitType::RAMBank,vf2d{1200,1200},false}); } #pragma endregion } bool VirusAttack::OnUserCreate(){ SetPixelMode(Pixel::MASK); game.Initialise(GetScreenSize()); InitializeImages(); unitCreationBox.Initialize("Hello world, this is a test of the textbox system.\nMaybe even with some newline characters snuck in there.", {}); unitCreationBox.SetVisible(false); testBox.Initialize("Hello world, this is a test of the textbox system.\nMaybe even with some newline characters snuck in there.",{}); testBox.SetVisible(false); memoryAllocatorBox.Initialize(CONSTANT::MEMORY_ALLOCATOR_BOX_DISPLAY_STRING,{},CONSTANT::MEMORY_ALLOCATOR_BOX_HEADER_STRING); memoryAllocatorBox.SetVisible(false); IMAGES[MINIMAP_OUTLINE]=std::make_unique(); IMAGES[MINIMAP_OUTLINE]->Create(64,64); IMAGES[MATRIX]=std::make_unique(); IMAGES[MATRIX]->Create(64,64,false,false); IMAGES[MATRIX]->Sprite()->SetSampleMode(Sprite::PERIODIC); AL.AudioSystemInit(); InitializeSounds(); InitializeUnitCreationGUI(); InitializeLevelData(); LoadLevel(STAGE1); return true; } void VirusAttack::LoadLevel(LevelName level){ Level&selectedLevel=levelData[level]; currentLevel=&selectedLevel; WORLD_SIZE=selectedLevel.size; if(bgm!=nullptr){ bgm->Stop(); } bgm=SOUNDS[selectedLevel.bgm].get(); bgm->PlayCentered(1,1,true); player_resources=selectedLevel.player_starting_resources; enemy_resources=selectedLevel.enemy_starting_resources; TileManager::visibleTiles.clear(); units.clear(); collectionPoints.clear(); for(auto&u:selectedLevel.unitPlacement){ #define TranslateUnit(type) \ case UnitType::type:{ \ units.push_back(std::make_unique(this,u.pos,IMAGES,u.friendly)); \ }break; switch(u.type){ TranslateUnit(LeftShifter) TranslateUnit(RightShifter) TranslateUnit(BitRestorer) TranslateUnit(MemorySwapper) TranslateUnit(Corrupter) TranslateUnit(MemoryAllocator) TranslateUnit(RAMBank) } } for(auto&cp:selectedLevel.cpPlacement){ collectionPoints.push_back(std::make_unique(this,cp.pos,cp.rot,*IMAGES[MEMORY_COLLECTION_POINT],cp.type)); } } void VirusAttack::InitializeUnitCreationGUI(){ unitCreationList.colNormal = olc::DARK_GREEN; unitCreationList.colHover = olc::GREEN; unitCreationList.colClick = olc::YELLOW; unitCreationList.colDisable = olc::DARK_GREY; unitCreationList.colBorder = olc::YELLOW; unitCreationList.colText = olc::WHITE; leftShifterButton=new QuickGUI::ImageButton(unitCreationList,*IMAGES[LEFT_SHIFTER],{0.5,0.5},{16.f+32*0,float(ScreenHeight()-32)},{20,20}); rightShifterButton=new QuickGUI::ImageButton(unitCreationList,*IMAGES[RIGHT_SHIFTER],{0.5,0.5},{16.f+32*1,float(ScreenHeight()-32)},{20,20}); bitRestorerButton=new QuickGUI::ImageButton(unitCreationList,*IMAGES[BIT_RESTORER],{0.5,0.5},{16.f+32*2,float(ScreenHeight()-32)},{20,20}); memorySwapperButton=new QuickGUI::ImageButton(unitCreationList,*IMAGES[MEMORY_SWAPPER],{0.5,0.5},{16.f+32*3,float(ScreenHeight()-32)},{20,20}); corrupterButton=new QuickGUI::ImageButton(unitCreationList,*IMAGES[CORRUPTER],{0.5,0.5},{16.f+32*4,float(ScreenHeight()-32)},{20,20}); platformButton=new QuickGUI::ImageButton(unitCreationList,*IMAGES[UNIT_ALLOCATOR],{0.5,0.5},{16.f+32*5,float(ScreenHeight()-32)},{20,20}); } void VirusAttack::InitializeSounds(){ int soundIndex=0; auto LoadSound=[&](Sound sound,std::string soundFilename){ SOUNDS[sound]=std::make_unique