diff --git a/desktop_version/src/CustomLevels.cpp b/desktop_version/src/CustomLevels.cpp index 2a7494cf..fbcb9c48 100644 --- a/desktop_version/src/CustomLevels.cpp +++ b/desktop_version/src/CustomLevels.cpp @@ -956,6 +956,23 @@ int customlevelclass::findtrinket(int t) return 0; } +int customlevelclass::findcoin(int t) +{ + int coins = 0; + for (int i = 0; i < (int) customentities.size(); i++) + { + if (i == t) + { + return coins; + } + if (customentities[i].t == 8) + { + coins++; + } + } + return 0; +} + int customlevelclass::findcrewmate(int t) { int ttrinket=0; @@ -1961,6 +1978,19 @@ int customlevelclass::numtrinkets(void) return temp; } +int customlevelclass::numcoins(void) +{ + int temp = 0; + for (size_t i = 0; i < customentities.size(); i++) + { + if (customentities[i].t == 8 && inbounds(&customentities[i])) + { + temp++; + } + } + return temp; +} + int customlevelclass::numcrewmates(void) { int temp = 0; diff --git a/desktop_version/src/CustomLevels.h b/desktop_version/src/CustomLevels.h index 97e3448d..def914d2 100644 --- a/desktop_version/src/CustomLevels.h +++ b/desktop_version/src/CustomLevels.h @@ -142,6 +142,7 @@ public: void generatecustomminimap(void); int findtrinket(int t); + int findcoin(int t); int findcrewmate(int t); int findwarptoken(int t); void findstartpoint(void); @@ -155,6 +156,7 @@ public: static const int numrooms = maxwidth * maxheight; int contents[40 * 30 * numrooms]; int numtrinkets(void); + int numcoins(void); int numcrewmates(void); RoomProperty roomproperties[numrooms]; //Maxwidth*maxheight diff --git a/desktop_version/src/Editor.cpp b/desktop_version/src/Editor.cpp index a9d8cdc1..5d3a9ee6 100644 --- a/desktop_version/src/Editor.cpp +++ b/desktop_version/src/Editor.cpp @@ -48,6 +48,7 @@ editorclass::editorclass(void) register_tool(EditorTool_WARP_LINES, "Warp Lines", "I", SDLK_i, false); register_tool(EditorTool_CREWMATES, "Crewmates", "O", SDLK_o, false); register_tool(EditorTool_START_POINT, "Start Point", "P", SDLK_p, false); + register_tool(EditorTool_COINS, "Coins", "^2", SDLK_2, true); static const short basic[] = { 121, 121, 121, 121, 121, 121, 121, 160, 121, 121, 121, 121, 121, 121, 121, @@ -993,6 +994,10 @@ static void draw_entities(void) font::print(PR_FONT_8X8, x, y, "////", 255 - help.glow, 255 - help.glow, 255 - help.glow); graphics.draw_rect(x, y, 32, 8, graphics.getRGB(255, 255, 255)); break; + case 8: // Coins + graphics.draw_grid_tile(graphics.grphx.im_tiles_white, 48, x, y, 8, 8, graphics.huetilegetcol()); + graphics.draw_rect(x, y, 8, 8, graphics.getRGB(255, 164, 164)); + break; case 9: // Shiny Trinkets graphics.draw_sprite(x, y, 22, 196, 196, 196); graphics.draw_rect(x, y, 16, 16, graphics.getRGB(255, 164, 164)); @@ -1350,6 +1355,7 @@ static void draw_cursor(void) case EditorTool_GRAVITY_LINES: case EditorTool_ROOMTEXT: case EditorTool_SCRIPTS: + case EditorTool_COINS: // 1x1 graphics.draw_rect(x, y, 8, 8, blue); break; @@ -1757,6 +1763,12 @@ void editorclass::draw_tool(EditorTools tool, int x, int y) case EditorTool_START_POINT: graphics.draw_sprite(x, y, 184, graphics.col_crewcyan); break; + case EditorTool_COINS: + graphics.draw_grid_tile(graphics.grphx.im_tiles_white, 48, x, y - 1, 8, 8, graphics.getRGB(255, 255, 0)); + graphics.draw_grid_tile(graphics.grphx.im_tiles_white, 48, x + 9, y - 1, 8, 8, graphics.getRGB(255, 255, 0)); + graphics.draw_grid_tile(graphics.grphx.im_tiles_white, 48, x, y + 8, 8, 8, graphics.getRGB(255, 255, 0)); + graphics.draw_grid_tile(graphics.grphx.im_tiles_white, 48, x + 9, y + 8, 8, 8, graphics.getRGB(255, 255, 0)); + break; default: break; } @@ -2462,6 +2474,9 @@ void editorclass::entity_clicked(const int index) } break; } + case 8: + lclickdelay = 0; + break; case 10: // Checkpoints // If it's not textured as a checkpoint, then just leave it be @@ -2645,6 +2660,9 @@ void editorclass::tool_place() add_entity(levx, levy, tilex, tiley, 16, 0); lclickdelay = 1; break; + case EditorTool_COINS: + add_entity(levx, levy, tilex, tiley, 8); + break; default: break; } diff --git a/desktop_version/src/Editor.h b/desktop_version/src/Editor.h index f9fff570..2a69c116 100644 --- a/desktop_version/src/Editor.h +++ b/desktop_version/src/Editor.h @@ -49,6 +49,7 @@ enum EditorTools EditorTool_WARP_LINES, EditorTool_CREWMATES, EditorTool_START_POINT, + EditorTool_COINS, NUM_EditorTools }; diff --git a/desktop_version/src/Entity.cpp b/desktop_version/src/Entity.cpp index 210145a8..bbcdb8dd 100644 --- a/desktop_version/src/Entity.cpp +++ b/desktop_version/src/Entity.cpp @@ -1524,7 +1524,7 @@ void entityclass::createentity(int xp, int yp, int t, int meta1, int meta2, int //Check if it's already been collected entity.para = meta1; - if (!INBOUNDS_ARR(meta1, collect) || collect[meta1]) return; + if (coincollect.find(meta1) != coincollect.end()) return; break; case 9: //Something Shiny entity.rule = 3; @@ -2657,10 +2657,7 @@ bool entityclass::updateentities( int i ) if (entities[i].state == 1) { music.playef(Sound_COIN); - if (INBOUNDS_ARR(entities[i].para, collect)) - { - collect[(int) entities[i].para] = true; - } + coincollect.insert(entities[i].para); return disableentity(i); } diff --git a/desktop_version/src/Entity.h b/desktop_version/src/Entity.h index 796918b3..9364b8b4 100644 --- a/desktop_version/src/Entity.h +++ b/desktop_version/src/Entity.h @@ -2,6 +2,7 @@ #define ENTITY_H #include +#include #include #include @@ -175,6 +176,7 @@ public: std::vector blocks; bool flags[100]; bool collect[100]; + std::set coincollect; bool customcollect[100]; int platformtile; diff --git a/desktop_version/src/Game.cpp b/desktop_version/src/Game.cpp index 1d7bad14..2ca9e753 100644 --- a/desktop_version/src/Game.cpp +++ b/desktop_version/src/Game.cpp @@ -477,6 +477,23 @@ void Game::deletecustomlevelstats(void) } } + +#define LOAD_SET_RENAME(SET_NAME, DEST) \ + if (SDL_strcmp(pKey, #SET_NAME) == 0 && pText[0] != '\0') \ + { \ + /* We're loading in 32-bit integers. If we need more than 16 chars, + * something is seriously wrong */ \ + char buffer[16]; \ + size_t start = 0; \ + size_t i = 0; \ + \ + while (next_split_s(buffer, sizeof(buffer), &start, pText, ',')) \ + { \ + DEST.insert(help.Int(buffer)); \ + ++i; \ + } \ + } + #define LOAD_ARRAY_RENAME(ARRAY_NAME, DEST) \ if (SDL_strcmp(pKey, #ARRAY_NAME) == 0 && pText[0] != '\0') \ { \ @@ -5747,6 +5764,8 @@ void Game::customloadquick(const std::string& savfile) LOAD_ARRAY_RENAME(collect, obj.collect) + LOAD_SET_RENAME(coincollect, obj.coincollect) + LOAD_ARRAY_RENAME(customcollect, obj.customcollect) if (SDL_strcmp(pKey, "finalmode") == 0) @@ -6262,6 +6281,16 @@ bool Game::customsavequick(const std::string& savfile) } xml::update_tag(msgs, "collect", collect.c_str()); + std::string coincollect; + std::set::iterator iterator = obj.coincollect.begin(); + while (iterator != obj.coincollect.end()) { + { + coincollect += help.String(*iterator) + ","; + iterator++; + } + } + xml::update_tag(msgs, "coincollect", coincollect.c_str()); + std::string customcollect; for(size_t i = 0; i < SDL_arraysize(obj.customcollect); i++ ) { @@ -7528,6 +7557,11 @@ int Game::trinkets(void) return temp; } +int Game::coins(void) +{ + return (int) obj.coincollect.size(); +} + int Game::crewmates(void) { int temp = 0; diff --git a/desktop_version/src/Game.h b/desktop_version/src/Game.h index 362a956c..d1e70f5b 100644 --- a/desktop_version/src/Game.h +++ b/desktop_version/src/Game.h @@ -483,6 +483,7 @@ public: int deathseq, lifeseq; int trinkets(void); + int coins(void); int crewmates(void); int savepoint, teleportxpos; bool teleport; diff --git a/desktop_version/src/Map.cpp b/desktop_version/src/Map.cpp index 747ebc38..56740269 100644 --- a/desktop_version/src/Map.cpp +++ b/desktop_version/src/Map.cpp @@ -1865,6 +1865,9 @@ void mapclass::loadlevel(int rx, int ry) case 3: // Disappearing platforms obj.createentity(ex, ey, 3); break; + case 8: // Coins + obj.createentity(ex, ey, 8, cl.findcoin(edi)); + break; case 9: // Trinkets obj.createentity(ex, ey, 9, cl.findtrinket(edi)); break; diff --git a/desktop_version/src/Render.cpp b/desktop_version/src/Render.cpp index 82132350..0d7db733 100644 --- a/desktop_version/src/Render.cpp +++ b/desktop_version/src/Render.cpp @@ -2390,6 +2390,26 @@ void gamerender(void) ); } + bool show_coins = game.coins() > 0; +#ifndef NO_CUSTOM_LEVELS + show_coins = show_coins || (map.custommode && (cl.numcoins() > 0)); +#endif + + if (show_coins) { + int color = 255 - help.glow / 2; + + font::print(PR_BOR | PR_RIGHT, 304, 231, help.String(game.coins()), color, color, 196); + + if (!graphics.notextoutline) { + graphics.draw_grid_tile(graphics.grphx.im_tiles_white, 48, 310, 230, 8, 8, graphics.getRGB(0, 0, 0)); + graphics.draw_grid_tile(graphics.grphx.im_tiles_white, 48, 312, 230, 8, 8, graphics.getRGB(0, 0, 0)); + graphics.draw_grid_tile(graphics.grphx.im_tiles_white, 48, 311, 229, 8, 8, graphics.getRGB(0, 0, 0)); + graphics.draw_grid_tile(graphics.grphx.im_tiles_white, 48, 311, 231, 8, 8, graphics.getRGB(0, 0, 0)); + } + + graphics.draw_grid_tile(graphics.grphx.im_tiles_white, 48, 311, 230, 8, 8, graphics.getRGB(color, color, 196)); + } + if (map.roomtexton) { //Draw room text! diff --git a/desktop_version/src/Script.cpp b/desktop_version/src/Script.cpp index a58b1735..9d0e337b 100644 --- a/desktop_version/src/Script.cpp +++ b/desktop_version/src/Script.cpp @@ -1290,6 +1290,14 @@ void scriptclass::run(void) position--; } } + else if (words[0] == "ifcoins") + { + if (game.coins() >= ss_toi(words[1])) + { + load("custom_" + raw_words[2]); + position--; + } + } else if (words[0] == "hidecoordinates") { map.setexplored(ss_toi(words[1]), ss_toi(words[2]), false); @@ -1437,6 +1445,7 @@ void scriptclass::run(void) obj.collect[i] = false; obj.customcollect[i] = false; } + obj.coincollect.clear(); game.deathcounts = 0; game.advancetext = false; game.hascontrol = true; @@ -3239,6 +3248,8 @@ void scriptclass::hardreset(void) SDL_memset(obj.customcollect, false, sizeof(obj.customcollect)); i = 100; //previously a for-loop iterating over collect/customcollect set this to 100 + obj.coincollect.clear(); + int theplayer = obj.getplayer(); if (INBOUNDS_VEC(theplayer, obj.entities)){ obj.entities[theplayer].tile = 0;