Browse Source

♻️Handle towner talk logic via initialization list instead of switch

pull/1781/head
Anders Jenbo 5 years ago
parent
commit
05f8f9524f
  1. 89
      Source/towners.cpp
  2. 1
      Source/towners.h

89
Source/towners.cpp

@ -114,6 +114,7 @@ struct TownerInit {
Point position;
direction dir;
void (*init)(TownerStruct &towner, const TownerInit &initData);
void (*talk)(PlayerStruct &player, TownerStruct &barOwner);
};
void NewTownerAnim(TownerStruct &towner, byte *pAnim, uint8_t numFrames, int delay)
@ -134,6 +135,7 @@ void InitTownerInfo(int i, const TownerInit &initData)
towner._tMsgSaid = false;
towner._ttype = initData.type;
towner.position = initData.position;
towner.talk = initData.talk;
towner._tSeed = AdvanceRndSeed();
dMonster[towner.position.x][towner.position.y] = i + 1;
@ -300,24 +302,6 @@ void InitGirl(TownerStruct &towner, const TownerInit &initData)
towner._tName = "Celia";
}
const TownerInit TownerInitList[] = {
{ TOWN_SMITH, { 62, 63 }, DIR_SW, InitSmith },
{ TOWN_HEALER, { 55, 79 }, DIR_SE, InitHealer },
{ TOWN_DEADGUY, { 24, 32 }, DIR_N, InitTownDead },
{ TOWN_TAVERN, { 55, 62 }, DIR_SW, InitBarOwner },
{ TOWN_STORY, { 62, 71 }, DIR_S, InitTeller },
{ TOWN_DRUNK, { 71, 84 }, DIR_S, InitDrunk },
{ TOWN_WITCH, { 80, 20 }, DIR_S, InitWitch },
{ TOWN_BMAID, { 43, 66 }, DIR_S, InitBarmaid },
{ TOWN_PEGBOY, { 11, 53 }, DIR_S, InitBoy },
{ TOWN_COW, { 58, 16 }, DIR_SW, InitCows },
{ TOWN_COW, { 56, 14 }, DIR_NW, InitCows },
{ TOWN_COW, { 59, 20 }, DIR_N, InitCows },
{ TOWN_COWFARM, { 61, 22 }, DIR_SW, InitCowFarmer },
{ TOWN_FARMER, { 62, 16 }, DIR_S, InitFarmer },
{ TOWN_GIRL, { 77, 43 }, DIR_S, InitGirl },
};
void TownCtrlMsg(TownerStruct &towner)
{
if (!towner._tbtcnt) {
@ -595,7 +579,7 @@ void TalkToBarmaid(PlayerStruct &player, TownerStruct &barmaid)
}
}
void TalkToDrunk()
void TalkToDrunk(PlayerStruct &player, TownerStruct &barmaid)
{
TownerTalk(TEXT_FARNHAM1);
StartStore(STORE_DRUNK);
@ -640,7 +624,7 @@ void TalkToHealer(PlayerStruct &player, TownerStruct &healer)
}
}
void TalkToBoy()
void TalkToBoy(PlayerStruct &player, TownerStruct &storyteller)
{
TownerTalk(TEXT_WIRT1);
StartStore(STORE_BOY);
@ -692,7 +676,7 @@ void TalkToStoryteller(PlayerStruct &player, TownerStruct &storyteller)
}
}
void TalkToCow(PlayerStruct &player)
void TalkToCow(PlayerStruct &player, TownerStruct &storyteller)
{
if (CowPlaying != -1 && effect_is_playing(CowPlaying))
return;
@ -953,6 +937,27 @@ void TalkToGirl(PlayerStruct &player, TownerStruct &girl)
}
}
const TownerInit TownerInitList[] = {
// clang-format off
// type position dir init talk
{ TOWN_SMITH, { 62, 63 }, DIR_SW, InitSmith, TalkToBlackSmith },
{ TOWN_HEALER, { 55, 79 }, DIR_SE, InitHealer, TalkToHealer },
{ TOWN_DEADGUY, { 24, 32 }, DIR_N, InitTownDead, TalkToDeadguy },
{ TOWN_TAVERN, { 55, 62 }, DIR_SW, InitBarOwner, TalkToBarOwner },
{ TOWN_STORY, { 62, 71 }, DIR_S, InitTeller, TalkToStoryteller },
{ TOWN_DRUNK, { 71, 84 }, DIR_S, InitDrunk, TalkToDrunk },
{ TOWN_WITCH, { 80, 20 }, DIR_S, InitWitch, TalkToWitch },
{ TOWN_BMAID, { 43, 66 }, DIR_S, InitBarmaid, TalkToBarmaid },
{ TOWN_PEGBOY, { 11, 53 }, DIR_S, InitBoy, TalkToBoy },
{ TOWN_COW, { 58, 16 }, DIR_SW, InitCows, TalkToCow },
{ TOWN_COW, { 56, 14 }, DIR_NW, InitCows, TalkToCow },
{ TOWN_COW, { 59, 20 }, DIR_N, InitCows, TalkToCow },
{ TOWN_COWFARM, { 61, 22 }, DIR_SW, InitCowFarmer, TalkToCowFarmer },
{ TOWN_FARMER, { 62, 16 }, DIR_S, InitFarmer, TalkToFarmer },
{ TOWN_GIRL, { 77, 43 }, DIR_S, InitGirl, TalkToGirl },
// clang-format on
};
} // namespace
TownerStruct towners[NUM_TOWNERS];
@ -1076,47 +1081,7 @@ void TalkToTowner(PlayerStruct &player, int t)
return;
}
switch (towner._ttype) {
case TOWN_TAVERN:
TalkToBarOwner(player, towner);
break;
case TOWN_DEADGUY:
TalkToDeadguy(player, towner);
break;
case TOWN_SMITH:
TalkToBlackSmith(player, towner);
break;
case TOWN_WITCH:
TalkToWitch(player, towner);
break;
case TOWN_BMAID:
TalkToBarmaid(player, towner);
break;
case TOWN_DRUNK:
TalkToDrunk();
break;
case TOWN_HEALER:
TalkToHealer(player, towner);
break;
case TOWN_PEGBOY:
TalkToBoy();
break;
case TOWN_STORY:
TalkToStoryteller(player, towner);
break;
case TOWN_COW:
TalkToCow(player);
break;
case TOWN_FARMER:
TalkToFarmer(player, towner);
break;
case TOWN_COWFARM:
TalkToCowFarmer(player, towner);
break;
case TOWN_GIRL:
TalkToGirl(player, towner);
break;
}
towner.talk(player, towner);
}
} // namespace devilution

1
Source/towners.h

@ -60,6 +60,7 @@ struct TownerStruct {
bool _tMsgSaid;
int8_t _tAnimOrder;
PlayerStruct *_tTalkingToPlayer;
void (*talk)(PlayerStruct &player, TownerStruct &barOwner);
bool _tbtcnt;
_talker_id _ttype;
};

Loading…
Cancel
Save