1
0
mirror of https://github.com/blupi-games/planetblupi synced 2024-12-30 10:15:36 +01:00
planetblupi/decor.h
2017-01-30 21:53:17 +01:00

544 lines
16 KiB
C++

// Decor.h
#pragma once
#include "DEF.H"
#include "SOUND.H"
#include "PIXMAP.H"
/////////////////////////////////////////////////////////////////////////////
#define MAXENERGY 4000
#define MAXFIRE 400
#define ICON_HILI_STAT 112
#define ICON_HILI_SEL 113
#define ICON_HILI_ANY 114
#define ICON_HILI_OP 115
#define ICON_HILI_GO 117
#define ICON_HILI_BUILD 118
#define ICON_HILI_ERR 119
// Descripteur d'une cellule du décor.
typedef struct
{
short floorChannel;
short floorIcon;
short objectChannel;
short objectIcon;
short fog; // brouillard
short rankMove; // rang dans m_move
short workBlupi; // rang du blupi travaillant ici
short fire;
}
Cellule;
// Cette structure doit être la plus petite possible, car
// il en existe un tableau de 100x100 = 10'000 cellules !
// Descripteur d'un blupi animé.
#define MAXBLUPI 100
#define MAXUSED 50
#define MAXLIST 10
typedef struct
{
int bExist; // true -> utilisé
int bHili; // true -> sélectionné
short perso; // personnage, voir (*)
short goalAction; // action (long terme)
short goalPhase; // phase (long terme)
POINT goalCel; // cellule visée (long terme)
POINT passCel; // cellule tranversante
short energy; // énergie restante
POINT cel; // cellule actuelle
POINT destCel; // cellule destination
short action; // action en cours
short aDirect; // direction actuelle
short sDirect; // direction souhaitée
POINT pos; // position relative à partir de la cellule
short posZ; // déplacement z
short channel;
short lastIcon;
short icon;
short phase; // phase dans l'action
short step; // pas global
short interrupt; // 0=prioritaire, 1=normal, 2=misc
short clipLeft;
int nbUsed; // nb de points déjà visités
char nextRankUsed;
POINT posUsed[MAXUSED];
char rankUsed[MAXUSED];
short takeChannel; // objet transporté
short takeIcon;
POINT fix; // point fixe (cultive, pont)
short jaugePhase;
short jaugeMax;
short stop; // 1 -> devra stopper
short bArrow; // true -> flèche en dessus de blupi
short bRepeat; // true -> répète l'action
short nLoop; // nb de boucles pour GOAL_OTHERLOOP
short cLoop; // boucle en cours
short vIcon; // icône variable
POINT goalHili; // but visé
short bMalade; // true -> blupi malade
short bCache; // true -> caché (pas dessiné)
short vehicule; // véhicule utilisé par blupi, voir (**)
char busyCount;
char busyDelay;
char clicCount;
char clicDelay;
char reserve2[2];
short listButton[MAXLIST];
POINT listCel[MAXLIST];
short listParam[MAXLIST];
short repeatLevelHope;
short repeatLevel;
short reserve3[88];
}
Blupi;
// (*) Personnages :
// 0 -> blupi
// 1 -> araignée
// 2 -> virus
// 3 -> tracks
// 4 -> robot
// 5 -> bombe
// 6 -> détonnateur de mine (invisible)
// 7 -> électro
// 8 -> disciple (robot2)
// (**) Véhicule :
// 0 -> à pied
// 1 -> en bateau
// 2 -> en jeep
// 3 -> armure
// Descripteur d'un décor animé.
#define MAXMOVE 100
#define MOVEICONNB 1000
typedef struct
{
int bExist; // true -> utilisé
POINT cel; // cellule du décor
short rankBlupi; // blupi travaillant ici
int bFloor; // true -> floor, false -> object
short channel;
short icon;
short maskChannel;
short maskIcon;
short phase; // phase pour pMoves ou pIcon
short rankMoves; // *nb,dx,dy,...
short rankIcons; // *nb,i,i,...
short total; // nb total d'étapes
short delai; // délai entre deux pas
short stepY; // pas vertical *100
short cTotal;
short cDelai;
}
Move;
#define MAXLASTDRAPEAU 50
class CDecor
{
public:
CDecor();
~CDecor();
// Arrange.cpp
void ArrangeFloor(POINT cel);
void ArrangeMur(POINT cel, int &icon, int index);
void ArrangeBuild(POINT cel, int &channel, int &icon);
void ArrangeObject(POINT cel);
bool ArrangeFillTestFloor(POINT cel1, POINT cel2);
bool ArrangeFillTest(POINT pos);
void ArrangeFillPut(POINT pos, int channel, int icon);
void ArrangeFillSearch(POINT pos);
void ArrangeFill(POINT pos, int channel, int icon, bool bFloor);
void ArrangeBlupi();
// Obstacle.cpp
void SearchFloor(int rank, int icon, POINT cel, int *pBits);
void SearchObject(int rank, int icon, POINT cel, int *pBits);
void AjustFloor(int rank, int icon, POINT cel, int *pBits);
void AjustObject(int rank, int icon, POINT cel, int *pBits);
bool IsFreeDirect(POINT cel, int direct, int rank);
bool IsFreeCelObstacle(POINT cel);
bool IsFreeCelFloor(POINT cel, int rank);
bool IsFreeCelGo(POINT cel, int rank);
bool IsFreeCelHili(POINT cel, int rank);
bool IsFreeCel(POINT cel, int rank);
bool IsFreeCelDepose(POINT cel, int rank);
bool IsFreeCelEmbarque(POINT cel, int rank, int &action, POINT &limit);
bool IsFreeCelDebarque(POINT cel, int rank, int &action, POINT &limit);
bool IsFreeJump(POINT cel, int direct, int rank, int &action);
bool IsFreeGlisse(POINT cel, int direct, int rank, int &action);
int DirectSearch(POINT cel, POINT goal);
void FlushUsed(int rank);
void AddUsedPos(int rank, POINT pos);
bool IsUsedPos(int rank, POINT pos);
bool SearchBestBase(int rank, int &action, POINT &newCel, int &direct);
bool SearchBestPass(int rank, int &action);
bool IsWorkableObject(POINT cel, int rank);
bool SearchOtherObject(int rank, POINT initCel, int action,
int distMax, int channel,
int firstIcon1, int lastIcon1,
int firstIcon2, int lastIcon2,
POINT &foundCel, int &foundIcon);
bool SearchOtherDrapeau(int rank, POINT initCel, int distMax,
POINT &foundCel, int &foundIcon);
bool SearchOtherBateau(int rank, POINT initCel, int distMax,
POINT &foundCel, int &foundIcon);
bool IsSpiderObject(int icon);
bool SearchSpiderObject(int rank, POINT initCel, int distMax,
POINT &foundCel, int &foundIcon);
bool IsTracksObject(int icon);
bool SearchTracksObject(int rank, POINT initCel, int distMax,
POINT &foundCel, int &foundIcon);
bool IsRobotObject(int icon);
bool SearchRobotObject(int rank, POINT initCel, int distMax,
POINT &foundCel, int &foundIcon,
int &foundAction);
bool IsBombeObject(int icon);
bool SearchBombeObject(int rank, POINT initCel, int distMax,
POINT &foundCel, int &foundIcon);
bool SearchElectroObject(int rank, POINT initCel, int distMax,
POINT &foundCel, int &foundIcon);
bool IsUsineBuild(int rank, POINT cel);
bool IsUsineFree(int rank, POINT cel);
bool IsFireCel(POINT cel);
bool IsVirusCel(POINT cel);
int IsBuildPont(POINT &cel, int &iconBuild);
bool IsBuildBateau(POINT cel, int &direct);
void InitDrapeau();
void AddDrapeau(POINT cel);
void SubDrapeau(POINT cel);
bool TestDrapeau(POINT cel);
// DecBlupi.cpp
void BlupiFlush();
int BlupiCreate(POINT cel, int action, int direct,
int perso, int energy);
bool BlupiDelete(POINT cel, int perso=-1);
void BlupiDelete(int rank);
void BlupiKill(int exRank, POINT cel, int type);
bool BlupiIfExist(int rank);
void BlupiCheat(int cheat);
void BlupiActualise(int rank);
void BlupiAdaptIcon(int rank);
void BlupiPushFog(int rank);
void BlupiSound(int rank, int sound, POINT pos, bool bStop=false);
void BlupiInitAction(int rank, int action, int direct=-1);
void BlupiChangeAction(int rank, int action, int direct=-1);
void ListFlush(int rank);
int ListGetParam(int rank, int button, POINT cel);
bool ListPut(int rank, int button, POINT cel, POINT cMem);
void ListRemove(int rank);
int ListSearch(int rank, int button, POINT cel, int &textForButton);
bool RepeatAdjust(int rank, int button, POINT &cel, POINT &cMem,
int param, int list);
void GoalStart(int rank, int action, POINT cel);
bool GoalNextPhase(int rank);
void SetTotalTime(int total);
int GetTotalTime();
void GoalInitJauge(int rank);
void GoalInitPassCel(int rank);
void GoalAdjustCel(int rank, int &x, int &y);
bool GoalNextOp(int rank, short *pTable);
void GoalUnwork(int rank);
void GoalStop(int rank, bool bError=false, bool bSound=true);
bool BlupiIsGoalUsed(POINT cel);
void BlupiStartStopRayon(int rank, POINT startCel, POINT endCel);
bool BlupiRotate(int rank);
bool BlupiNextAction(int rank);
void BlupiNextGoal(int rank);
void BlupiStep(bool bFirst);
void BlupiGetRect(int rank, RECT &rect);
int GetTargetBlupi(POINT pos);
void BlupiDeselect();
void BlupiDeselect(int rank);
void BlupiSetArrow(int rank, bool bArrow);
void InitOutlineRect();
void BlupiHiliDown(POINT pos, bool bAdd=false);
void BlupiHiliMove(POINT pos, bool bAdd=false);
void BlupiHiliUp(POINT pos, bool bAdd=false);
void BlupiDrawHili();
int GetDefButton(POINT cel);
bool BlupiGoal(int rank, int button, POINT cel, POINT cMem);
void BlupiGoal(POINT cel, int button);
void BlupiDestCel(int rank);
bool IsTracksHere(POINT cel, bool bSkipInMove);
bool IsBlupiHereEx(POINT cel1, POINT cel2, int exRank, bool bSkipInMove);
bool IsBlupiHereEx(POINT cel, int exRank, bool bSkipInMove);
bool IsBlupiHere(POINT cel, bool bSkipInMove);
bool IsBlupiHere(POINT cel, int direct, bool bSkipInMove);
void GetLevelJauge(int *pLevels, int *pTypes);
bool IsWorkBlupi(int rank);
void BlupiGetButtons(POINT pos, int &nb, int *pButtons, int *pErrors, int &perso);
void TerminatedInit();
int IsTerminated();
Term* GetTerminated();
// DecMove.cpp
void MoveFlush();
int MoveMaxFire();
void MoveFixInit();
bool MoveCreate(POINT cel, int rankBlupi, bool bFloor,
int channel, int icon,
int maskChannel, int maskIcon,
int total, int delai, int stepY,
bool bMisc=false, bool bNotIfExist=false);
bool MoveAddMoves(POINT cel, int rankMoves);
bool MoveAddIcons(POINT cel, int rankIcons, bool bContinue=false);
bool MoveStartFire(POINT cel);
void MoveProxiFire(POINT cel);
void MoveFire(int rank);
void MoveStep(bool bFirst);
void MoveFinish(POINT cel);
void MoveFinish(int rankBlupi);
bool MoveIsUsed(POINT cel);
bool MoveGetObject(POINT cel, int &channel, int &icon);
bool MovePutObject(POINT cel, int channel, int icon);
// DecIO.cpp
bool Write(int rank, bool bUser, int world, int time, int total);
bool Read(int rank, bool bUser, int &world, int &time, int &total);
bool FileExist(int rank, bool bUser, int &world, int &time, int &total);
void Flush();
// DecMap.cpp
void MapInitColors();
POINT ConvCelToMap(POINT cel);
POINT ConvMapToCel(POINT pos);
bool MapMove(POINT pos);
void MapPutCel(POINT pos);
bool GenerateMap();
// DecStat.cpp
void StatisticInit();
void StatisticUpdate();
int StatisticGetBlupi();
int StatisticGetFire();
void StatisticDraw();
void GenerateStatictic();
bool StatisticDown(POINT pos);
bool StatisticMove(POINT pos);
bool StatisticUp(POINT pos);
int StatisticDetect(POINT pos);
// Chemin.cpp
void CheminMemPos(int exRank);
bool CheminTestPos(POINT pos, int &rank);
int CheminARebours(int rank);
void CheminFillTerrain(int rank);
bool CheminTestDirection(int rank, int pos, int dir,
int &next, int &ampli,
int &cout, int &action);
bool CheminCherche(int rank, int &action);
bool IsCheminFree(int rank, POINT dest, int button);
// Decor.cpp
void SetShiftOffset(POINT offset);
POINT ConvCelToPos(POINT cel);
POINT ConvPosToCel(POINT pos, bool bMap=false);
POINT ConvPosToCel2(POINT pos);
void Create(HWND hWnd, CSound *pSound, CPixmap *pPixmap);
void Init(int channel, int icon);
void InitAfterBuild();
void ResetHili();
bool LoadImages();
void ClearFog();
void ClearFire();
void SetBuild(bool bBuild);
void EnableFog(bool bEnable);
bool GetInvincible();
void SetInvincible(bool bInvincible);
bool GetSuper();
void SetSuper(bool bSuper);
void FlipOutline();
bool PutFloor(POINT cel, int channel, int icon);
bool PutObject(POINT cel, int channel, int icon);
bool GetFloor(POINT cel, int &channel, int &icon);
bool GetObject(POINT cel, int &channel, int &icon);
bool SetFire(POINT cel, bool bFire);
void SetCoin(POINT coin, bool bCenter=false);
POINT GetCoin();
POINT GetHome();
void MemoPos(int rank, bool bRecord);
void SetTime(int time);
int GetTime();
void SetMusic(int music);
int GetMusic();
void SetSkill(int skill);
int GetSkill();
void SetRegion(int region);
int GetRegion();
void SetInfoMode(bool bInfo);
bool GetInfoMode();
void SetInfoHeight(int height);
int GetInfoHeight();
char* GetButtonExist();
void BuildPutBlupi();
void BuildMoveFloor(int x, int y, POINT pos, int rank);
void BuildMoveObject(int x, int y, POINT pos, int rank);
void BuildGround(RECT clip);
void Build(RECT clip, POINT posMouse);
void NextPhase(int mode);
int CountFloor(int channel, int icon);
int CelOkForAction(POINT cel, int action, int rank,
int icons[4][4],
POINT &celOutline1,
POINT &celOutline2);
int CelOkForAction(POINT cel, int action, int rank);
int GetHiliRankBlupi(int nb);
void CelHili(POINT pos, int action);
void CelHiliButton(POINT cel, int button);
void CelHiliRepeat(int list);
int GetResHili(POINT posMouse);
void HideTooltips(bool bHide);
void UndoOpen();
void UndoClose();
void UndoCopy();
void UndoBack();
bool IsUndo();
protected:
bool GetSeeBits(POINT cel, char *pBits, int index);
int GetSeeIcon(char *pBits, int index);
protected:
HWND m_hWnd;
CSound* m_pSound;
CPixmap* m_pPixmap;
Cellule* m_pUndoDecor;
Cellule m_decor[MAXCELX/2][MAXCELY/2];
short m_rankBlupi[MAXCELX][MAXCELY];
Blupi m_blupi[MAXBLUPI];
Move m_move[MAXMOVE];
POINT m_celCoin; // cellule sup/gauche
POINT m_celHome; // pour touche Home
POINT m_celHili;
POINT m_celOutline1;
POINT m_celOutline2;
POINT m_shiftOffset;
int m_iconHili[4][4];
int m_rankHili; // rang du blupi visé
bool m_bHiliRect;
POINT m_p1Hili; // coins rectangle de sélection
POINT m_p2Hili;
int m_shiftHili;
int m_nbBlupiHili; // nb de blupi sélectionnés
int m_rankBlupiHili; // rang blupi sélectionné
bool m_bFog; // true -> brouillard (jeu)
bool m_bBuild; // true -> construction
bool m_bInvincible; // true -> cheat code
bool m_bSuper; // true -> cheat code
Uint32 m_colors[100];
int m_time; // temps relatif global
int m_timeConst; // temps relatif global constant
int m_timeFlipOutline; // temps quand basculer mode outline
int m_totalTime; // temps total passé sur une partie
int m_phase; // phase pour la carte
POINT m_celArrow; // cellule avec flèche
bool m_bOutline;
bool m_bGroundRedraw;
char m_buttonExist[MAXBUTTON];
int m_statNb; // nb de statistiques
int m_statFirst; // première statistique visible
int m_bStatUp; // flèche up statistique
int m_bStatDown; // flèche down statistique
int m_statHili; // statistique survolée
bool m_bStatRecalc; // true -> recalcule les statistiques
bool m_bStatRedraw; // true -> redessine les statistiques
int m_nbStatHach; // nb de hachures
int m_nbStatHachBlupi; // hachures occupées par blupi
int m_nbStatHachPlanche;// hachures occupées par planches
int m_nbStatHachTomate; // hachures occupées par tomates
int m_nbStatHachMetal; // hachures occupées par métal
int m_nbStatHachRobot; // hachures occupées par robot
int m_nbStatHome; // nb de maisons
int m_nbStatHomeBlupi; // maisons occupées par blupi
int m_nbStatRobots; // nb d'ennemis
Term m_term; // conditions pour gagner
int m_winCount; // compteur avant gagné
int m_winLastHachBlupi; // dernier nombre atteint
int m_winLastHachPlanche;// dernier nombre atteint
int m_winLastHachTomate;// dernier nombre atteint
int m_winLastHachMetal; // dernier nombre atteint
int m_winLastHachRobot; // dernier nombre atteint
int m_winLastHome; // dernier nombre atteint
int m_winLastHomeBlupi; // dernier nombre atteint
int m_winLastRobots; // dernier nombre atteint
int m_music; // numéro musique
int m_region; // numéro région (*)
int m_lastRegion; // numéro dernière région
int m_blupiHere;
POINT m_lastDrapeau[MAXLASTDRAPEAU];
bool m_bHideTooltips; // true -> menu présent
char m_text[50];
POINT m_textLastPos;
int m_textCount;
int m_skill;
bool m_bInfo;
int m_infoHeight;
POINT m_memoPos[4];
BYTE m_cheminWork[MAXCELX*MAXCELY];
int m_cheminNbPos;
POINT m_cheminPos[MAXBLUPI*2];
int m_cheminRank[MAXBLUPI*2];
bool m_bFillFloor;
int m_fillSearchChannel;
int m_fillSearchIcon;
int m_fillPutChannel;
int m_fillPutIcon;
char* m_pFillMap;
};
// (*) Régions :
// 0 -> normal
// 1 -> palmier
// 2 -> hiver
// 3 -> sapin
/////////////////////////////////////////////////////////////////////////////
POINT GetCel (int x, int y);
POINT GetCel (POINT cel, int x, int y);
bool IsValid (POINT cel);
POINT GetVector (int direct);
extern int table_multi_goal[];
extern short table_actions[];