Skip to content

Commit

Permalink
Reimplement coins as a usable feature
Browse files Browse the repository at this point in the history
- Make coins use their own ID array in save files, instead of sharing the trinket ID array

- Add coin editor entities to allow external tools to use coins, and help the game figure out when it should render the coin display

- Unlimits the coin amount and stores it differently than other collectibles

- Add `ifcoins` logic command to match trinkets
  • Loading branch information
AllyTally committed Jan 29, 2023
1 parent d9859d4 commit 90b832c
Show file tree
Hide file tree
Showing 10 changed files with 105 additions and 6 deletions.
24 changes: 24 additions & 0 deletions desktop_version/src/CustomLevels.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -952,6 +952,17 @@ int customlevelclass::findtrinket(int t)
return 0;
}

int customlevelclass::findcoin(int t)
{
int tcoin = 0;
for (int i = 0; i < (int)customentities.size(); i++)
{
if (i == t) return tcoin;
if (customentities[i].t == 8) tcoin++;
}
return 0;
}

int customlevelclass::findcrewmate(int t)
{
int ttrinket=0;
Expand Down Expand Up @@ -1808,6 +1819,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;
Expand Down
2 changes: 2 additions & 0 deletions desktop_version/src/CustomLevels.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ class customlevelclass
void generatecustomminimap(void);

int findtrinket(int t);
int findcoin(int t);
int findcrewmate(int t);
int findwarptoken(int t);
void findstartpoint(void);
Expand All @@ -147,6 +148,7 @@ class customlevelclass
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

Expand Down
4 changes: 4 additions & 0 deletions desktop_version/src/Editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,10 @@ void editorrender(void)
graphics.Print((customentities[i].x*8)- (ed.levx*40*8),(customentities[i].y*8)- (ed.levy*30*8), "////", 255 - help.glow, 255 - help.glow, 255 - help.glow, false);
fillboxabs((customentities[i].x*8)- (ed.levx*40*8),(customentities[i].y*8)- (ed.levy*30*8),32,8,graphics.getRGB(255,255,255));
break;
case 8: // Coin
graphics.draw_grid_tile(graphics.grphx.im_tiles_white, 48, (customentities[i].x * 8) - (ed.levx * 40 * 8), (customentities[i].y * 8) - (ed.levy * 30 * 8), 8, 8, graphics.huetilegetcol(8));
fillboxabs((customentities[i].x * 8) - (ed.levx * 40 * 8), (customentities[i].y * 8) - (ed.levy * 30 * 8), 8, 8, graphics.getRGB(255, 164, 164));
break;
case 9: //Shiny Trinket
graphics.draw_sprite((customentities[i].x*8)- (ed.levx*40*8),(customentities[i].y*8)- (ed.levy*30*8),22,196,196,196);
fillboxabs((customentities[i].x*8)- (ed.levx*40*8),(customentities[i].y*8)- (ed.levy*30*8),16,16,graphics.getRGB(255, 164, 164));
Expand Down
7 changes: 2 additions & 5 deletions desktop_version/src/Entity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1517,7 +1517,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;
Expand Down Expand Up @@ -2650,10 +2650,7 @@ bool entityclass::updateentities( int i )
if (entities[i].state == 1)
{
music.playef(4);
if (INBOUNDS_ARR(entities[i].para, collect))
{
collect[(int) entities[i].para] = true;
}
coincollect.insert(entities[i].para);

return disableentity(i);
}
Expand Down
2 changes: 2 additions & 0 deletions desktop_version/src/Entity.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define ENTITY_H

#include <SDL.h>
#include <set>
#include <string>
#include <vector>

Expand Down Expand Up @@ -175,6 +176,7 @@ class entityclass
std::vector<blockclass> blocks;
bool flags[100];
bool collect[100];
std::set<int> coincollect;
bool customcollect[100];

int platformtile;
Expand Down
34 changes: 34 additions & 0 deletions desktop_version/src/Game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,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') \
{ \
Expand Down Expand Up @@ -5306,6 +5323,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)
Expand Down Expand Up @@ -5848,6 +5867,16 @@ bool Game::customsavequick(const std::string& savfile)
}
xml::update_tag(msgs, "collect", collect.c_str());

std::string coincollect;
std::set<int>::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++ )
{
Expand Down Expand Up @@ -6979,6 +7008,11 @@ int Game::trinkets(void)
return temp;
}

int Game::coins(void)
{
return (int)obj.coincollect.size();
}

int Game::crewmates(void)
{
int temp = 0;
Expand Down
1 change: 1 addition & 0 deletions desktop_version/src/Game.h
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,7 @@ class Game
int deathseq, lifeseq;

int trinkets(void);
int coins(void);
int crewmates(void);
int savepoint, teleportxpos;
bool teleport;
Expand Down
3 changes: 3 additions & 0 deletions desktop_version/src/Map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1962,6 +1962,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;
Expand Down
23 changes: 22 additions & 1 deletion desktop_version/src/Render.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1939,6 +1939,28 @@ void gamerender(void)
graphics.render_roomname(roomname, roomname_r, roomname_g, roomname_b);
}

bool show_coins = game.coins() > 0;
#ifndef NO_CUSTOM_LEVELS
show_coins = show_coins || (map.custommode && (cl.numcoins() > 0));
#endif

if (show_coins) {
std::string coinstring = help.String(game.coins());

int color = 255 - help.glow / 2;

graphics.bprint(304 - coinstring.length() * 8, 231, coinstring, 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!
Expand Down Expand Up @@ -2216,7 +2238,6 @@ void gamerender(void)
graphics.drawtrophytext();
}


graphics.renderwithscreeneffects();
}

Expand Down
11 changes: 11 additions & 0 deletions desktop_version/src/Script.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1243,6 +1243,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);
Expand Down Expand Up @@ -1391,6 +1399,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;
Expand Down Expand Up @@ -3192,6 +3201,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;
Expand Down

0 comments on commit 90b832c

Please sign in to comment.